Merge "Forward CommunalContainer touches when hub mode closed" into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index b3e8ea8..20f879c 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -56,6 +56,7 @@
":android.credentials.flags-aconfig-java{.generated_srcjars}",
":android.view.contentprotection.flags-aconfig-java{.generated_srcjars}",
":com.android.server.flags.pinner-aconfig-java{.generated_srcjars}",
+ ":android.service.controls.flags-aconfig-java{.generated_srcjars}",
":android.service.voice.flags-aconfig-java{.generated_srcjars}",
":android.media.tv.flags-aconfig-java{.generated_srcjars}",
":android.service.autofill.flags-aconfig-java{.generated_srcjars}",
@@ -427,7 +428,10 @@
aconfig_declarations {
name: "com.android.media.flags.bettertogether-aconfig",
package: "com.android.media.flags",
- srcs: ["media/java/android/media/flags/media_better_together.aconfig"],
+ srcs: [
+ "media/java/android/media/flags/media_better_together.aconfig",
+ "media/java/android/media/flags/fade_manager_configuration.aconfig",
+ ],
}
java_aconfig_library {
@@ -598,6 +602,19 @@
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+// Controls
+aconfig_declarations {
+ name: "android.service.controls.flags-aconfig",
+ package: "android.service.controls.flags",
+ srcs: ["core/java/android/service/controls/flags/*.aconfig"],
+}
+
+java_aconfig_library {
+ name: "android.service.controls.flags-aconfig-java",
+ aconfig_declarations: "android.service.controls.flags-aconfig",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
// Voice
aconfig_declarations {
name: "android.service.voice.flags-aconfig",
diff --git a/Android.bp b/Android.bp
index c1fb41f..fa7c97d 100644
--- a/Android.bp
+++ b/Android.bp
@@ -95,7 +95,7 @@
":platform-compat-native-aidl",
// AIDL sources from external directories
- ":android.hardware.biometrics.common-V3-java-source",
+ ":android.hardware.biometrics.common-V4-java-source",
":android.hardware.biometrics.fingerprint-V3-java-source",
":android.hardware.gnss-V2-java-source",
":android.hardware.graphics.common-V3-java-source",
@@ -379,6 +379,7 @@
// system propagates "required" properly.
"gps_debug.conf",
"protolog.conf.json.gz",
+ "framework-res",
// any install dependencies should go into framework-minus-apex-install-dependencies
// rather than here to avoid bloating incremental build time
],
diff --git a/Ravenwood.bp b/Ravenwood.bp
index ca73378..03f3f0f 100644
--- a/Ravenwood.bp
+++ b/Ravenwood.bp
@@ -32,6 +32,8 @@
cmd: "$(location hoststubgen) " +
"@$(location ravenwood/ravenwood-standard-options.txt) " +
+ "--debug-log $(location hoststubgen_framework-minus-apex.log) " +
+
"--out-impl-jar $(location ravenwood.jar) " +
"--gen-keep-all-file $(location hoststubgen_keep_all.txt) " +
@@ -52,6 +54,8 @@
// Following files are created just as FYI.
"hoststubgen_keep_all.txt",
"hoststubgen_dump.txt",
+
+ "hoststubgen_framework-minus-apex.log",
],
visibility: ["//visibility:private"],
}
@@ -80,7 +84,7 @@
"junit",
"truth",
"ravenwood-junit-impl",
- "android.test.mock",
+ "android.test.mock.ravenwood",
],
}
diff --git a/apex/jobscheduler/framework/aconfig/job.aconfig b/apex/jobscheduler/framework/aconfig/job.aconfig
index f5e33a80..e73b434 100644
--- a/apex/jobscheduler/framework/aconfig/job.aconfig
+++ b/apex/jobscheduler/framework/aconfig/job.aconfig
@@ -1,6 +1,13 @@
package: "android.app.job"
flag {
+ name: "enforce_minimum_time_windows"
+ namespace: "backstage_power"
+ description: "Enforce a minimum time window for job latencies & deadlines"
+ bug: "311402873"
+}
+
+flag {
name: "job_debug_info_apis"
namespace: "backstage_power"
description: "Add APIs to let apps attach debug information to jobs"
diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 742ed5f..4bc7313 100644
--- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
@@ -23,6 +23,7 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.util.TimeUtils.formatDuration;
import android.annotation.BytesLong;
@@ -36,6 +37,7 @@
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledAfter;
import android.compat.annotation.EnabledSince;
+import android.compat.annotation.Overridable;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ClipData;
import android.content.ComponentName;
@@ -48,7 +50,9 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import android.os.Process;
import android.os.Trace;
+import android.os.UserHandle;
import android.util.ArraySet;
import android.util.Log;
@@ -113,6 +117,16 @@
@EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
public static final long REJECT_NEGATIVE_NETWORK_ESTIMATES = 253665015L;
+ /**
+ * Enforce a minimum time window between job latencies and deadlines.
+ *
+ * @hide
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ @Overridable // Aid in testing
+ public static final long ENFORCE_MINIMUM_TIME_WINDOWS = 311402873L;
+
/** @hide */
@IntDef(prefix = { "NETWORK_TYPE_" }, value = {
NETWORK_TYPE_NONE,
@@ -1866,10 +1880,40 @@
* Set deadline which is the maximum scheduling latency. The job will be run by this
* deadline even if other requirements (including a delay set through
* {@link #setMinimumLatency(long)}) are not met.
+ * {@link JobParameters#isOverrideDeadlineExpired()} will return {@code true} if the job's
+ * deadline has passed.
+ *
* <p>
* Because it doesn't make sense setting this property on a periodic job, doing so will
* throw an {@link java.lang.IllegalArgumentException} when
* {@link android.app.job.JobInfo.Builder#build()} is called.
+ *
+ * <p class="note">
+ * Since a job will run once the deadline has passed regardless of the status of other
+ * constraints, setting a deadline of 0 with other constraints makes those constraints
+ * meaningless when it comes to execution decisions. Avoid doing this.
+ * </p>
+ *
+ * <p>
+ * Short deadlines hinder the system's ability to optimize scheduling behavior and may
+ * result in running jobs at inopportune times. Therefore, starting in Android version
+ * {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM}, minimum time windows will be
+ * enforced to help make it easier to better optimize job execution. Time windows are
+ * defined as the time between a job's {@link #setMinimumLatency(long) minimum latency}
+ * and its deadline. If the minimum latency is not set, it is assumed to be 0.
+ * The following minimums will be enforced:
+ * <ul>
+ * <li>
+ * Jobs with {@link #PRIORITY_DEFAULT} or higher priorities have a minimum time
+ * window of one hour.
+ * </li>
+ * <li>Jobs with {@link #PRIORITY_LOW} have a minimum time window of 6 hours.</li>
+ * <li>Jobs with {@link #PRIORITY_MIN} have a minimum time window of 12 hours.</li>
+ * </ul>
+ *
+ * Work that must happen immediately should use {@link #setExpedited(boolean)} or
+ * {@link #setUserInitiated(boolean)} in the appropriate manner.
+ *
* @see JobInfo#getMaxExecutionDelayMillis()
*/
public Builder setOverrideDeadline(long maxExecutionDelayMillis) {
@@ -2143,12 +2187,14 @@
*/
public JobInfo build() {
return build(Compatibility.isChangeEnabled(DISALLOW_DEADLINES_FOR_PREFETCH_JOBS),
- Compatibility.isChangeEnabled(REJECT_NEGATIVE_NETWORK_ESTIMATES));
+ Compatibility.isChangeEnabled(REJECT_NEGATIVE_NETWORK_ESTIMATES),
+ Compatibility.isChangeEnabled(ENFORCE_MINIMUM_TIME_WINDOWS));
}
/** @hide */
public JobInfo build(boolean disallowPrefetchDeadlines,
- boolean rejectNegativeNetworkEstimates) {
+ boolean rejectNegativeNetworkEstimates,
+ boolean enforceMinimumTimeWindows) {
// This check doesn't need to be inside enforceValidity. It's an unnecessary legacy
// check that would ideally be phased out instead.
if (mBackoffPolicySet && (mConstraintFlags & CONSTRAINT_FLAG_DEVICE_IDLE) != 0) {
@@ -2157,7 +2203,8 @@
" setRequiresDeviceIdle is an error.");
}
JobInfo jobInfo = new JobInfo(this);
- jobInfo.enforceValidity(disallowPrefetchDeadlines, rejectNegativeNetworkEstimates);
+ jobInfo.enforceValidity(disallowPrefetchDeadlines, rejectNegativeNetworkEstimates,
+ enforceMinimumTimeWindows);
return jobInfo;
}
@@ -2176,7 +2223,8 @@
* @hide
*/
public final void enforceValidity(boolean disallowPrefetchDeadlines,
- boolean rejectNegativeNetworkEstimates) {
+ boolean rejectNegativeNetworkEstimates,
+ boolean enforceMinimumTimeWindows) {
// Check that network estimates require network type and are reasonable values.
if ((networkDownloadBytes > 0 || networkUploadBytes > 0 || minimumNetworkChunkBytes > 0)
&& networkRequest == null) {
@@ -2291,6 +2339,39 @@
throw new IllegalArgumentException("Invalid priority level provided: " + mPriority);
}
+ if (enforceMinimumTimeWindows
+ && Flags.enforceMinimumTimeWindows()
+ // TODO(312197030): remove exemption for the system
+ && !UserHandle.isCore(Process.myUid())
+ && hasLateConstraint && !isPeriodic) {
+ final long windowStart = hasEarlyConstraint ? minLatencyMillis : 0;
+ if (mPriority >= PRIORITY_DEFAULT) {
+ if (maxExecutionDelayMillis - windowStart < HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 1 hour."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ } else if (mPriority >= PRIORITY_LOW) {
+ if (maxExecutionDelayMillis - windowStart < 6 * HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 6 hours."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ } else {
+ if (maxExecutionDelayMillis - windowStart < 12 * HOUR_IN_MILLIS) {
+ throw new IllegalArgumentException(
+ getPriorityString(mPriority)
+ + " cannot have a time window less than 12 hours."
+ + " Delay=" + windowStart
+ + ", deadline=" + maxExecutionDelayMillis);
+ }
+ }
+ }
+
if (isExpedited) {
if (hasEarlyConstraint) {
throw new IllegalArgumentException("An expedited job cannot have a time delay");
diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig
index eb5502b..c65e506 100644
--- a/apex/jobscheduler/service/aconfig/job.aconfig
+++ b/apex/jobscheduler/service/aconfig/job.aconfig
@@ -5,4 +5,11 @@
namespace: "backstage_power"
description: "Only relax a prefetch job's connectivity constraint when the device is charging and battery is not low"
bug: "299329948"
+}
+
+flag {
+ name: "throw_on_unsupported_bias_usage"
+ namespace: "backstage_power"
+ description: "Throw an exception if an unsupported app uses JobInfo.setBias"
+ bug: "300477393"
}
\ No newline at end of file
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
index 1bd8da82..5a32a02 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -2163,6 +2163,8 @@
mActivityManagerInternal.getBootTimeTempAllowListDuration(),
TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
PowerExemptionManager.REASON_TIMEZONE_CHANGED, "");
+ mOptsTimeBroadcast.setDeliveryGroupPolicy(
+ BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
null /* receiverPermission */, mOptsTimeBroadcast.toBundle());
}
@@ -4608,6 +4610,8 @@
mActivityManagerInternal.getBootTimeTempAllowListDuration(),
TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED,
PowerExemptionManager.REASON_TIME_CHANGED, "");
+ mOptsTimeBroadcast.setDeliveryGroupPolicy(
+ BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
null /* receiverPermission */, mOptsTimeBroadcast.toBundle());
// The world has changed on us, so we need to re-evaluate alarms
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 07475b4..f97100b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -268,6 +268,7 @@
/** Master list of jobs. */
final JobStore mJobs;
private final CountDownLatch mJobStoreLoadedLatch;
+ private final CountDownLatch mStartControllerTrackingLatch;
/** Tracking the standby bucket state of each app */
final StandbyTracker mStandbyTracker;
/** Tracking amount of time each package runs for. */
@@ -2521,6 +2522,7 @@
mBatteryStateTracker.startTracking();
// Create the controllers.
+ mStartControllerTrackingLatch = new CountDownLatch(1);
mControllers = new ArrayList<StateController>();
mPrefetchController = new PrefetchController(this);
mControllers.add(mPrefetchController);
@@ -2552,6 +2554,8 @@
new TareController(this, backgroundJobsController, mConnectivityController);
mControllers.add(mTareController);
+ startControllerTrackingAsync();
+
mRestrictiveControllers = new ArrayList<>();
mRestrictiveControllers.add(batteryController);
mRestrictiveControllers.add(mConnectivityController);
@@ -2623,16 +2627,22 @@
public void onBootPhase(int phase) {
if (PHASE_LOCK_SETTINGS_READY == phase) {
// This is the last phase before PHASE_SYSTEM_SERVICES_READY. We need to ensure that
+ // controllers have started tracking and that
// persisted jobs are loaded before we can proceed to PHASE_SYSTEM_SERVICES_READY.
try {
+ mStartControllerTrackingLatch.await();
+ } catch (InterruptedException e) {
+ Slog.e(TAG, "Couldn't wait on controller tracking start latch");
+ }
+ try {
mJobStoreLoadedLatch.await();
} catch (InterruptedException e) {
Slog.e(TAG, "Couldn't wait on job store loading latch");
}
} else if (PHASE_SYSTEM_SERVICES_READY == phase) {
mConstantsObserver.start();
- for (StateController controller : mControllers) {
- controller.onSystemServicesReady();
+ for (int i = mControllers.size() - 1; i >= 0; --i) {
+ mControllers.get(i).onSystemServicesReady();
}
mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull(
@@ -2695,6 +2705,17 @@
}
}
+ private void startControllerTrackingAsync() {
+ mHandler.post(() -> {
+ synchronized (mLock) {
+ for (int i = mControllers.size() - 1; i >= 0; --i) {
+ mControllers.get(i).startTrackingLocked();
+ }
+ }
+ mStartControllerTrackingLatch.countDown();
+ });
+ }
+
/**
* Called when we have a job status object that we need to insert in our
* {@link com.android.server.job.JobStore}, and make sure all the relevant controllers know
@@ -4358,7 +4379,8 @@
private JobInfo enforceBuilderApiPermissions(int uid, int pid, JobInfo job) {
if (job.getBias() != JobInfo.BIAS_DEFAULT
&& !hasPermission(uid, pid, Manifest.permission.UPDATE_DEVICE_STATS)) {
- if (CompatChanges.isChangeEnabled(THROW_ON_UNSUPPORTED_BIAS_USAGE, uid)) {
+ if (CompatChanges.isChangeEnabled(THROW_ON_UNSUPPORTED_BIAS_USAGE, uid)
+ && Flags.throwOnUnsupportedBiasUsage()) {
throw new SecurityException("Apps may not call setBias()");
} else {
// We can't throw the exception. Log the issue and modify the job to remove
@@ -4366,7 +4388,7 @@
Slog.w(TAG, "Uid " + uid + " set bias on its job");
return new JobInfo.Builder(job)
.setBias(JobInfo.BIAS_DEFAULT)
- .build(false, false);
+ .build(false, false, false);
}
}
@@ -4388,7 +4410,9 @@
job.enforceValidity(
CompatChanges.isChangeEnabled(
JobInfo.DISALLOW_DEADLINES_FOR_PREFETCH_JOBS, callingUid),
- rejectNegativeNetworkEstimates);
+ rejectNegativeNetworkEstimates,
+ CompatChanges.isChangeEnabled(
+ JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS, callingUid));
if ((job.getFlags() & JobInfo.FLAG_WILL_BE_FOREGROUND) != 0) {
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.CONNECTIVITY_INTERNAL, TAG);
@@ -5175,6 +5199,12 @@
return mTareController;
}
+ @VisibleForTesting
+ protected void waitOnAsyncLoadingForTesting() throws Exception {
+ mStartControllerTrackingLatch.await();
+ // Ignore the job store loading for testing.
+ }
+
// Shell command infrastructure
int getJobState(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
int jobId) {
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 afcbdda..53b14d6 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java
@@ -1495,7 +1495,7 @@
// return value), the deadline is dropped. Periodic jobs require all constraints
// to be met, so there's no issue with their deadlines.
// The same logic applies for other target SDK-based validation checks.
- builtJob = jobBuilder.build(false, false);
+ builtJob = jobBuilder.build(false, false, false);
} catch (Exception e) {
Slog.w(TAG, "Unable to build job from XML, ignoring: " + jobBuilder.summarize(), e);
return null;
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
index 25b3421..cd3ba6b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java
@@ -73,6 +73,10 @@
LocalServices.getService(ActivityManagerInternal.class));
mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull(
LocalServices.getService(AppStateTracker.class));
+ }
+
+ @Override
+ public void startTrackingLocked() {
mAppStateTracker.addListener(mForceAppStandbyListener);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
index 5246f2b..ddbc2ec 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java
@@ -78,11 +78,15 @@
FlexibilityController flexibilityController) {
super(service);
mPowerTracker = new PowerTracker();
- mPowerTracker.startTracking();
mFlexibilityController = flexibilityController;
}
@Override
+ public void startTrackingLocked() {
+ mPowerTracker.startTracking();
+ }
+
+ @Override
public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) {
if (taskStatus.hasPowerConstraint()) {
final long nowElapsed = sElapsedRealtimeClock.millis();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
index b029e00..9d4cba1 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java
@@ -106,7 +106,10 @@
public ComponentController(JobSchedulerService service) {
super(service);
+ }
+ @Override
+ public void startTrackingLocked() {
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
index fed3c42..13a474cc 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java
@@ -201,6 +201,10 @@
mPercentToDropConstraints =
mFcConfig.DEFAULT_PERCENT_TO_DROP_FLEXIBLE_CONSTRAINTS;
mPrefetchController = prefetchController;
+ }
+
+ @Override
+ public void startTrackingLocked() {
if (mFlexibilityEnabled) {
mPrefetchController.registerPrefetchChangedListener(mPrefetchChangedListener);
}
@@ -369,8 +373,23 @@
@VisibleForTesting
@GuardedBy("mLock")
long getLifeCycleBeginningElapsedLocked(JobStatus js) {
+ long earliestRuntime = js.getEarliestRunTime() == JobStatus.NO_EARLIEST_RUNTIME
+ ? js.enqueueTime : js.getEarliestRunTime();
+ if (js.getJob().isPeriodic() && js.getNumPreviousAttempts() == 0) {
+ // Rescheduling periodic jobs (after a successful execution) may result in the job's
+ // start time being a little after the "true" periodic start time (to avoid jobs
+ // running back to back). See JobSchedulerService#getRescheduleJobForPeriodic for more
+ // details. Since rescheduled periodic jobs may already be delayed slightly by this
+ // policy, don't penalize them further by then enforcing the full set of applied
+ // flex constraints at the beginning of the newly determined start time. Let the flex
+ // constraint requirement start closer to the true periodic start time.
+ final long truePeriodicStartTimeElapsed =
+ js.getLatestRunTimeElapsed() - js.getJob().getFlexMillis();
+ // For now, treat the lifecycle beginning as the midpoint between the true periodic
+ // start time and the adjusted start time.
+ earliestRuntime = (earliestRuntime + truePeriodicStartTimeElapsed) / 2;
+ }
if (js.getJob().isPrefetch()) {
- final long earliestRuntime = Math.max(js.enqueueTime, js.getEarliestRunTime());
final long estimatedLaunchTime =
mPrefetchController.getNextEstimatedLaunchTimeLocked(js);
long prefetchWindowStart = mPrefetchLifeCycleStart.getOrDefault(
@@ -381,8 +400,7 @@
}
return Math.max(prefetchWindowStart, earliestRuntime);
}
- return js.getEarliestRunTime() == JobStatus.NO_EARLIEST_RUNTIME
- ? js.enqueueTime : js.getEarliestRunTime();
+ return earliestRuntime;
}
@VisibleForTesting
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
index 47d3fd5..adee322 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java
@@ -19,7 +19,6 @@
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import android.annotation.NonNull;
-import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.provider.DeviceConfig;
@@ -56,7 +55,7 @@
public IdleController(JobSchedulerService service,
FlexibilityController flexibilityController) {
super(service);
- initIdleStateTracking(mContext);
+ initIdleStateTracker();
mFlexibilityController = flexibilityController;
}
@@ -127,7 +126,7 @@
* Idle state tracking, and messaging with the task manager when
* significant state changes occur
*/
- private void initIdleStateTracking(Context ctx) {
+ private void initIdleStateTracker() {
final boolean isCar = mContext.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_AUTOMOTIVE);
if (isCar) {
@@ -135,7 +134,11 @@
} else {
mIdleTracker = new DeviceIdlenessTracker();
}
- mIdleTracker.startTracking(ctx, mService, this);
+ }
+
+ @Override
+ public void startTrackingLocked() {
+ mIdleTracker.startTracking(mContext, mService, this);
}
@Override
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 13bea6b..b7480649 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
@@ -636,7 +636,7 @@
.build());
// Don't perform validation checks at this point since we've already passed the
// initial validation check.
- job = builder.build(false, false);
+ job = builder.build(false, false, false);
}
this.job = job;
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
index fdeb072..865e541 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
@@ -134,7 +134,10 @@
mThresholdAlarmListener = new ThresholdAlarmListener(
mContext, AppSchedulingModuleThread.get().getLooper());
mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class);
+ }
+ @Override
+ public void startTrackingLocked() {
mUsageStatsManagerInternal
.registerLaunchTimeChangedListener(mEstimatedLaunchTimeChangedListener);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
index 44ac798..2b92051 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
@@ -56,6 +56,12 @@
}
/**
+ * Called to get the controller to start tracking relevant information. This is called before
+ * {@link #onSystemServicesReady()}.
+ */
+ public void startTrackingLocked() {}
+
+ /**
* Called when the system boot phase has reached
* {@link com.android.server.SystemService#PHASE_SYSTEM_SERVICES_READY}.
*/
@@ -67,6 +73,7 @@
* This logic is put here so the JobManager can be completely agnostic of Controller logic.
* Also called when updating a task, so implementing controllers have to be aware of
* preexisting tasks.
+ * This will never be called before {@link #onSystemServicesReady()}.
*/
public abstract void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob);
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
index 11e2ff7..0c48c4e5 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java
@@ -55,6 +55,10 @@
public StorageController(JobSchedulerService service) {
super(service);
mStorageTracker = new StorageTracker();
+ }
+
+ @Override
+ public void startTrackingLocked() {
mStorageTracker.startTracking();
}
diff --git a/core/api/current.txt b/core/api/current.txt
index 5b339fa..119a3de 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -9676,6 +9676,7 @@
method @Deprecated @NonNull public java.util.List<java.lang.String> getAssociations();
method @NonNull public java.util.List<android.companion.AssociationInfo> getMyAssociations();
method @Deprecated public boolean hasNotificationAccess(android.content.ComponentName);
+ method @FlaggedApi("android.companion.perm_sync_user_consent") public boolean isPermissionTransferUserConsented(int);
method public void requestNotificationAccess(android.content.ComponentName);
method @FlaggedApi("android.companion.association_tag") public void setAssociationTag(int, @NonNull String);
method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void startObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException;
@@ -12427,7 +12428,7 @@
method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback);
method public void registerSessionCallback(@NonNull android.content.pm.PackageInstaller.SessionCallback, @NonNull android.os.Handler);
method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void reportUnarchivalStatus(int, int, long, @Nullable android.app.PendingIntent) throws android.content.pm.PackageManager.NameNotFoundException;
- method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender, int) throws android.content.pm.PackageManager.NameNotFoundException;
method @FlaggedApi("android.content.pm.archiving") @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void requestUnarchive(@NonNull String, @NonNull android.content.IntentSender) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull String, @NonNull android.content.IntentSender);
method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void uninstall(@NonNull android.content.pm.VersionedPackage, @NonNull android.content.IntentSender);
@@ -12852,6 +12853,8 @@
field public static final int COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4; // 0x4
field public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3; // 0x3
field public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; // 0x1
+ field @FlaggedApi("android.content.pm.archiving") public static final int DELETE_ARCHIVE = 16; // 0x10
+ field @FlaggedApi("android.content.pm.archiving") public static final int DELETE_SHOW_DIALOG = 32; // 0x20
field public static final int DONT_KILL_APP = 1; // 0x1
field public static final String EXTRA_VERIFICATION_ID = "android.content.pm.extra.VERIFICATION_ID";
field public static final String EXTRA_VERIFICATION_RESULT = "android.content.pm.extra.VERIFICATION_RESULT";
@@ -19507,6 +19510,7 @@
field @Deprecated @NonNull public static final android.hardware.camera2.CaptureResult.Key<float[]> LENS_RADIAL_DISTORTION;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> LENS_STATE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.String> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID;
+ field @FlaggedApi("com.android.internal.camera.flags.concert_mode") @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Rect> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_SENSOR_CROP_REGION;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> NOISE_REDUCTION_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> REPROCESS_EFFECTIVE_EXPOSURE_FACTOR;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Byte> REQUEST_PIPELINE_DEPTH;
@@ -19532,6 +19536,7 @@
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_FACE_DETECT_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.graphics.Point[]> STATISTICS_HOT_PIXEL_MAP;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Boolean> STATISTICS_HOT_PIXEL_MAP_MODE;
+ field @FlaggedApi("com.android.internal.camera.flags.concert_mode") @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensIntrinsicsSample[]> STATISTICS_LENS_INTRINSICS_SAMPLES;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
field @NonNull public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
@@ -19688,6 +19693,12 @@
method public boolean isMultiResolution();
}
+ @FlaggedApi("com.android.internal.camera.flags.concert_mode") public final class LensIntrinsicsSample {
+ ctor @FlaggedApi("com.android.internal.camera.flags.concert_mode") public LensIntrinsicsSample(long, @NonNull float[]);
+ method @FlaggedApi("com.android.internal.camera.flags.concert_mode") @NonNull public float[] getLensIntrinsics();
+ method @FlaggedApi("com.android.internal.camera.flags.concert_mode") public long getTimestamp();
+ }
+
public final class LensShadingMap {
method public void copyGainFactors(float[], int);
method public int getColumnCount();
@@ -33204,6 +33215,7 @@
public static class PerformanceHintManager.Session implements java.io.Closeable {
method public void close();
method public void reportActualWorkDuration(long);
+ method @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public void reportActualWorkDuration(@NonNull android.os.WorkDuration);
method @FlaggedApi("android.os.adpf_prefer_power_efficiency") public void setPreferPowerEfficiency(boolean);
method public void setThreads(@NonNull int[]);
method public void updateTargetWorkDuration(long);
@@ -33553,6 +33565,7 @@
method public static boolean setCurrentTimeMillis(long);
method public static void sleep(long);
method public static long uptimeMillis();
+ method @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public static long uptimeNanos();
}
public class TestLooperManager {
@@ -33818,6 +33831,22 @@
method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibration, @Nullable android.os.VibrationAttributes);
}
+ @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public final class WorkDuration implements android.os.Parcelable {
+ ctor public WorkDuration();
+ ctor public WorkDuration(long, long, long, long);
+ method public int describeContents();
+ method public long getActualCpuDurationNanos();
+ method public long getActualGpuDurationNanos();
+ method public long getActualTotalDurationNanos();
+ method public long getWorkPeriodStartTimestampNanos();
+ method public void setActualCpuDurationNanos(long);
+ method public void setActualGpuDurationNanos(long);
+ method public void setActualTotalDurationNanos(long);
+ method public void setWorkPeriodStartTimestampNanos(long);
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.os.WorkDuration> CREATOR;
+ }
+
public class WorkSource implements android.os.Parcelable {
ctor public WorkSource();
ctor public WorkSource(android.os.WorkSource);
@@ -40108,6 +40137,9 @@
method public final boolean onUnbind(@NonNull android.content.Intent);
method public abstract void performControlAction(@NonNull String, @NonNull android.service.controls.actions.ControlAction, @NonNull java.util.function.Consumer<java.lang.Integer>);
method public static void requestAddControl(@NonNull android.content.Context, @NonNull android.content.ComponentName, @NonNull android.service.controls.Control);
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final int CONTROLS_SURFACE_ACTIVITY_PANEL = 0; // 0x0
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final int CONTROLS_SURFACE_DREAM = 1; // 0x1
+ field @FlaggedApi("android.service.controls.flags.home_panel_dream") public static final String EXTRA_CONTROLS_SURFACE = "android.service.controls.extra.CONTROLS_SURFACE";
field public static final String EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS = "android.service.controls.extra.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS";
field public static final String META_DATA_PANEL_ACTIVITY = "android.service.controls.META_DATA_PANEL_ACTIVITY";
field public static final String SERVICE_CONTROLS = "android.service.controls.ControlsProviderService";
@@ -43132,8 +43164,8 @@
field public static final String KEY_5G_NR_SSRSRQ_THRESHOLDS_INT_ARRAY = "5g_nr_ssrsrq_thresholds_int_array";
field public static final String KEY_5G_NR_SSSINR_THRESHOLDS_INT_ARRAY = "5g_nr_sssinr_thresholds_int_array";
field public static final String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
- field public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL = "additional_settings_caller_id_visibility_bool";
- field public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL = "additional_settings_call_waiting_visibility_bool";
+ field @FlaggedApi("com.android.internal.telephony.flags.show_call_id_and_call_waiting_in_additional_settings_menu") public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL = "additional_settings_caller_id_visibility_bool";
+ field @FlaggedApi("com.android.internal.telephony.flags.show_call_id_and_call_waiting_in_additional_settings_menu") public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL = "additional_settings_call_waiting_visibility_bool";
field public static final String KEY_ALLOW_ADDING_APNS_BOOL = "allow_adding_apns_bool";
field public static final String KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL = "allow_add_call_during_video_call";
field public static final String KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
@@ -47191,7 +47223,7 @@
method public void getSelectionPath(int, int, android.graphics.Path);
method public final float getSpacingAdd();
method public final float getSpacingMultiplier();
- method @FlaggedApi("com.android.text.flags.use_bounds_for_width") @NonNull public final CharSequence getText();
+ method @NonNull public final CharSequence getText();
method @FlaggedApi("com.android.text.flags.use_bounds_for_width") @NonNull public final android.text.TextDirectionHeuristic getTextDirectionHeuristic();
method public abstract int getTopPadding();
method @FlaggedApi("com.android.text.flags.use_bounds_for_width") public boolean getUseBoundsForWidth();
@@ -52050,6 +52082,7 @@
method public float getHandwritingBoundsOffsetLeft();
method public float getHandwritingBoundsOffsetRight();
method public float getHandwritingBoundsOffsetTop();
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public int getHandwritingDelegateFlags();
method @Nullable public Runnable getHandwritingDelegatorCallback();
method public final boolean getHasOverlappingRendering();
method public final int getHeight();
@@ -52423,6 +52456,7 @@
method public void setForegroundTintMode(@Nullable android.graphics.PorterDuff.Mode);
method @FlaggedApi("android.view.flags.view_velocity_api") public void setFrameContentVelocity(float);
method public void setHandwritingBoundsOffsets(float, float, float, float);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public void setHandwritingDelegateFlags(int);
method public void setHandwritingDelegatorCallback(@Nullable Runnable);
method public void setHapticFeedbackEnabled(boolean);
method public void setHasTransientState(boolean);
@@ -55678,6 +55712,7 @@
public final class InputMethodManager {
method public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View);
method public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View, @NonNull String);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public boolean acceptStylusHandwritingDelegation(@NonNull android.view.View, @NonNull String, int);
method public void dispatchKeyEventFromInputMethod(@Nullable android.view.View, @NonNull android.view.KeyEvent);
method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]);
method @Nullable public android.view.inputmethod.InputMethodInfo getCurrentInputMethodInfo();
@@ -55725,6 +55760,7 @@
method public void updateExtractedText(android.view.View, int, android.view.inputmethod.ExtractedText);
method public void updateSelection(android.view.View, int, int, int, int);
method @Deprecated public void viewClicked(android.view.View);
+ field @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public static final int HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED = 1; // 0x1
field public static final int HIDE_IMPLICIT_ONLY = 1; // 0x1
field public static final int HIDE_NOT_ALWAYS = 2; // 0x2
field public static final int RESULT_HIDDEN = 3; // 0x3
@@ -59542,6 +59578,7 @@
method public void setOnClickFillInIntent(@IdRes int, android.content.Intent);
method public void setOnClickPendingIntent(@IdRes int, android.app.PendingIntent);
method public void setOnClickResponse(@IdRes int, @NonNull android.widget.RemoteViews.RemoteResponse);
+ method @FlaggedApi("android.view.inputmethod.home_screen_handwriting_delegator") public void setOnStylusHandwritingPendingIntent(@IdRes int, @Nullable android.app.PendingIntent);
method public void setPendingIntentTemplate(@IdRes int, android.app.PendingIntent);
method public void setProgressBar(@IdRes int, int, int, boolean);
method public void setRadioGroupChecked(@IdRes int, @IdRes int);
diff --git a/core/api/module-lib-lint-baseline.txt b/core/api/module-lib-lint-baseline.txt
index e49d6e3..a6a948c 100644
--- a/core/api/module-lib-lint-baseline.txt
+++ b/core/api/module-lib-lint-baseline.txt
@@ -1745,6 +1745,10 @@
SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnMediaKeyListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SamShouldBeLast: android.media.session.MediaSessionManager#setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, android.os.Handler):
SAM-compatible parameters (such as parameter 1, "listener", in android.media.session.MediaSessionManager.setOnVolumeKeyLongPressListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
+SamShouldBeLast: android.view.accessibility.AccessibilityManager#addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener, android.os.Handler):
+ SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addAccessibilityStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
+SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, android.os.Handler):
+ SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addTouchExplorationStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions
SdkConstant: android.content.Intent#ACTION_BATTERY_LEVEL_CHANGED:
diff --git a/core/api/removed.txt b/core/api/removed.txt
index b7714f1..12b1f6a 100644
--- a/core/api/removed.txt
+++ b/core/api/removed.txt
@@ -30,20 +30,6 @@
}
-package android.app.usage {
-
- public class StorageStatsManager {
- method @Deprecated public long getFreeBytes(String) throws java.io.IOException;
- method @Deprecated public long getTotalBytes(String) throws java.io.IOException;
- method @Deprecated public boolean isQuotaSupported(String);
- method @Deprecated public android.app.usage.ExternalStorageStats queryExternalStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForPackage(String, String, android.os.UserHandle) throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForUid(String, int) throws java.io.IOException;
- method @Deprecated public android.app.usage.StorageStats queryStatsForUser(String, android.os.UserHandle) throws java.io.IOException;
- }
-
-}
-
package android.content {
public abstract class ContentProvider implements android.content.ComponentCallbacks2 {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 0497c60..30d57bb 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -351,6 +351,7 @@
field public static final String SET_VOLUME_KEY_LONG_PRESS_LISTENER = "android.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER";
field public static final String SET_WALLPAPER_COMPONENT = "android.permission.SET_WALLPAPER_COMPONENT";
field public static final String SET_WALLPAPER_DIM_AMOUNT = "android.permission.SET_WALLPAPER_DIM_AMOUNT";
+ field @FlaggedApi("android.service.chooser.support_nfc_resolver") public static final String SHOW_CUSTOMIZED_RESOLVER = "android.permission.SHOW_CUSTOMIZED_RESOLVER";
field public static final String SHOW_KEYGUARD_MESSAGE = "android.permission.SHOW_KEYGUARD_MESSAGE";
field public static final String SHUTDOWN = "android.permission.SHUTDOWN";
field public static final String SIGNAL_REBOOT_READINESS = "android.permission.SIGNAL_REBOOT_READINESS";
@@ -3872,6 +3873,7 @@
field public static final int DATA_LOADER_TYPE_STREAMING = 1; // 0x1
field public static final String EXTRA_CALLBACK = "android.content.pm.extra.CALLBACK";
field public static final String EXTRA_DATA_LOADER_TYPE = "android.content.pm.extra.DATA_LOADER_TYPE";
+ field @FlaggedApi("android.content.pm.archiving") public static final String EXTRA_DELETE_FLAGS = "android.content.pm.extra.DELETE_FLAGS";
field public static final String EXTRA_LEGACY_STATUS = "android.content.pm.extra.LEGACY_STATUS";
field @Deprecated public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH";
field public static final int LOCATION_DATA_APP = 0; // 0x0
@@ -10555,6 +10557,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.PersistableBundle getSeedAccountOptions();
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public String getSeedAccountType();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public long[] getSerialNumbersOfUsers(boolean);
+ method @NonNull public android.graphics.drawable.Drawable getUserBadge();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public java.util.List<android.os.UserHandle> getUserHandles(boolean);
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.GET_ACCOUNTS_PRIVILEGED}) public android.graphics.Bitmap getUserIcon();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public android.content.pm.UserProperties getUserProperties(@NonNull android.os.UserHandle);
@@ -11781,6 +11784,14 @@
}
+package android.service.chooser {
+
+ @FlaggedApi("android.service.chooser.support_nfc_resolver") public class CustomChoosers {
+ method @FlaggedApi("android.service.chooser.support_nfc_resolver") @NonNull public static android.content.Intent createNfcResolverIntent(@NonNull android.content.Intent, @Nullable CharSequence, @NonNull java.util.List<android.content.pm.ResolveInfo>);
+ }
+
+}
+
package android.service.cloudsearch {
public abstract class CloudSearchService extends android.app.Service {
@@ -12787,6 +12798,7 @@
field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_ON_TRAINING_DATA_EGRESS_LIMIT_EXCEEDED = 8; // 0x8
field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION = 9; // 0x9
field public static final int ERROR_CODE_REMOTE_EXCEPTION = 7; // 0x7
+ field @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds") public static final int ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED = 10; // 0xa
field public static final int ERROR_CODE_UNKNOWN = 0; // 0x0
}
@@ -16140,8 +16152,10 @@
public interface RegistrationManager {
field public static final int SUGGESTED_ACTION_NONE = 0; // 0x0
+ field @FlaggedApi("com.android.internal.telephony.flags.add_rat_related_suggested_action_to_ims_registration") public static final int SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK = 4; // 0x4
field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK = 1; // 0x1
field public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2; // 0x2
+ field @FlaggedApi("com.android.internal.telephony.flags.add_rat_related_suggested_action_to_ims_registration") public static final int SUGGESTED_ACTION_TRIGGER_RAT_BLOCK = 3; // 0x3
}
public static class RegistrationManager.RegistrationCallback {
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 00432dc..c52d27ea 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -971,6 +971,7 @@
private final ActivityManager.TaskDescription mTaskDescription =
new ActivityManager.TaskDescription();
+ private int mLastTaskDescriptionHashCode;
protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused};
@@ -7612,6 +7613,13 @@
mTaskDescription.setIcon(Icon.createWithBitmap(icon));
}
}
+ if (mLastTaskDescriptionHashCode == mTaskDescription.hashCode()) {
+ // Early return if the hashCode is the same.
+ // Note that we do not use #equals() to perform the check because there are several
+ // places in this class that directly sets the value to mTaskDescription.
+ return;
+ }
+ mLastTaskDescriptionHashCode = mTaskDescription.hashCode();
ActivityClient.getInstance().setTaskDescription(mToken, mTaskDescription);
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 854e121..6b7f4880 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -2309,6 +2309,32 @@
}
@Override
+ public int hashCode() {
+ int result = 17;
+ if (mLabel != null) {
+ result = result * 31 + mLabel.hashCode();
+ }
+ if (mIcon != null) {
+ result = result * 31 + mIcon.hashCode();
+ }
+ if (mIconFilename != null) {
+ result = result * 31 + mIconFilename.hashCode();
+ }
+ result = result * 31 + mColorPrimary;
+ result = result * 31 + mColorBackground;
+ result = result * 31 + mColorBackgroundFloating;
+ result = result * 31 + mStatusBarColor;
+ result = result * 31 + mNavigationBarColor;
+ result = result * 31 + mStatusBarAppearance;
+ result = result * 31 + (mEnsureStatusBarContrastWhenTransparent ? 1 : 0);
+ result = result * 31 + (mEnsureNavigationBarContrastWhenTransparent ? 1 : 0);
+ result = result * 31 + mResizeMode;
+ result = result * 31 + mMinWidth;
+ result = result * 31 + mMinHeight;
+ return result;
+ }
+
+ @Override
public boolean equals(@Nullable Object obj) {
if (!(obj instanceof TaskDescription)) {
return false;
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 32c40df..ea9bb39 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -46,7 +46,6 @@
import android.os.WorkSource;
import android.util.ArraySet;
import android.util.Pair;
-import android.util.StatsEvent;
import com.android.internal.os.TimeoutRecord;
@@ -1224,7 +1223,8 @@
* @return The stats event for the cached apps high watermark since last pull.
*/
@NonNull
- public abstract StatsEvent getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull);
+ // TODO: restore to android.util.StatsEvent once Ravenwood includes Mainline stubs
+ public abstract Object getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull);
/**
* Internal method for clearing app data, with the extra param that is used to indicate restore.
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index c5e132f..aec0427 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2391,12 +2391,9 @@
OP_ACTIVITY_RECOGNITION,
// Aural
OP_READ_MEDIA_AUDIO,
- OP_WRITE_MEDIA_AUDIO,
// Visual
OP_READ_MEDIA_VIDEO,
- OP_WRITE_MEDIA_VIDEO,
OP_READ_MEDIA_IMAGES,
- OP_WRITE_MEDIA_IMAGES,
OP_READ_MEDIA_VISUAL_USER_SELECTED,
// Nearby devices
OP_BLUETOOTH_SCAN,
diff --git a/core/java/android/app/Person.java b/core/java/android/app/Person.java
index 18fc0ce..041866001 100644
--- a/core/java/android/app/Person.java
+++ b/core/java/android/app/Person.java
@@ -189,6 +189,11 @@
*/
public void visitUris(@NonNull Consumer<Uri> visitor) {
visitor.accept(getIconUri());
+ if (Flags.visitRiskyUris()) {
+ if (mUri != null && !mUri.isEmpty()) {
+ visitor.accept(Uri.parse(mUri));
+ }
+ }
}
/** Builder for the immutable {@link Person} class. */
diff --git a/core/java/android/app/time/TEST_MAPPING b/core/java/android/app/time/TEST_MAPPING
index 0f7a070..7673aca 100644
--- a/core/java/android/app/time/TEST_MAPPING
+++ b/core/java/android/app/time/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/timedetector/TEST_MAPPING b/core/java/android/app/timedetector/TEST_MAPPING
index 43dd82f..c7ca6a2 100644
--- a/core/java/android/app/timedetector/TEST_MAPPING
+++ b/core/java/android/app/timedetector/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/timezonedetector/TEST_MAPPING b/core/java/android/app/timezonedetector/TEST_MAPPING
index 2be5614..c8d0bb2 100644
--- a/core/java/android/app/timezonedetector/TEST_MAPPING
+++ b/core/java/android/app/timezonedetector/TEST_MAPPING
@@ -15,10 +15,7 @@
"exclude-annotation": "androidx.test.filters.FlakyTest"
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "FrameworksTimeServicesTests",
"options": [
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 1ef1563..a4b1753 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -35,8 +35,6 @@
import android.os.storage.CrateInfo;
import android.os.storage.StorageManager;
-import com.android.internal.util.Preconditions;
-
import java.io.File;
import java.io.IOException;
import java.util.Collection;
@@ -77,7 +75,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public boolean isQuotaSupported(String uuid) {
return isQuotaSupported(convert(uuid));
@@ -120,7 +118,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public long getTotalBytes(String uuid) throws IOException {
return getTotalBytes(convert(uuid));
@@ -152,7 +150,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public long getFreeBytes(String uuid) throws IOException {
return getFreeBytes(convert(uuid));
@@ -221,7 +219,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForPackage(String uuid, String packageName,
UserHandle user) throws PackageManager.NameNotFoundException, IOException {
@@ -262,7 +260,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForUid(String uuid, int uid) throws IOException {
return queryStatsForUid(convert(uuid), uid);
@@ -300,7 +298,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public StorageStats queryStatsForUser(String uuid, UserHandle user) throws IOException {
return queryStatsForUser(convert(uuid), user);
@@ -337,7 +335,7 @@
}
}
- /** @removed */
+ /** {@hide} */
@Deprecated
public ExternalStorageStats queryExternalStatsForUser(String uuid, UserHandle user)
throws IOException {
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index e0ce917..e4a03c5 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -1358,6 +1358,36 @@
}
/**
+ * Return the current state of consent for permission transfer for the association.
+ * True if the user has allowed permission transfer for the association, false otherwise.
+ *
+ * <p>
+ * Note: The initial user consent is collected via
+ * {@link #buildPermissionTransferUserConsentIntent(int) a permission transfer user consent dialog}.
+ * After the user has made their initial selection, they can toggle the permission transfer
+ * feature in the settings.
+ * This method always returns the state of the toggle setting.
+ * </p>
+ *
+ * @param associationId The unique {@link AssociationInfo#getId ID} assigned to the association
+ * of the companion device recorded by CompanionDeviceManager
+ * @return True if the user has consented to the permission transfer, or false otherwise.
+ * @throws DeviceNotAssociatedException Exception if the companion device is not associated with
+ * the user or the calling app.
+ */
+ @UserHandleAware
+ @FlaggedApi(Flags.FLAG_PERM_SYNC_USER_CONSENT)
+ public boolean isPermissionTransferUserConsented(int associationId) {
+ try {
+ return mService.isPermissionTransferUserConsented(mContext.getOpPackageName(),
+ mContext.getUserId(), associationId);
+ } catch (RemoteException e) {
+ ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Start system data transfer which has been previously approved by the user.
*
* <p>Before calling this method, the app needs to make sure there's a communication channel
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index c5a1988..22689f3 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -97,6 +97,8 @@
PendingIntent buildPermissionTransferUserConsentIntent(String callingPackage, int userId,
int associationId);
+ boolean isPermissionTransferUserConsented(String callingPackage, int userId, int associationId);
+
void startSystemDataTransfer(String packageName, int userId, int associationId,
in ISystemDataTransferCallback callback);
diff --git a/core/java/android/companion/flags.aconfig b/core/java/android/companion/flags.aconfig
index 6e33dff..9e410b8 100644
--- a/core/java/android/companion/flags.aconfig
+++ b/core/java/android/companion/flags.aconfig
@@ -27,3 +27,10 @@
description: "Enable device presence APIs"
bug: "283000075"
}
+
+flag {
+ name: "perm_sync_user_consent"
+ namespace: "companion"
+ description: "Expose perm sync user consent API"
+ bug: "309528663"
+}
\ No newline at end of file
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
index 9492a62..003dffb 100644
--- a/core/java/android/companion/virtual/VirtualDeviceInternal.java
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -346,7 +346,8 @@
VirtualCamera createVirtualCamera(@NonNull VirtualCameraConfig config) {
try {
mVirtualDevice.registerVirtualCamera(config);
- return new VirtualCamera(mVirtualDevice, config);
+ return new VirtualCamera(mVirtualDevice,
+ Integer.toString(mVirtualDevice.getVirtualCameraId(config)), config);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/companion/virtual/camera/VirtualCamera.java b/core/java/android/companion/virtual/camera/VirtualCamera.java
index 52afa4e..9d6c14b 100644
--- a/core/java/android/companion/virtual/camera/VirtualCamera.java
+++ b/core/java/android/companion/virtual/camera/VirtualCamera.java
@@ -54,6 +54,8 @@
public final class VirtualCamera implements Closeable {
private final IVirtualDevice mVirtualDevice;
+
+ private final String mCameraId;
private final VirtualCameraConfig mConfig;
/**
@@ -63,10 +65,12 @@
* @param config Configuration for the new virtual camera
* @hide
*/
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public VirtualCamera(
- @NonNull IVirtualDevice virtualDevice, @NonNull VirtualCameraConfig config) {
+ @NonNull IVirtualDevice virtualDevice,
+ @NonNull String cameraId,
+ @NonNull VirtualCameraConfig config) {
mVirtualDevice = Objects.requireNonNull(virtualDevice);
+ mCameraId = Objects.requireNonNull(cameraId);
mConfig = Objects.requireNonNull(config);
}
@@ -80,14 +84,9 @@
* Returns the id of this virtual camera instance.
* @hide
*/
- @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
@NonNull
public String getId() {
- try {
- return Integer.toString(mVirtualDevice.getVirtualCameraId(mConfig));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return mCameraId;
}
@Override
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index 4327c7a..0a8029c 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -71,6 +71,7 @@
* another Context. Can be subclassed to modify behavior without changing
* the original Context.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ContextWrapper extends Context {
@UnsupportedAppUsage
Context mBase;
@@ -1430,6 +1431,7 @@
* @throws IllegalStateException if this method calls before {@link #attachBaseContext(Context)}
*/
@Override
+ @android.ravenwood.annotation.RavenwoodThrow
public void registerComponentCallbacks(ComponentCallbacks callback) {
if (mBase != null) {
mBase.registerComponentCallbacks(callback);
@@ -1464,6 +1466,7 @@
* @throws IllegalStateException if this method calls before {@link #attachBaseContext(Context)}
*/
@Override
+ @android.ravenwood.annotation.RavenwoodThrow
public void unregisterComponentCallbacks(ComponentCallbacks callback) {
// It usually means the ComponentCallbacks is registered before this ContextWrapper attaches
// to a base Context and Application is targeting prior to S-v2. We should unregister the
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl
index 1f25fd0..32ecb58 100644
--- a/core/java/android/content/pm/IPackageInstaller.aidl
+++ b/core/java/android/content/pm/IPackageInstaller.aidl
@@ -80,7 +80,7 @@
long timeout);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES,android.Manifest.permission.REQUEST_DELETE_PACKAGES})")
- void requestArchive(String packageName, String callerPackageName, in IntentSender statusReceiver, in UserHandle userHandle);
+ void requestArchive(String packageName, String callerPackageName, in IntentSender statusReceiver, in UserHandle userHandle, int flags);
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES,android.Manifest.permission.REQUEST_INSTALL_PACKAGES})")
void requestUnarchive(String packageName, String callerPackageName, in IntentSender statusReceiver, in UserHandle userHandle);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index d35c392..457fd63 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -323,6 +323,14 @@
*/
@SystemApi
public static final String EXTRA_CALLBACK = "android.content.pm.extra.CALLBACK";
+ /**
+ * Key for passing extra delete flags during archiving.
+ *
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
+ public static final String EXTRA_DELETE_FLAGS = "android.content.pm.extra.DELETE_FLAGS";
/**
* Type of DataLoader for this session. Will be one of
@@ -2330,6 +2338,7 @@
* communicated.
*
* @param statusReceiver Callback used to notify when the operation is completed.
+ * @param flags Flags for archiving. Can be 0 or {@link PackageManager#DELETE_SHOW_DIALOG}.
* @throws PackageManager.NameNotFoundException If {@code packageName} isn't found or not
* available to the caller or isn't archived.
*/
@@ -2337,11 +2346,12 @@
Manifest.permission.DELETE_PACKAGES,
Manifest.permission.REQUEST_DELETE_PACKAGES})
@FlaggedApi(Flags.FLAG_ARCHIVING)
- public void requestArchive(@NonNull String packageName, @NonNull IntentSender statusReceiver)
+ public void requestArchive(@NonNull String packageName, @NonNull IntentSender statusReceiver,
+ @DeleteFlags int flags)
throws PackageManager.NameNotFoundException {
try {
mInstaller.requestArchive(packageName, mInstallerPackageName, statusReceiver,
- new UserHandle(mUserId));
+ new UserHandle(mUserId), flags);
} catch (ParcelableException e) {
e.maybeRethrow(PackageManager.NameNotFoundException.class);
} catch (RemoteException e) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index a22fe3f..7bb673a 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2552,6 +2552,7 @@
DELETE_SYSTEM_APP,
DELETE_DONT_KILL_APP,
DELETE_CHATTY,
+ DELETE_SHOW_DIALOG,
})
@Retention(RetentionPolicy.SOURCE)
public @interface DeleteFlags {}
@@ -2595,15 +2596,21 @@
public static final int DELETE_DONT_KILL_APP = 0x00000008;
/**
- * Flag parameter for {@link #deletePackage} to indicate that the deletion is an archival. This
+ * Flag parameter for {@link PackageInstaller#uninstall(VersionedPackage, int, IntentSender)} to
+ * indicate that the deletion is an archival. This
* flag is only for internal usage as part of
- * {@link PackageInstaller#requestArchive(String, IntentSender)}.
- *
- * @hide
+ * {@link PackageInstaller#requestArchive}.
*/
+ @FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
public static final int DELETE_ARCHIVE = 0x00000010;
/**
+ * Show a confirmation dialog to the user when app is being deleted.
+ */
+ @FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
+ public static final int DELETE_SHOW_DIALOG = 0x00000020;
+
+ /**
* Flag parameter for {@link #deletePackage} to indicate that package deletion
* should be chatty.
*
@@ -8964,7 +8971,7 @@
* Returns true if an app is archivable.
*
* @throws NameNotFoundException if the given package name is not available to the caller.
- * @see PackageInstaller#requestArchive(String, IntentSender)
+ * @see PackageInstaller#requestArchive
*/
@FlaggedApi(android.content.pm.Flags.FLAG_ARCHIVING)
public boolean isAppArchivable(@NonNull String packageName) throws NameNotFoundException {
diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig
index d21b818..1b90570 100644
--- a/core/java/android/content/pm/flags.aconfig
+++ b/core/java/android/content/pm/flags.aconfig
@@ -101,3 +101,10 @@
description: "Feature flag to enable the refactored Package Installer app with updated UI."
bug: "182205982"
}
+
+flag {
+ name: "improve_install_dont_kill"
+ namespace: "package_manager_service"
+ description: "Feature flag to reduce app crashes caused by split installs with INSTALL_DONT_KILL"
+ bug: "291212866"
+}
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 12ab0f6..35f295a 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -5226,6 +5226,60 @@
new Key<android.hardware.camera2.params.OisSample[]>("android.statistics.oisSamples", android.hardware.camera2.params.OisSample[].class);
/**
+ * <p>An array of intra-frame lens intrinsic samples.</p>
+ * <p>Contains an array of intra-frame {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration} updates. This must
+ * not be confused or compared to {@link CaptureResult#STATISTICS_OIS_SAMPLES android.statistics.oisSamples}. Although OIS could be the
+ * main driver, all relevant factors such as focus distance and optical zoom must also
+ * be included. Do note that OIS samples must not be applied on top of the lens intrinsic
+ * samples.
+ * Support for this capture result can be queried via
+ * {@link android.hardware.camera2.CameraCharacteristics#getAvailableCaptureResultKeys }.
+ * If available, clients can expect multiple samples per capture result. The specific
+ * amount will depend on current frame duration and sampling rate. Generally a sampling rate
+ * greater than or equal to 200Hz is considered sufficient for high quality results.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @see CaptureResult#STATISTICS_OIS_SAMPLES
+ */
+ @PublicKey
+ @NonNull
+ @SyntheticKey
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public static final Key<android.hardware.camera2.params.LensIntrinsicsSample[]> STATISTICS_LENS_INTRINSICS_SAMPLES =
+ new Key<android.hardware.camera2.params.LensIntrinsicsSample[]>("android.statistics.lensIntrinsicsSamples", android.hardware.camera2.params.LensIntrinsicsSample[].class);
+
+ /**
+ * <p>An array of timestamps of lens intrinsics samples, in nanoseconds.</p>
+ * <p>The array contains the timestamps of lens intrinsics samples. The timestamps are in the
+ * same timebase as and comparable to {@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p>
+ * <p><b>Units</b>: nanoseconds</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CaptureResult#SENSOR_TIMESTAMP
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public static final Key<long[]> STATISTICS_LENS_INTRINSIC_TIMESTAMPS =
+ new Key<long[]>("android.statistics.lensIntrinsicTimestamps", long[].class);
+
+ /**
+ * <p>An array of intra-frame lens intrinsics.</p>
+ * <p>The data layout and contents of individual array entries matches with
+ * {@link CameraCharacteristics#LENS_INTRINSIC_CALIBRATION android.lens.intrinsicCalibration}.</p>
+ * <p><b>Units</b>:
+ * Pixels in the {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} coordinate system.</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CameraCharacteristics#LENS_INTRINSIC_CALIBRATION
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public static final Key<float[]> STATISTICS_LENS_INTRINSIC_SAMPLES =
+ new Key<float[]>("android.statistics.lensIntrinsicSamples", float[].class);
+
+ /**
* <p>Tonemapping / contrast / gamma curve for the blue
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
@@ -5668,6 +5722,55 @@
new Key<String>("android.logicalMultiCamera.activePhysicalId", String.class);
/**
+ * <p>The current region of the active physical sensor that will be read out for this
+ * capture.</p>
+ * <p>This capture result matches with {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} on non-logical single
+ * camera sensor devices. In case of logical cameras that can switch between several
+ * physical devices in response to {@link CaptureRequest#CONTROL_ZOOM_RATIO android.control.zoomRatio}, this capture result will
+ * not behave like {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} and {@link CaptureRequest#CONTROL_ZOOM_RATIO android.control.zoomRatio}, where the
+ * combination of both reflects the effective zoom and crop of the logical camera output.
+ * Instead, this capture result value will describe the zoom and crop of the active physical
+ * device. Some examples of when the value of this capture result will change include
+ * switches between different physical lenses, switches between regular and maximum
+ * resolution pixel mode and going through the device digital or optical range.
+ * This capture result is similar to {@link CaptureRequest#SCALER_CROP_REGION android.scaler.cropRegion} with respect to distortion
+ * correction. When the distortion correction mode is OFF, the coordinate system follows
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize}, with (0, 0) being the top-left pixel
+ * of the pre-correction active array. When the distortion correction mode is not OFF,
+ * the coordinate system follows {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}, with (0, 0) being
+ * the top-left pixel of the active array.</p>
+ * <p>For camera devices with the
+ * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR }
+ * capability or devices where {@link CameraCharacteristics#getAvailableCaptureRequestKeys }
+ * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}
+ * , the current active physical device
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} /
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the
+ * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to
+ * {@link android.hardware.camera2.CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION }.</p>
+ * <p><b>Units</b>: Pixel coordinates relative to
+ * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize} or
+ * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE android.sensor.info.preCorrectionActiveArraySize} of the currently
+ * {@link CaptureResult#LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID android.logicalMultiCamera.activePhysicalId} depending on distortion correction capability
+ * and mode</p>
+ * <p><b>Optional</b> - The value for this key may be {@code null} on some devices.</p>
+ *
+ * @see CaptureRequest#CONTROL_ZOOM_RATIO
+ * @see CaptureResult#LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
+ * @see CaptureRequest#SCALER_CROP_REGION
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE
+ * @see CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION
+ * @see CaptureRequest#SENSOR_PIXEL_MODE
+ */
+ @PublicKey
+ @NonNull
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public static final Key<android.graphics.Rect> LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_SENSOR_CROP_REGION =
+ new Key<android.graphics.Rect>("android.logicalMultiCamera.activePhysicalSensorCropRegion", android.graphics.Rect.class);
+
+ /**
* <p>Mode of operation for the lens distortion correction block.</p>
* <p>The lens distortion correction block attempts to improve image quality by fixing
* radial, tangential, or other geometric aberrations in the camera device's optics. If
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 9743c1f..3affb73 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -55,6 +55,7 @@
import android.hardware.camera2.params.DynamicRangeProfiles;
import android.hardware.camera2.params.Face;
import android.hardware.camera2.params.HighSpeedVideoConfiguration;
+import android.hardware.camera2.params.LensIntrinsicsSample;
import android.hardware.camera2.params.LensShadingMap;
import android.hardware.camera2.params.MandatoryStreamCombination;
import android.hardware.camera2.params.MultiResolutionStreamConfigurationMap;
@@ -849,6 +850,15 @@
return (T) metadata.getMultiResolutionStreamConfigurationMap();
}
});
+ sGetCommandMap.put(
+ CaptureResult.STATISTICS_LENS_INTRINSICS_SAMPLES.getNativeKey(),
+ new GetCommand() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getValue(CameraMetadataNative metadata, Key<T> key) {
+ return (T) metadata.getLensIntrinsicSamples();
+ }
+ });
}
private int[] getAvailableFormats() {
@@ -1780,6 +1790,56 @@
return samples;
}
+ private boolean setLensIntrinsicsSamples(LensIntrinsicsSample[] samples) {
+ if (samples == null) {
+ return false;
+ }
+
+ long[] tsArray = new long[samples.length];
+ float[] intrinsicsArray = new float[samples.length * 5];
+ for (int i = 0; i < samples.length; i++) {
+ tsArray[i] = samples[i].getTimestamp();
+ System.arraycopy(samples[i].getLensIntrinsics(), 0, intrinsicsArray, 5*i, 5);
+
+ }
+ setBase(CaptureResult.STATISTICS_LENS_INTRINSIC_SAMPLES, intrinsicsArray);
+ setBase(CaptureResult.STATISTICS_LENS_INTRINSIC_TIMESTAMPS, tsArray);
+
+ return true;
+ }
+
+ private LensIntrinsicsSample[] getLensIntrinsicSamples() {
+ long[] timestamps = getBase(CaptureResult.STATISTICS_LENS_INTRINSIC_TIMESTAMPS);
+ float[] intrinsics = getBase(CaptureResult.STATISTICS_LENS_INTRINSIC_SAMPLES);
+
+ if (timestamps == null) {
+ if (intrinsics != null) {
+ throw new AssertionError("timestamps is null but intrinsics is not");
+ }
+
+ return null;
+ }
+
+ if (intrinsics == null) {
+ throw new AssertionError("timestamps is not null but intrinsics is");
+ } else if((intrinsics.length % 5) != 0) {
+ throw new AssertionError("intrinsics are not multiple of 5");
+ }
+
+ if ((intrinsics.length / 5) != timestamps.length) {
+ throw new AssertionError(String.format(
+ "timestamps has %d entries but intrinsics has %d", timestamps.length,
+ intrinsics.length / 5));
+ }
+
+ LensIntrinsicsSample[] samples = new LensIntrinsicsSample[timestamps.length];
+ for (int i = 0; i < timestamps.length; i++) {
+ float[] currentIntrinsic = Arrays.copyOfRange(intrinsics, 5*i, 5*i + 5);
+ samples[i] = new LensIntrinsicsSample(timestamps[i], currentIntrinsic);
+ }
+ return samples;
+ }
+
private Capability[] getExtendedSceneModeCapabilities() {
int[] maxSizes =
getBase(CameraCharacteristics.CONTROL_AVAILABLE_EXTENDED_SCENE_MODE_MAX_SIZES);
@@ -1947,6 +2007,15 @@
metadata.setLensShadingMap((LensShadingMap) value);
}
});
+ sSetCommandMap.put(
+ CaptureResult.STATISTICS_LENS_INTRINSICS_SAMPLES.getNativeKey(),
+ new SetCommand() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> void setValue(CameraMetadataNative metadata, T value) {
+ metadata.setLensIntrinsicsSamples((LensIntrinsicsSample []) value);
+ }
+ });
}
private boolean setAvailableFormats(int[] value) {
diff --git a/core/java/android/hardware/camera2/params/LensIntrinsicsSample.java b/core/java/android/hardware/camera2/params/LensIntrinsicsSample.java
new file mode 100644
index 0000000..575cbfa
--- /dev/null
+++ b/core/java/android/hardware/camera2/params/LensIntrinsicsSample.java
@@ -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 android.hardware.camera2.params;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.utils.HashCodeHelpers;
+import android.text.TextUtils;
+
+import com.android.internal.camera.flags.Flags;
+import com.android.internal.util.Preconditions;
+
+import java.util.Arrays;
+
+/**
+ * Immutable class to store an
+ * {@link CaptureResult#STATISTICS_LENS_INTRINSICS_SAMPLES lens intrinsics intra-frame sample}.
+ */
+@FlaggedApi(Flags.FLAG_CONCERT_MODE)
+public final class LensIntrinsicsSample {
+ /**
+ * Create a new {@link LensIntrinsicsSample}.
+ *
+ * <p>{@link LensIntrinsicsSample} contains the timestamp and the
+ * {@link CaptureResult#LENS_INTRINSIC_CALIBRATION} sample.
+ *
+ * @param timestamp timestamp of the lens intrinsics sample.
+ * @param lensIntrinsics the lens intrinsic calibration for the sample.
+ *
+ * @throws IllegalArgumentException if lensIntrinsics length is different from 5
+ */
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public LensIntrinsicsSample(final long timestamp, @NonNull final float[] lensIntrinsics) {
+ mTimestampNs = timestamp;
+ Preconditions.checkArgument(lensIntrinsics.length == 5);
+ mLensIntrinsics = lensIntrinsics;
+ }
+
+ /**
+ * Get the timestamp in nanoseconds.
+ *
+ *<p>The timestamps are in the same timebase as and comparable to
+ *{@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p>
+ *
+ * @return a long value (guaranteed to be finite)
+ */
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ public long getTimestamp() {
+ return mTimestampNs;
+ }
+
+ /**
+ * Get the lens intrinsics calibration
+ *
+ * @return a floating point value (guaranteed to be finite)
+ * @see CaptureResult#LENS_INTRINSIC_CALIBRATION
+ */
+ @FlaggedApi(Flags.FLAG_CONCERT_MODE)
+ @NonNull
+ public float[] getLensIntrinsics() {
+ return mLensIntrinsics;
+ }
+
+ /**
+ * Check if this {@link LensIntrinsicsSample} is equal to another {@link LensIntrinsicsSample}.
+ *
+ * <p>Two samples are only equal if and only if each of the lens intrinsics are equal.</p>
+ *
+ * @return {@code true} if the objects were equal, {@code false} otherwise
+ */
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ } else if (this == obj) {
+ return true;
+ } else if (obj instanceof LensIntrinsicsSample) {
+ final LensIntrinsicsSample other = (LensIntrinsicsSample) obj;
+ return mTimestampNs == other.mTimestampNs
+ && Arrays.equals(mLensIntrinsics, other.getLensIntrinsics());
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode() {
+ int timestampHash = HashCodeHelpers.hashCode(((float)mTimestampNs));
+ return HashCodeHelpers.hashCode(Arrays.hashCode(mLensIntrinsics), timestampHash);
+ }
+
+ /**
+ * Return the LensIntrinsicsSample as a string representation.
+ *
+ * <p> {@code "LensIntrinsicsSample{timestamp:%l, sample:%s}"} represents the LensIntrinsics
+ * sample's timestamp, and calibration data.</p>
+ *
+ * @return string representation of {@link LensIntrinsicsSample}
+ */
+ @Override
+ public String toString() {
+ return TextUtils.formatSimple("LensIntrinsicsSample{timestamp:%d, sample:%s}", mTimestampNs,
+ Arrays.toString(mLensIntrinsics));
+ }
+
+ private final long mTimestampNs;
+ private final float [] mLensIntrinsics;
+}
diff --git a/core/java/android/hardware/input/InputDeviceSensorManager.java b/core/java/android/hardware/input/InputDeviceSensorManager.java
index 05024ea..8afcc78 100644
--- a/core/java/android/hardware/input/InputDeviceSensorManager.java
+++ b/core/java/android/hardware/input/InputDeviceSensorManager.java
@@ -17,6 +17,7 @@
package android.hardware.input;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.hardware.HardwareBuffer;
import android.hardware.Sensor;
import android.hardware.SensorAdditionalInfo;
@@ -37,7 +38,6 @@
import android.view.InputDevice;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.os.SomeArgs;
import java.util.ArrayList;
import java.util.HashMap;
@@ -49,14 +49,14 @@
* sensors.
* @hide
*/
-public class InputDeviceSensorManager implements InputManager.InputDeviceListener {
+public class InputDeviceSensorManager {
private static final String TAG = "InputDeviceSensorManager";
private static final boolean DEBUG = false;
private static final int MSG_SENSOR_ACCURACY_CHANGED = 1;
private static final int MSG_SENSOR_CHANGED = 2;
- private InputManagerGlobal mGlobal;
+ private final InputManagerGlobal mGlobal;
// sensor map from device id to sensor list
@GuardedBy("mInputSensorLock")
@@ -66,19 +66,16 @@
private InputSensorEventListener mInputServiceSensorListener;
@GuardedBy("mInputSensorLock")
private final ArrayList<InputSensorEventListenerDelegate> mInputSensorEventListeners =
- new ArrayList<InputSensorEventListenerDelegate>();
- private final HandlerThread mSensorThread;
- private final Handler mSensorHandler;
+ new ArrayList<>();
+
+ // The sensor thread is only initialized if there is a listener added without a handler.
+ @GuardedBy("mInputSensorLock")
+ @Nullable
+ private HandlerThread mSensorThread;
public InputDeviceSensorManager(InputManagerGlobal inputManagerGlobal) {
mGlobal = inputManagerGlobal;
- mSensorThread = new HandlerThread("SensorThread");
- mSensorThread.start();
- mSensorHandler = new Handler(mSensorThread.getLooper());
-
- // Register the input device listener
- mGlobal.registerInputDeviceListener(this, mSensorHandler);
// Initialize the sensor list
initializeSensors();
}
@@ -105,7 +102,6 @@
}
}
- @Override
public void onInputDeviceAdded(int deviceId) {
synchronized (mInputSensorLock) {
if (!mSensors.containsKey(deviceId)) {
@@ -117,14 +113,12 @@
}
}
- @Override
public void onInputDeviceRemoved(int deviceId) {
synchronized (mInputSensorLock) {
mSensors.remove(deviceId);
}
}
- @Override
public void onInputDeviceChanged(int deviceId) {
synchronized (mInputSensorLock) {
mSensors.remove(deviceId);
@@ -133,14 +127,11 @@
}
private static boolean sensorEquals(@NonNull Sensor lhs, @NonNull Sensor rhs) {
- if (lhs.getType() == rhs.getType() && lhs.getId() == rhs.getId()) {
- return true;
- }
- return false;
+ return lhs.getType() == rhs.getType() && lhs.getId() == rhs.getId();
}
private void populateSensorsForInputDeviceLocked(int deviceId, InputSensorInfo[] sensorInfos) {
- List<Sensor> sensors = new ArrayList<Sensor>();
+ List<Sensor> sensors = new ArrayList<>();
for (int i = 0; i < sensorInfos.length; i++) {
Sensor sensor = new Sensor(sensorInfos[i]);
if (DEBUG) {
@@ -197,6 +188,11 @@
}
synchronized (mInputSensorLock) {
Sensor sensor = getInputDeviceSensorLocked(deviceId, sensorType);
+ if (sensor == null) {
+ Slog.wtf(TAG, "onInputSensorChanged: Got sensor update for device " + deviceId
+ + " but the sensor was not found.");
+ return;
+ }
for (int i = 0; i < mInputSensorEventListeners.size(); i++) {
InputSensorEventListenerDelegate listener =
mInputSensorEventListeners.get(i);
@@ -252,20 +248,16 @@
private static final class InputSensorEventListenerDelegate extends Handler {
private final SensorEventListener mListener;
- private final int mDelayUs;
- private final int mMaxBatchReportLatencyUs;
// List of sensors being listened to
- private List<Sensor> mSensors = new ArrayList<Sensor>();
+ private final List<Sensor> mSensors = new ArrayList<>();
// Sensor event array by sensor type, preallocate sensor events for each sensor of listener
// to avoid allocation and garbage collection for each listener callback.
- private final SparseArray<SensorEvent> mSensorEvents = new SparseArray<SensorEvent>();
+ private final SparseArray<SensorEvent> mSensorEvents = new SparseArray<>();
InputSensorEventListenerDelegate(SensorEventListener listener, Sensor sensor,
- int delayUs, int maxBatchReportLatencyUs, Handler handler) {
- super(handler != null ? handler.getLooper() : Looper.myLooper());
+ Looper looper) {
+ super(looper);
mListener = listener;
- mDelayUs = delayUs;
- mMaxBatchReportLatencyUs = maxBatchReportLatencyUs;
addSensor(sensor);
}
@@ -280,12 +272,13 @@
/**
* Remove sensor from sensor list for listener
*/
- public void removeSensor(Sensor sensor) {
+ public void removeSensor(@Nullable Sensor sensor) {
// If sensor is not specified the listener will be unregistered for all sensors
// and the sensor list is cleared.
if (sensor == null) {
mSensors.clear();
mSensorEvents.clear();
+ return;
}
for (Sensor s : mSensors) {
if (sensorEquals(s, sensor)) {
@@ -306,7 +299,7 @@
}
}
mSensors.add(sensor);
- final int vecLength = sensor.getMaxLengthValuesArray(sensor, Build.VERSION.SDK_INT);
+ final int vecLength = Sensor.getMaxLengthValuesArray(sensor, Build.VERSION.SDK_INT);
SensorEvent event = new SensorEvent(sensor, SensorManager.SENSOR_STATUS_NO_CONTACT,
0 /* timestamp */, new float[vecLength]);
mSensorEvents.put(sensor.getType(), event);
@@ -345,7 +338,6 @@
* Send sensor changed message
*/
public void sendSensorChanged(SensorEvent event) {
- SomeArgs args = SomeArgs.obtain();
obtainMessage(MSG_SENSOR_CHANGED, event).sendToTarget();
}
@@ -353,7 +345,6 @@
* Send sensor accuracy changed message
*/
public void sendSensorAccuracyChanged(int deviceId, int sensorType, int accuracy) {
- SomeArgs args = SomeArgs.obtain();
obtainMessage(MSG_SENSOR_ACCURACY_CHANGED, deviceId, sensorType, accuracy)
.sendToTarget();
}
@@ -442,15 +433,21 @@
Slog.e(TAG, "Trigger Sensors should use the requestTriggerSensor.");
return false;
}
+
if (maxBatchReportLatencyUs < 0 || delayUs < 0) {
Slog.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative");
return false;
}
- if (getSensorForInputDevice(sensor.getId(), sensor.getType()) != null) {
- synchronized (mInputSensorLock) {
+ synchronized (mInputSensorLock) {
+ if (getSensorForInputDevice(sensor.getId(), sensor.getType()) != null) {
final int deviceId = sensor.getId();
- InputDevice inputDevice = InputDevice.getDevice(deviceId);
+ final InputDevice inputDevice = mGlobal.getInputDevice(deviceId);
+ if (inputDevice == null) {
+ Slog.e(TAG, "input device not found for sensor " + sensor.getId());
+ return false;
+ }
+
if (!inputDevice.hasSensor()) {
Slog.e(TAG, "The device doesn't have the sensor:" + sensor);
return false;
@@ -461,9 +458,7 @@
return false;
}
}
- }
- synchronized (mInputSensorLock) {
// Register the InputManagerService sensor listener if not yet.
if (mInputServiceSensorListener == null) {
mInputServiceSensorListener = new InputSensorEventListener();
@@ -476,9 +471,8 @@
int idx = findSensorEventListenerLocked(listener);
if (idx < 0) {
InputSensorEventListenerDelegate d =
- new InputSensorEventListenerDelegate(listener, sensor, delayUs,
- maxBatchReportLatencyUs,
- handler == null ? mSensorHandler : handler);
+ new InputSensorEventListenerDelegate(listener, sensor,
+ getLooperForListenerLocked(handler));
mInputSensorEventListeners.add(d);
} else {
// The listener is already registered, see if it wants to listen to more sensors.
@@ -489,6 +483,19 @@
return true;
}
+ @GuardedBy("mInputSensorLock")
+ @NonNull
+ private Looper getLooperForListenerLocked(@Nullable Handler requestedHandler) {
+ if (requestedHandler != null) {
+ return requestedHandler.getLooper();
+ }
+ if (mSensorThread == null) {
+ mSensorThread = new HandlerThread("SensorThread");
+ mSensorThread.start();
+ }
+ return mSensorThread.getLooper();
+ }
+
private void unregisterListenerInternal(SensorEventListener listener, Sensor sensor) {
if (DEBUG) {
Slog.d(TAG, "unregisterListenerImpl listener=" + listener + " sensor=" + sensor);
@@ -503,7 +510,7 @@
if (idx >= 0) {
InputSensorEventListenerDelegate delegate =
mInputSensorEventListeners.get(idx);
- sensorsRegistered = new ArrayList<Sensor>(delegate.getSensors());
+ sensorsRegistered = new ArrayList<>(delegate.getSensors());
// Get the sensor types the listener is listening to
delegate.removeSensor(sensor);
if (delegate.isEmpty()) {
@@ -515,7 +522,7 @@
return;
}
// If no delegation remains, unregister the listener to input service
- if (mInputServiceSensorListener != null && mInputSensorEventListeners.size() == 0) {
+ if (mInputServiceSensorListener != null && mInputSensorEventListeners.isEmpty()) {
mGlobal.unregisterSensorListener(mInputServiceSensorListener);
mInputServiceSensorListener = null;
}
@@ -545,7 +552,7 @@
}
}
- private boolean flush(SensorEventListener listener) {
+ private boolean flushInternal(SensorEventListener listener) {
synchronized (mInputSensorLock) {
int idx = findSensorEventListenerLocked(listener);
if (idx < 0) {
@@ -601,7 +608,7 @@
@Override
protected boolean flushImpl(SensorEventListener listener) {
- return flush(listener);
+ return flushInternal(listener);
}
@Override
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 7b8419e..abbf954 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -1095,62 +1095,6 @@
}
/**
- * Get sensors information as list.
- *
- * @hide
- */
- public InputSensorInfo[] getSensorList(int deviceId) {
- return mGlobal.getSensorList(deviceId);
- }
-
- /**
- * Enable input device sensor
- *
- * @hide
- */
- public boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs,
- int maxBatchReportLatencyUs) {
- return mGlobal.enableSensor(deviceId, sensorType, samplingPeriodUs,
- maxBatchReportLatencyUs);
- }
-
- /**
- * Enable input device sensor
- *
- * @hide
- */
- public void disableSensor(int deviceId, int sensorType) {
- mGlobal.disableSensor(deviceId, sensorType);
- }
-
- /**
- * Flush input device sensor
- *
- * @hide
- */
- public boolean flushSensor(int deviceId, int sensorType) {
- return mGlobal.flushSensor(deviceId, sensorType);
- }
-
- /**
- * Register input device sensor listener
- *
- * @hide
- */
- public boolean registerSensorListener(IInputSensorEventListener listener) {
- return mGlobal.registerSensorListener(listener);
- }
-
- /**
- * Unregister input device sensor listener
- *
- * @hide
- */
- public void unregisterSensorListener(IInputSensorEventListener listener) {
- mGlobal.unregisterSensorListener(listener);
- }
-
- /**
* Add a runtime association between the input port and the display port. This overrides any
* static associations.
* @param inputPort The port of the input device.
diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java
index 8c598ae..cf1dfe3 100644
--- a/core/java/android/hardware/input/InputManagerGlobal.java
+++ b/core/java/android/hardware/input/InputManagerGlobal.java
@@ -100,6 +100,9 @@
@GuardedBy("mKeyboardBacklightListenerLock")
@Nullable private IKeyboardBacklightListener mKeyboardBacklightListener;
+ // InputDeviceSensorManager gets notified synchronously from the binder thread when input
+ // devices change, so it must be synchronized with the input device listeners.
+ @GuardedBy("mInputDeviceListeners")
@Nullable private InputDeviceSensorManager mInputDeviceSensorManager;
private static InputManagerGlobal sInstance;
@@ -250,6 +253,9 @@
Log.d(TAG, "Device removed: " + deviceId);
}
mInputDevices.removeAt(i);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceRemoved(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_REMOVED, deviceId);
}
@@ -267,6 +273,9 @@
Log.d(TAG, "Device changed: " + deviceId);
}
mInputDevices.setValueAt(index, null);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceChanged(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_CHANGED, deviceId);
}
@@ -276,6 +285,9 @@
Log.d(TAG, "Device added: " + deviceId);
}
mInputDevices.put(deviceId, null);
+ if (mInputDeviceSensorManager != null) {
+ mInputDeviceSensorManager.onInputDeviceAdded(deviceId);
+ }
sendMessageToInputDeviceListenersLocked(
InputDeviceListenerDelegate.MSG_DEVICE_ADDED, deviceId);
}
@@ -930,14 +942,17 @@
*/
@NonNull
public SensorManager getInputDeviceSensorManager(int deviceId) {
- if (mInputDeviceSensorManager == null) {
- mInputDeviceSensorManager = new InputDeviceSensorManager(this);
+ synchronized (mInputDeviceListeners) {
+ if (mInputDeviceSensorManager == null) {
+ mInputDeviceSensorManager = new InputDeviceSensorManager(this);
+ }
+ return mInputDeviceSensorManager.getSensorManager(deviceId);
}
- return mInputDeviceSensorManager.getSensorManager(deviceId);
}
/**
- * @see InputManager#getSensorList(int)
+ * Get information about all of the sensors supported by an input device
+ * @see InputDeviceSensorManager
*/
InputSensorInfo[] getSensorList(int deviceId) {
try {
@@ -948,7 +963,7 @@
}
/**
- * @see InputManager#enableSensor(int, int, int, int)
+ * @see InputDeviceSensorManager
*/
boolean enableSensor(int deviceId, int sensorType, int samplingPeriodUs,
int maxBatchReportLatencyUs) {
@@ -961,7 +976,7 @@
}
/**
- * @see InputManager#disableSensor(int, int)
+ * @see InputDeviceSensorManager
*/
void disableSensor(int deviceId, int sensorType) {
try {
@@ -972,7 +987,7 @@
}
/**
- * @see InputManager#flushSensor(int, int)
+ * @see InputDeviceSensorManager
*/
boolean flushSensor(int deviceId, int sensorType) {
try {
@@ -983,7 +998,7 @@
}
/**
- * @see InputManager#registerSensorListener(IInputSensorEventListener)
+ * @see InputDeviceSensorManager
*/
boolean registerSensorListener(IInputSensorEventListener listener) {
try {
@@ -994,7 +1009,7 @@
}
/**
- * @see InputManager#unregisterSensorListener(IInputSensorEventListener)
+ * @see InputDeviceSensorManager
*/
void unregisterSensorListener(IInputSensorEventListener listener) {
try {
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 5b24dca..3a32b2b 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -52,9 +52,11 @@
import android.provider.MediaStore;
import android.system.ErrnoException;
import android.system.Os;
+import android.system.OsConstants;
import android.system.StructStat;
import android.text.TextUtils;
import android.util.DataUnit;
+import android.util.EmptyArray;
import android.util.Log;
import android.util.Slog;
import android.webkit.MimeTypeMap;
@@ -64,7 +66,6 @@
import com.android.internal.util.SizedInputStream;
import libcore.io.IoUtils;
-import libcore.util.EmptyArray;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
@@ -94,6 +95,7 @@
/**
* Utility methods useful for working with files.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FileUtils {
private static final String TAG = "FileUtils";
@@ -116,9 +118,6 @@
private FileUtils() {
}
- private static final String CAMERA_DIR_LOWER_CASE = "/storage/emulated/" + UserHandle.myUserId()
- + "/dcim/camera";
-
/** Regular expression for safe filenames: no spaces or metacharacters.
*
* Use a preload holder so that FileUtils can be compile-time initialized.
@@ -133,6 +132,21 @@
private static final long COPY_CHECKPOINT_BYTES = 524288;
+ static {
+ sEnableCopyOptimizations = shouldEnableCopyOptimizations();
+ }
+
+ @android.ravenwood.annotation.RavenwoodReplace
+ private static boolean shouldEnableCopyOptimizations() {
+ // Advanced copy operations enabled by default
+ return true;
+ }
+
+ private static boolean shouldEnableCopyOptimizations$ravenwood() {
+ // Disabled under Ravenwood due to missing kernel support
+ return false;
+ }
+
/**
* Listener that is called periodically as progress is made.
*/
@@ -150,6 +164,7 @@
* @hide
*/
@UnsupportedAppUsage
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(File path, int mode, int uid, int gid) {
return setPermissions(path.getAbsolutePath(), mode, uid, gid);
}
@@ -164,6 +179,7 @@
* @hide
*/
@UnsupportedAppUsage
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(String path, int mode, int uid, int gid) {
try {
Os.chmod(path, mode);
@@ -194,6 +210,7 @@
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int setPermissions(FileDescriptor fd, int mode, int uid, int gid) {
try {
Os.fchmod(fd, mode);
@@ -221,6 +238,7 @@
* @param to File where attributes should be copied to.
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static void copyPermissions(@NonNull File from, @NonNull File to) throws IOException {
try {
final StructStat stat = Os.stat(from.getAbsolutePath());
@@ -236,6 +254,7 @@
* @hide
*/
@Deprecated
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static int getUid(String path) {
try {
return Os.stat(path).st_uid;
@@ -314,11 +333,7 @@
}
try (FileOutputStream out = new FileOutputStream(destFile)) {
copy(in, out);
- try {
- Os.fsync(out.getFD());
- } catch (ErrnoException e) {
- throw e.rethrowAsIOException();
- }
+ sync(out);
}
}
@@ -475,6 +490,7 @@
* @hide
*/
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static long copyInternalSplice(FileDescriptor in, FileDescriptor out, long count,
CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
@@ -516,6 +532,7 @@
* @hide
*/
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static long copyInternalSendfile(FileDescriptor in, FileDescriptor out, long count,
CancellationSignal signal, Executor executor, ProgressListener listener)
throws ErrnoException {
@@ -699,6 +716,7 @@
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodReplace
public static void bytesToFile(String filename, byte[] content) throws IOException {
if (filename.startsWith("/proc/")) {
final int oldMask = StrictMode.allowThreadDiskWritesMask();
@@ -714,6 +732,14 @@
}
}
+ /** @hide */
+ public static void bytesToFile$ravenwood(String filename, byte[] content) throws IOException {
+ // No StrictMode support, so we can just directly write
+ try (FileOutputStream fos = new FileOutputStream(filename)) {
+ fos.write(content);
+ }
+ }
+
/**
* Writes string to file. Basically same as "echo -n $string > $filename"
*
@@ -1176,6 +1202,7 @@
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = MimeTypeMap.class)
public static String[] splitFileName(String mimeType, String displayName) {
String name;
String ext;
@@ -1423,11 +1450,13 @@
* indicate a failure to flush bytes to the underlying resource.
*/
@Deprecated
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires ART support")
public static void closeQuietly(@Nullable FileDescriptor fd) {
IoUtils.closeQuietly(fd);
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModeStringToPosix(String mode) {
// Quick check for invalid chars
for (int i = 0; i < mode.length(); i++) {
@@ -1462,6 +1491,7 @@
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static String translateModePosixToString(int mode) {
String res = "";
if ((mode & O_ACCMODE) == O_RDWR) {
@@ -1483,6 +1513,7 @@
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModePosixToPfd(int mode) {
int res = 0;
if ((mode & O_ACCMODE) == O_RDWR) {
@@ -1507,6 +1538,7 @@
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModePfdToPosix(int mode) {
int res = 0;
if ((mode & MODE_READ_WRITE) == MODE_READ_WRITE) {
@@ -1531,6 +1563,7 @@
}
/** {@hide} */
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy = OsConstants.class)
public static int translateModeAccessToPosix(int mode) {
if (mode == F_OK) {
// There's not an exact mapping, so we attempt a read-only open to
@@ -1549,6 +1582,7 @@
/** {@hide} */
@VisibleForTesting
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static ParcelFileDescriptor convertToModernFd(FileDescriptor fd) {
Context context = AppGlobals.getInitialApplication();
if (UserHandle.getAppId(Process.myUid()) == getMediaProviderAppId(context)) {
@@ -1565,6 +1599,7 @@
}
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
private static int getMediaProviderAppId(Context context) {
if (sMediaProviderAppId != -1) {
return sMediaProviderAppId;
@@ -1605,10 +1640,12 @@
return this;
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static MemoryPipe createSource(byte[] data) throws IOException {
return new MemoryPipe(data, false).startInternal();
}
+ @android.ravenwood.annotation.RavenwoodThrow(reason = "Requires kernel support")
public static MemoryPipe createSink(byte[] data) throws IOException {
return new MemoryPipe(data, true).startInternal();
}
diff --git a/core/java/android/os/IHintSession.aidl b/core/java/android/os/IHintSession.aidl
index 6b43e73..fe85da2 100644
--- a/core/java/android/os/IHintSession.aidl
+++ b/core/java/android/os/IHintSession.aidl
@@ -17,6 +17,8 @@
package android.os;
+import android.os.WorkDuration;
+
/** {@hide} */
oneway interface IHintSession {
void updateTargetWorkDuration(long targetDurationNanos);
@@ -24,4 +26,5 @@
void close();
void sendHint(int hint);
void setMode(int mode, boolean enabled);
+ void reportActualWorkDuration2(in WorkDuration[] workDurations);
}
diff --git a/core/java/android/os/PerformanceHintManager.java b/core/java/android/os/PerformanceHintManager.java
index 11084b8..e005910 100644
--- a/core/java/android/os/PerformanceHintManager.java
+++ b/core/java/android/os/PerformanceHintManager.java
@@ -103,7 +103,7 @@
* Any call in this class will change its internal data, so you must do your own thread
* safety to protect from racing.
*
- * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ * All timings should be in {@link SystemClock#uptimeNanos()}.
*/
public static class Session implements Closeable {
private long mNativeSessionPtr;
@@ -269,6 +269,40 @@
public @Nullable int[] getThreadIds() {
return nativeGetThreadIds(mNativeSessionPtr);
}
+
+ /**
+ * Reports the work duration for the last cycle of work.
+ *
+ * The system will attempt to adjust the core placement of the threads within the thread
+ * group and/or the frequency of the core on which they are run to bring the actual duration
+ * close to the target duration.
+ *
+ * @param workDuration the work duration of each component.
+ * @throws IllegalArgumentException if work period start timestamp is not positive, or
+ * actual total duration is not positive, or actual CPU duration is not positive,
+ * or actual GPU duration is negative.
+ */
+ @FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
+ public void reportActualWorkDuration(@NonNull WorkDuration workDuration) {
+ if (workDuration.mWorkPeriodStartTimestampNanos <= 0) {
+ throw new IllegalArgumentException(
+ "the work period start timestamp should be positive.");
+ }
+ if (workDuration.mActualTotalDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual total duration should be positive.");
+ }
+ if (workDuration.mActualCpuDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual CPU duration should be positive.");
+ }
+ if (workDuration.mActualGpuDurationNanos < 0) {
+ throw new IllegalArgumentException(
+ "the actual GPU duration should be non negative.");
+ }
+ nativeReportActualWorkDuration(mNativeSessionPtr,
+ workDuration.mWorkPeriodStartTimestampNanos,
+ workDuration.mActualTotalDurationNanos,
+ workDuration.mActualCpuDurationNanos, workDuration.mActualGpuDurationNanos);
+ }
}
private static native long nativeAcquireManager();
@@ -285,4 +319,7 @@
private static native void nativeSetThreads(long nativeSessionPtr, int[] tids);
private static native void nativeSetPreferPowerEfficiency(long nativeSessionPtr,
boolean enabled);
+ private static native void nativeReportActualWorkDuration(long nativeSessionPtr,
+ long workPeriodStartTimestampNanos, long actualTotalDurationNanos,
+ long actualCpuDurationNanos, long actualGpuDurationNanos);
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 11bddfb..f4795f8 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -16,7 +16,6 @@
package android.os;
-import android.annotation.FlaggedApi;
import android.Manifest.permission;
import android.annotation.CallbackExecutor;
import android.annotation.CurrentTimeMillisLong;
@@ -3103,7 +3102,8 @@
/**
* Intent that is broadcast when Low Power Standby is enabled or disabled.
- * This broadcast is only sent to registered receivers.
+ * This broadcast is only sent to registered receivers and receivers holding
+ * {@code android.permission.MANAGE_LOW_POWER_STANDBY}.
*
* @see #isLowPowerStandbyEnabled()
*/
@@ -3113,7 +3113,8 @@
/**
* Intent that is broadcast when Low Power Standby policy is changed.
- * This broadcast is only sent to registered receivers.
+ * This broadcast is only sent to registered receivers and receivers holding
+ * {@code android.permission.MANAGE_LOW_POWER_STANDBY}.
*
* @see #isExemptFromLowPowerStandby()
* @see #isAllowedInLowPowerStandby(int)
@@ -3125,7 +3126,6 @@
/**
* Intent that is broadcast when Low Power Standby exempt ports change.
- * This broadcast is only sent to registered receivers.
*
* @see #getActiveLowPowerStandbyPorts
* @hide
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index 11660f9..7e07e1f 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -853,6 +853,7 @@
args.argi2 = pid;
args.argi3 = Long.hashCode(Thread.currentThread().getId());
args.argi4 = THREAD_PRIORITY_DEFAULT;
+ args.arg1 = Boolean.TRUE; // backgroundOk
return args;
});
}
@@ -1105,6 +1106,11 @@
final SomeArgs args =
Preconditions.requireNonNullViaRavenwoodRule(sIdentity$ravenwood).get();
if (args.argi3 == tid) {
+ boolean backgroundOk = (args.arg1 == Boolean.TRUE);
+ if (priority >= THREAD_PRIORITY_BACKGROUND && !backgroundOk) {
+ throw new IllegalArgumentException(
+ "Priority " + priority + " blocked by setCanSelfBackground()");
+ }
args.argi4 = priority;
} else {
throw new UnsupportedOperationException(
@@ -1119,8 +1125,16 @@
*
* @hide
*/
+ @android.ravenwood.annotation.RavenwoodReplace
public static final native void setCanSelfBackground(boolean backgroundOk);
+ /** @hide */
+ public static final void setCanSelfBackground$ravenwood(boolean backgroundOk) {
+ final SomeArgs args =
+ Preconditions.requireNonNullViaRavenwoodRule(sIdentity$ravenwood).get();
+ args.arg1 = Boolean.valueOf(backgroundOk);
+ }
+
/**
* Sets the scheduling group for a thread.
* @hide
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index 2e6cccb..23bd30a 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -16,6 +16,7 @@
package android.os;
+import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.app.IAlarmManager;
import android.app.time.UnixEpochTime;
@@ -205,8 +206,8 @@
* Returns nanoseconds since boot, not counting time spent in deep sleep.
*
* @return nanoseconds of non-sleep uptime since boot.
- * @hide
*/
+ @FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
@CriticalNative
@android.ravenwood.annotation.RavenwoodReplace
public static native long uptimeNanos();
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index ec6d20f..c280d13 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -16,6 +16,7 @@
package android.os;
+import static android.app.admin.DevicePolicyResources.Drawables.Style.SOLID_COLORED;
import static android.app.admin.DevicePolicyResources.Strings.Core.WORK_PROFILE_BADGED_LABEL;
import static android.app.admin.DevicePolicyResources.UNDEFINED;
@@ -5652,6 +5653,38 @@
}
/**
+ * Retrieves a user badge associated with the current context user. This is only
+ * applicable to profile users since non-profile users do not have badges.
+ *
+ * @return A {@link Drawable} user badge corresponding to the context user
+ * @throws android.content.res.Resources.NotFoundException if the user is not a profile or
+ * does not have a badge defined.
+ * @hide
+ */
+ @SystemApi
+ @UserHandleAware(
+ requiresAnyOfPermissionsIfNotCallerProfileGroup = {
+ Manifest.permission.MANAGE_USERS,
+ Manifest.permission.INTERACT_ACROSS_USERS})
+ @SuppressLint("UnflaggedApi") // b/306636213
+ public @NonNull Drawable getUserBadge() {
+ if (!isProfile(mUserId)) {
+ throw new Resources.NotFoundException("No badge found for this user.");
+ }
+ if (isManagedProfile(mUserId)) {
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ return dpm.getResources().getDrawable(
+ android.app.admin.DevicePolicyResources.Drawables.WORK_PROFILE_ICON_BADGE,
+ SOLID_COLORED, () -> getDefaultUserBadge(mUserId));
+ }
+ return getDefaultUserBadge(mUserId);
+ }
+
+ private Drawable getDefaultUserBadge(@UserIdInt int userId){
+ return mContext.getResources().getDrawable(getUserBadgeResId(userId), mContext.getTheme());
+ }
+
+ /**
* If the target user is a profile of the calling user or the caller
* is itself a profile, then this returns a copy of the label with
* badging for accessibility services like talkback. E.g. passing in "Email"
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/core/java/android/os/WorkDuration.aidl
similarity index 77%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to core/java/android/os/WorkDuration.aidl
index f4feee1..0f61204 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/core/java/android/os/WorkDuration.aidl
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package android.os;
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+parcelable WorkDuration cpp_header "android/WorkDuration.h";
\ No newline at end of file
diff --git a/core/java/android/os/WorkDuration.java b/core/java/android/os/WorkDuration.java
new file mode 100644
index 0000000..4fdc34f
--- /dev/null
+++ b/core/java/android/os/WorkDuration.java
@@ -0,0 +1,213 @@
+/*
+ * 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.os;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+
+import java.util.Objects;
+
+/**
+ * WorkDuration contains the measured time in nano seconds of the workload
+ * in each component, see
+ * {@link PerformanceHintManager.Session#reportActualWorkDuration(WorkDuration)}.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+@FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION)
+public final class WorkDuration implements Parcelable {
+ long mWorkPeriodStartTimestampNanos = 0;
+ long mActualTotalDurationNanos = 0;
+ long mActualCpuDurationNanos = 0;
+ long mActualGpuDurationNanos = 0;
+ long mTimestampNanos = 0;
+
+ public static final @NonNull Creator<WorkDuration> CREATOR = new Creator<>() {
+ @Override
+ public WorkDuration createFromParcel(Parcel in) {
+ return new WorkDuration(in);
+ }
+
+ @Override
+ public WorkDuration[] newArray(int size) {
+ return new WorkDuration[size];
+ }
+ };
+
+ public WorkDuration() {}
+
+ public WorkDuration(long workPeriodStartTimestampNanos,
+ long actualTotalDurationNanos,
+ long actualCpuDurationNanos,
+ long actualGpuDurationNanos) {
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ }
+
+ /**
+ * @hide
+ */
+ public WorkDuration(long workPeriodStartTimestampNanos,
+ long actualTotalDurationNanos,
+ long actualCpuDurationNanos,
+ long actualGpuDurationNanos,
+ long timestampNanos) {
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ mTimestampNanos = timestampNanos;
+ }
+
+ WorkDuration(@NonNull Parcel in) {
+ mWorkPeriodStartTimestampNanos = in.readLong();
+ mActualTotalDurationNanos = in.readLong();
+ mActualCpuDurationNanos = in.readLong();
+ mActualGpuDurationNanos = in.readLong();
+ mTimestampNanos = in.readLong();
+ }
+
+ /**
+ * Sets the work period start timestamp in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setWorkPeriodStartTimestampNanos(long workPeriodStartTimestampNanos) {
+ if (workPeriodStartTimestampNanos <= 0) {
+ throw new IllegalArgumentException(
+ "the work period start timestamp should be positive.");
+ }
+ mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos;
+ }
+
+ /**
+ * Sets the actual total duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualTotalDurationNanos(long actualTotalDurationNanos) {
+ if (actualTotalDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual total duration should be positive.");
+ }
+ mActualTotalDurationNanos = actualTotalDurationNanos;
+ }
+
+ /**
+ * Sets the actual CPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualCpuDurationNanos(long actualCpuDurationNanos) {
+ if (actualCpuDurationNanos <= 0) {
+ throw new IllegalArgumentException("the actual CPU duration should be positive.");
+ }
+ mActualCpuDurationNanos = actualCpuDurationNanos;
+ }
+
+ /**
+ * Sets the actual GPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public void setActualGpuDurationNanos(long actualGpuDurationNanos) {
+ if (actualGpuDurationNanos < 0) {
+ throw new IllegalArgumentException("the actual GPU duration should be non negative.");
+ }
+ mActualGpuDurationNanos = actualGpuDurationNanos;
+ }
+
+ /**
+ * Returns the work period start timestamp based in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getWorkPeriodStartTimestampNanos() {
+ return mWorkPeriodStartTimestampNanos;
+ }
+
+ /**
+ * Returns the actual total duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualTotalDurationNanos() {
+ return mActualTotalDurationNanos;
+ }
+
+ /**
+ * Returns the actual CPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualCpuDurationNanos() {
+ return mActualCpuDurationNanos;
+ }
+
+ /**
+ * Returns the actual GPU duration in nanoseconds.
+ *
+ * All timings should be in {@link SystemClock#elapsedRealtimeNanos()}.
+ */
+ public long getActualGpuDurationNanos() {
+ return mActualGpuDurationNanos;
+ }
+
+ /**
+ * @hide
+ */
+ public long getTimestampNanos() {
+ return mTimestampNanos;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeLong(mWorkPeriodStartTimestampNanos);
+ dest.writeLong(mActualTotalDurationNanos);
+ dest.writeLong(mActualCpuDurationNanos);
+ dest.writeLong(mActualGpuDurationNanos);
+ dest.writeLong(mTimestampNanos);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof WorkDuration)) {
+ return false;
+ }
+ WorkDuration workDuration = (WorkDuration) obj;
+ return workDuration.mTimestampNanos == this.mTimestampNanos
+ && workDuration.mWorkPeriodStartTimestampNanos == this.mWorkPeriodStartTimestampNanos
+ && workDuration.mActualTotalDurationNanos == this.mActualTotalDurationNanos
+ && workDuration.mActualCpuDurationNanos == this.mActualCpuDurationNanos
+ && workDuration.mActualGpuDurationNanos == this.mActualGpuDurationNanos;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mWorkPeriodStartTimestampNanos, mActualTotalDurationNanos,
+ mActualCpuDurationNanos, mActualGpuDurationNanos, mTimestampNanos);
+ }
+}
diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig
index c085f33..980c13c 100644
--- a/core/java/android/os/flags.aconfig
+++ b/core/java/android/os/flags.aconfig
@@ -68,4 +68,11 @@
namespace: "backstage_power"
description: "Guards a new API in PowerManager to check if battery saver is supported or not."
bug: "305067031"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "adpf_gpu_report_actual_work_duration"
+ namespace: "game"
+ description: "Guards the ADPF GPU APIs."
+ bug: "284324521"
+}
diff --git a/core/java/android/os/vibrator/persistence/VibrationXmlParser.java b/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
index fed1053..3d711a7 100644
--- a/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
+++ b/core/java/android/os/vibrator/persistence/VibrationXmlParser.java
@@ -56,9 +56,9 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -66,7 +66,7 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* <waveform-entry amplitude="0" durationMs="10" />
@@ -77,7 +77,7 @@
* <waveform-entry amplitude="255" durationMs="20" />
* </repeating>
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -85,31 +85,31 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <primitive-effect name="click" />
* <primitive-effect name="slow_rise" scale="0.8" />
* <primitive-effect name="quick_fall" delayMs="50" />
* <primitive-effect name="tick" scale="0.5" delayMs="100" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
* <p>When the root element represents a selection list of vibration effects, the root tag should be
* a <vibration-select> tag. The root element should contain a list of vibration serializations.
- * Each vibration within the root-element should follow the format discussed for the <vibration> tag
- * above. See example below:
+ * Each vibration within the root-element should follow the format discussed for the
+ * <vibration-effect> tag above. See example below:
*
* <pre>
* {@code
* <vibration-select>
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
- * <vibration>
+ * </vibration-effect>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* </vibration-select>
* }
* </pre>
@@ -262,12 +262,12 @@
* {@link ParsedVibration}.
*
* <p>Same as {@link #parseDocument(Reader, int)}, but, instead of parsing the full XML content,
- * it takes a parser that points to either a <vibration> or a <vibration-select> start tag. No
- * other parser position, including start of document, is considered valid.
+ * it takes a parser that points to either a <vibration-effect> or a <vibration-select> start
+ * tag. No other parser position, including start of document, is considered valid.
*
- * <p>This method parses until an end "vibration" or "vibration-select" tag (depending on the
- * start tag found at the start of parsing). After a successful parsing, the parser will point
- * to the end tag.
+ * <p>This method parses until an end "vibration-effect" or "vibration-select" tag (depending
+ * on the start tag found at the start of parsing). After a successful parsing, the parser
+ * will point to the end tag.
*
* @throws IOException error parsing from given {@link TypedXmlPullParser}.
* @throws VibrationXmlParserException if the XML tag cannot be parsed into a
@@ -308,7 +308,7 @@
String tagName = parser.getName();
switch(tagName) {
- case XmlConstants.TAG_VIBRATION:
+ case XmlConstants.TAG_VIBRATION_EFFECT:
return new ParsedVibration(parseVibrationEffectInternal(parser, flags));
case XmlConstants.TAG_VIBRATION_SELECT:
return parseVibrationSelectInternal(parser, flags);
diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig
index 0133bd8..0dc0413 100644
--- a/core/java/android/security/flags.aconfig
+++ b/core/java/android/security/flags.aconfig
@@ -8,7 +8,7 @@
}
flag {
- name: "fix_unlocked_device_required_keys"
+ name: "fix_unlocked_device_required_keys_v2"
namespace: "hardware_backed_security"
description: "Fix bugs in behavior of UnlockedDeviceRequired keystore keys"
bug: "296464083"
diff --git a/core/java/android/service/chooser/CustomChoosers.java b/core/java/android/service/chooser/CustomChoosers.java
new file mode 100644
index 0000000..5b89432
--- /dev/null
+++ b/core/java/android/service/chooser/CustomChoosers.java
@@ -0,0 +1,84 @@
+/*
+ * 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.chooser;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Static helper methods that privileged clients can use to initiate Share sessions with extra
+ * customization options that aren't usually available in the stock "Resolver/Chooser" flows.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_SUPPORT_NFC_RESOLVER)
+@SystemApi
+public class CustomChoosers {
+ /**
+ * Intent action to start a Share session with additional customization options. Clients should
+ * use the helper methods in this class to configure their customized share intents, and should
+ * avoid using this action to construct their own intents directly.
+ */
+ private static final String ACTION_SHOW_CUSTOMIZED_RESOLVER =
+ "android.service.chooser.action.SHOW_CUSTOMIZED_RESOLVER";
+
+ /**
+ * "Extras" key for an ArrayList of {@link ResolveInfo} records which are to be shown as the
+ * targets in the customized share session.
+ *
+ * @hide
+ */
+ public static final String EXTRA_RESOLVE_INFOS = "android.service.chooser.extra.RESOLVE_INFOS";
+
+ /**
+ * Build an {@link Intent} to dispatch a "Chooser flow" that picks a target resolution for the
+ * specified {@code target} intent, styling the Chooser UI according to the specified
+ * customization parameters.
+ *
+ * @param target The ambiguous intent that should be resolved to a specific target selected
+ * via the Chooser flow.
+ * @param title An optional "headline" string to display at the top of the Chooser UI, or null
+ * to use the system default.
+ * @param resolutionList Explicit resolution info for targets that should be shown in the
+ * dispatched Share UI.
+ *
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_SUPPORT_NFC_RESOLVER)
+ @SystemApi
+ @NonNull
+ public static Intent createNfcResolverIntent(
+ @NonNull Intent target,
+ @Nullable CharSequence title,
+ @NonNull List<ResolveInfo> resolutionList) {
+ Intent resolverIntent = new Intent(ACTION_SHOW_CUSTOMIZED_RESOLVER);
+ resolverIntent.putExtra(Intent.EXTRA_INTENT, target);
+ resolverIntent.putExtra(Intent.EXTRA_TITLE, title);
+ resolverIntent.putParcelableArrayListExtra(
+ EXTRA_RESOLVE_INFOS, new ArrayList<>(resolutionList));
+ return resolverIntent;
+ }
+
+ private CustomChoosers() {}
+}
diff --git a/core/java/android/service/controls/ControlsProviderService.java b/core/java/android/service/controls/ControlsProviderService.java
index 0272bb9..5cbde9f 100644
--- a/core/java/android/service/controls/ControlsProviderService.java
+++ b/core/java/android/service/controls/ControlsProviderService.java
@@ -16,6 +16,8 @@
package android.service.controls;
import android.Manifest;
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
@@ -33,12 +35,15 @@
import android.os.RemoteException;
import android.service.controls.actions.ControlAction;
import android.service.controls.actions.ControlActionWrapper;
+import android.service.controls.flags.Flags;
import android.service.controls.templates.ControlTemplate;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.concurrent.Flow.Publisher;
import java.util.concurrent.Flow.Subscriber;
@@ -82,6 +87,40 @@
public static final String EXTRA_LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS =
"android.service.controls.extra.LOCKSCREEN_ALLOW_TRIVIAL_CONTROLS";
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({CONTROLS_SURFACE_ACTIVITY_PANEL, CONTROLS_SURFACE_DREAM})
+ public @interface ControlsSurface {
+ }
+
+ /**
+ * Controls are being shown on the device controls activity panel.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final int CONTROLS_SURFACE_ACTIVITY_PANEL = 0;
+
+ /**
+ * Controls are being shown as a dream, while the device is idle.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final int CONTROLS_SURFACE_DREAM = 1;
+
+ /**
+ * Integer extra whose value specifies the surface which controls are being displayed on.
+ * <p>
+ * The possible values are:
+ * <ul>
+ * <li>{@link #CONTROLS_SURFACE_ACTIVITY_PANEL}
+ * <li>{@link #CONTROLS_SURFACE_DREAM}
+ * </ul>
+ *
+ * This is passed with the intent when the panel specified by {@link #META_DATA_PANEL_ACTIVITY}
+ * is launched.
+ */
+ @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM)
+ public static final String EXTRA_CONTROLS_SURFACE =
+ "android.service.controls.extra.CONTROLS_SURFACE";
+
/**
* @hide
*/
diff --git a/core/java/android/service/controls/flags/flags.aconfig b/core/java/android/service/controls/flags/flags.aconfig
new file mode 100644
index 0000000..3a28844
--- /dev/null
+++ b/core/java/android/service/controls/flags/flags.aconfig
@@ -0,0 +1,8 @@
+package: "android.service.controls.flags"
+
+flag {
+ name: "home_panel_dream"
+ namespace: "systemui"
+ description: "Enables the home controls dream feature."
+ bug: "298025023"
+}
diff --git a/core/java/android/service/notification/NotificationRankingUpdate.java b/core/java/android/service/notification/NotificationRankingUpdate.java
index 46ea158..7660ed9 100644
--- a/core/java/android/service/notification/NotificationRankingUpdate.java
+++ b/core/java/android/service/notification/NotificationRankingUpdate.java
@@ -233,7 +233,7 @@
} finally {
mapParcel.recycle();
// To prevent memory leaks, we can close the ranking map fd here.
- // Because a reference to this still exists
+ // This is safe to do because a reference to this still exists.
if (buffer != null && mRankingMapFd != null) {
SharedMemory.unmap(buffer);
mRankingMapFd.close();
diff --git a/core/java/android/service/notification/ZenPolicy.java b/core/java/android/service/notification/ZenPolicy.java
index 3a4a0c5..b1680ab 100644
--- a/core/java/android/service/notification/ZenPolicy.java
+++ b/core/java/android/service/notification/ZenPolicy.java
@@ -1241,7 +1241,7 @@
* @hide
*/
public byte[] toProto() {
- // TODO: b/308672510 - log new ZenPolicy fields to DNDPolicyProto.
+ // TODO: b/308672510 - log user-customized ZenPolicy fields to DNDPolicyProto.
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
ProtoOutputStream proto = new ProtoOutputStream(bytes);
@@ -1267,6 +1267,10 @@
proto.write(DNDPolicyProto.ALLOW_MESSAGES_FROM, getPriorityMessageSenders());
proto.write(DNDPolicyProto.ALLOW_CONVERSATIONS_FROM, getPriorityConversationSenders());
+ if (Flags.modesApi()) {
+ proto.write(DNDPolicyProto.ALLOW_CHANNELS, getAllowedChannels());
+ }
+
proto.flush();
return bytes.toByteArray();
}
diff --git a/core/java/android/service/timezone/TEST_MAPPING b/core/java/android/service/timezone/TEST_MAPPING
index e5910ea..bf46ff2 100644
--- a/core/java/android/service/timezone/TEST_MAPPING
+++ b/core/java/android/service/timezone/TEST_MAPPING
@@ -7,10 +7,7 @@
"include-filter": "android.service."
}
]
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "CtsLocationTimeZoneManagerHostTest"
}
diff --git a/core/java/android/service/voice/HotwordDetectionServiceFailure.java b/core/java/android/service/voice/HotwordDetectionServiceFailure.java
index 420dac1..c8b60c4 100644
--- a/core/java/android/service/voice/HotwordDetectionServiceFailure.java
+++ b/core/java/android/service/voice/HotwordDetectionServiceFailure.java
@@ -89,6 +89,11 @@
@FlaggedApi(Flags.FLAG_ALLOW_TRAINING_DATA_EGRESS_FROM_HDS)
public static final int ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION = 9;
+ /** Indicates shutdown of {@link HotwordDetectionService} due to voice activation op being
+ * disabled. */
+ @FlaggedApi(Flags.FLAG_ALLOW_TRAINING_DATA_EGRESS_FROM_HDS)
+ public static final int ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED = 10;
+
/**
* @hide
*/
@@ -100,7 +105,10 @@
ERROR_CODE_DETECT_TIMEOUT,
ERROR_CODE_ON_DETECTED_SECURITY_EXCEPTION,
ERROR_CODE_ON_DETECTED_STREAM_COPY_FAILURE,
- ERROR_CODE_REMOTE_EXCEPTION
+ ERROR_CODE_REMOTE_EXCEPTION,
+ ERROR_CODE_ON_TRAINING_DATA_EGRESS_LIMIT_EXCEEDED,
+ ERROR_CODE_ON_TRAINING_DATA_SECURITY_EXCEPTION,
+ ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface HotwordDetectionServiceErrorCode {}
diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java
index e6fcc0c..388f08a 100644
--- a/core/java/android/speech/SpeechRecognizer.java
+++ b/core/java/android/speech/SpeechRecognizer.java
@@ -28,31 +28,15 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
-import android.os.Binder;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.CloseGuard;
-import android.util.Log;
-import android.util.Slog;
import com.android.internal.R;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.Reference;
import java.util.List;
-import java.util.Objects;
-import java.util.Queue;
import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
/**
* This class provides access to the speech recognition service. This service allows access to the
@@ -72,11 +56,6 @@
* permission to use this class.
*/
public class SpeechRecognizer {
- /** DEBUG value to enable verbose debug prints */
- private static final boolean DBG = false;
-
- /** Log messages identifier */
- private static final String TAG = "SpeechRecognizer";
/**
* Key used to retrieve an {@code ArrayList<String>} from the {@link Bundle} passed to the
@@ -303,106 +282,17 @@
private static final int MSG_CHECK_RECOGNITION_SUPPORT = 6;
private static final int MSG_TRIGGER_MODEL_DOWNLOAD = 7;
- /** The actual RecognitionService endpoint */
- private IRecognitionService mService;
-
- private final CloseGuard mCloseGuard = new CloseGuard();
-
- /** Context with which the manager was created */
- private final Context mContext;
-
- /** Component to direct service intent to */
- private final ComponentName mServiceComponent;
-
- /** Whether to use on-device speech recognizer. */
- private final boolean mOnDevice;
-
- private IRecognitionServiceManager mManagerService;
-
- /** Handler that will execute the main tasks */
- private Handler mHandler = new Handler(Looper.getMainLooper()) {
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_START:
- handleStartListening((Intent) msg.obj);
- break;
- case MSG_STOP:
- handleStopMessage();
- break;
- case MSG_CANCEL:
- handleCancelMessage();
- break;
- case MSG_CHANGE_LISTENER:
- handleChangeListener((RecognitionListener) msg.obj);
- break;
- case MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT:
- handleSetTemporaryComponent((ComponentName) msg.obj);
- break;
- case MSG_CHECK_RECOGNITION_SUPPORT:
- CheckRecognitionSupportArgs args = (CheckRecognitionSupportArgs) msg.obj;
- handleCheckRecognitionSupport(
- args.mIntent, args.mCallbackExecutor, args.mCallback);
- break;
- case MSG_TRIGGER_MODEL_DOWNLOAD:
- ModelDownloadListenerArgs modelDownloadListenerArgs =
- (ModelDownloadListenerArgs) msg.obj;
- handleTriggerModelDownload(
- modelDownloadListenerArgs.mIntent,
- modelDownloadListenerArgs.mExecutor,
- modelDownloadListenerArgs.mModelDownloadListener);
- break;
- }
- }
- };
-
- /**
- * Temporary queue, saving the messages until the connection will be established, afterwards,
- * only mHandler will receive the messages
- */
- private final Queue<Message> mPendingTasks = new LinkedBlockingQueue<>();
-
- /** The Listener that will receive all the callbacks */
- private final InternalRecognitionListener mListener = new InternalRecognitionListener();
-
- private final IBinder mClientToken = new Binder();
-
- /**
- * The right way to create a {@code SpeechRecognizer} is by using
- * {@link #createSpeechRecognizer} static factory method
- */
- private SpeechRecognizer(final Context context, final ComponentName serviceComponent) {
- this(context, serviceComponent, false);
- }
-
- /**
- * The right way to create a {@code SpeechRecognizer} is by using
- * {@link #createOnDeviceSpeechRecognizer} static factory method
- */
- private SpeechRecognizer(final Context context, boolean onDevice) {
- this(context, null, onDevice);
- }
-
- private SpeechRecognizer(
- final Context context,
- final ComponentName serviceComponent,
- final boolean onDevice) {
- mContext = context;
- mServiceComponent = serviceComponent;
- mOnDevice = onDevice;
- mCloseGuard.open("SpeechRecognizer#destroy()");
- }
+ SpeechRecognizer() { }
/**
* Checks whether a speech recognition service is available on the system. If this method
* returns {@code false}, {@link SpeechRecognizer#createSpeechRecognizer(Context)} will
* fail.
- *
+ *
* @param context with which {@code SpeechRecognizer} will be created
* @return {@code true} if recognition is available, {@code false} otherwise
*/
- public static boolean isRecognitionAvailable(@NonNull final Context context) {
+ public static boolean isRecognitionAvailable(@NonNull Context context) {
// TODO(b/176578753): make sure this works well with system speech recognizers.
final List<ResolveInfo> list = context.getPackageManager().queryIntentServices(
new Intent(RecognitionService.SERVICE_INTERFACE), 0);
@@ -418,7 +308,7 @@
* @param context with which on-device {@code SpeechRecognizer} will be created
* @return {@code true} if on-device recognition is available, {@code false} otherwise
*/
- public static boolean isOnDeviceRecognitionAvailable(@NonNull final Context context) {
+ public static boolean isOnDeviceRecognitionAvailable(@NonNull Context context) {
ComponentName componentName =
ComponentName.unflattenFromString(
context.getString(R.string.config_defaultOnDeviceSpeechRecognitionService));
@@ -449,7 +339,7 @@
* @return a new {@code SpeechRecognizer}
*/
@MainThread
- public static SpeechRecognizer createSpeechRecognizer(final Context context) {
+ public static SpeechRecognizer createSpeechRecognizer(Context context) {
return createSpeechRecognizer(context, null);
}
@@ -483,19 +373,19 @@
* </queries>
* }</pre>
*
- * @param context in which to create {@code SpeechRecognizer}
+ * @param context in which to create {@code SpeechRecognizer}
* @param serviceComponent the {@link ComponentName} of a specific service to direct this
- * {@code SpeechRecognizer} to
+ * {@code SpeechRecognizer} to
* @return a new {@code SpeechRecognizer}
*/
@MainThread
- public static SpeechRecognizer createSpeechRecognizer(final Context context,
- final ComponentName serviceComponent) {
+ public static SpeechRecognizer createSpeechRecognizer(Context context,
+ ComponentName serviceComponent) {
if (context == null) {
throw new IllegalArgumentException("Context cannot be null");
}
- checkIsCalledFromMainThread();
- return new SpeechRecognizer(context, serviceComponent);
+ SpeechRecognizerImpl.checkIsCalledFromMainThread();
+ return wrapWithProxy(new SpeechRecognizerImpl(context, serviceComponent));
}
/**
@@ -515,11 +405,15 @@
*/
@NonNull
@MainThread
- public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull final Context context) {
+ public static SpeechRecognizer createOnDeviceSpeechRecognizer(@NonNull Context context) {
if (!isOnDeviceRecognitionAvailable(context)) {
throw new UnsupportedOperationException("On-device recognition is not available");
}
- return lenientlyCreateOnDeviceSpeechRecognizer(context);
+ return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
+ }
+
+ private static SpeechRecognizer wrapWithProxy(SpeechRecognizer delegate) {
+ return new SpeechRecognizerProxy(delegate);
}
/**
@@ -532,42 +426,21 @@
@NonNull
@MainThread
public static SpeechRecognizer createOnDeviceTestingSpeechRecognizer(
- @NonNull final Context context) {
- return lenientlyCreateOnDeviceSpeechRecognizer(context);
- }
-
- @NonNull
- @MainThread
- private static SpeechRecognizer lenientlyCreateOnDeviceSpeechRecognizer(
- @NonNull final Context context) {
- if (context == null) {
- throw new IllegalArgumentException("Context cannot be null");
- }
- checkIsCalledFromMainThread();
- return new SpeechRecognizer(context, /* onDevice */ true);
+ @NonNull Context context) {
+ return wrapWithProxy(SpeechRecognizerImpl.lenientlyCreateOnDeviceSpeechRecognizer(context));
}
/**
* Sets the listener that will receive all the callbacks. The previous unfinished commands will
* be executed with the old listener, while any following command will be executed with the new
* listener.
- *
+ *
* @param listener listener that will receive all the callbacks from the created
- * {@link SpeechRecognizer}, this must not be null.
+ * {@link SpeechRecognizer}, this must not be null.
*/
@MainThread
public void setRecognitionListener(RecognitionListener listener) {
- checkIsCalledFromMainThread();
- if (mListener.mInternalListener == null) {
- // This shortcut is needed because otherwise, if there's an error connecting, it never
- // gets delivered. I.e., the onSuccess callback set up in connectToSystemService does
- // not get called, MSG_CHANGE_LISTENER does not get executed, so the onError in the same
- // place does not get forwarded anywhere.
- // Thread-wise, this is safe as both this method and the handler are on the UI thread.
- handleChangeListener(listener);
- } else {
- putMessage(Message.obtain(mHandler, MSG_CHANGE_LISTENER, listener));
- }
+ throw new UnsupportedOperationException();
}
/**
@@ -576,28 +449,13 @@
* no notifications will be received.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}. If these values are
- * not set explicitly, default values will be used by the recognizer.
+ * may also contain optional extras, see {@link RecognizerIntent}. If
+ * these values are not set explicitly, default values will be used by
+ * the recognizer.
*/
@MainThread
- public void startListening(final Intent recognizerIntent) {
- if (recognizerIntent == null) {
- throw new IllegalArgumentException("intent must not be null");
- }
- checkIsCalledFromMainThread();
-
- if (DBG) {
- Slog.i(TAG, "#startListening called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch #startListening.
- connectToSystemService();
- }
- putMessage(Message.obtain(mHandler, MSG_START, recognizerIntent));
+ public void startListening(Intent recognizerIntent) {
+ throw new UnsupportedOperationException();
}
/**
@@ -621,16 +479,7 @@
*/
@MainThread
public void stopListening() {
- checkIsCalledFromMainThread();
-
- if (DBG) {
- Slog.i(TAG, "#stopListening called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- putMessage(Message.obtain(mHandler, MSG_STOP));
+ throw new UnsupportedOperationException();
}
/**
@@ -640,8 +489,7 @@
*/
@MainThread
public void cancel() {
- checkIsCalledFromMainThread();
- putMessage(Message.obtain(mHandler, MSG_CANCEL));
+ throw new UnsupportedOperationException();
}
/**
@@ -649,30 +497,15 @@
* {@link SpeechRecognizer#startListening(Intent)}.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras. See {@link RecognizerIntent} for the list of
- * supported extras, any unlisted extra might be ignored.
- * @param supportListener the listener on which to receive the support query results.
+ * may also contain optional extras. See {@link RecognizerIntent} for
+ * the list of supported extras, any unlisted extra might be ignored.
+ * @param supportListener the listener on which to receive the support query results.
*/
public void checkRecognitionSupport(
@NonNull Intent recognizerIntent,
@NonNull @CallbackExecutor Executor executor,
@NonNull RecognitionSupportCallback supportListener) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- Objects.requireNonNull(supportListener, "listener must not be null");
-
- if (DBG) {
- Slog.i(TAG, "#checkRecognitionSupport called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
-
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
- new CheckRecognitionSupportArgs(recognizerIntent, executor, supportListener)));
+ throw new UnsupportedOperationException();
}
/**
@@ -681,23 +514,10 @@
* {@link #checkRecognitionSupport(Intent, Executor, RecognitionSupportCallback)}.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}.
+ * may also contain optional extras, see {@link RecognizerIntent}.
*/
public void triggerModelDownload(@NonNull Intent recognizerIntent) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- if (DBG) {
- Slog.i(TAG, "#triggerModelDownload without a listener called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(
- mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
- new ModelDownloadListenerArgs(recognizerIntent, null, null)));
+ throw new UnsupportedOperationException();
}
/**
@@ -725,28 +545,15 @@
* {@link ModelDownloadListener#onError(int)} will be called.
*
* @param recognizerIntent contains parameters for the recognition to be performed. The intent
- * may also contain optional extras, see {@link RecognizerIntent}.
- * @param executor for dispatching listener callbacks
- * @param listener on which to receive updates about the model download request.
+ * may also contain optional extras, see {@link RecognizerIntent}.
+ * @param executor for dispatching listener callbacks
+ * @param listener on which to receive updates about the model download request.
*/
public void triggerModelDownload(
@NonNull Intent recognizerIntent,
@NonNull @CallbackExecutor Executor executor,
@NonNull ModelDownloadListener listener) {
- Objects.requireNonNull(recognizerIntent, "intent must not be null");
- if (DBG) {
- Slog.i(TAG, "#triggerModelDownload with a listener called");
- if (mService == null) {
- Slog.i(TAG, "Connection is not established yet");
- }
- }
- if (mService == null) {
- // First time connection: first establish a connection, then dispatch.
- connectToSystemService();
- }
- putMessage(Message.obtain(
- mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
- new ModelDownloadListenerArgs(recognizerIntent, executor, listener)));
+ throw new UnsupportedOperationException();
}
/**
@@ -755,479 +562,19 @@
* <p>This is only expected to be called in tests, system would reject calls from client apps.
*
* @param componentName name of the component to set temporary replace speech recognizer. {@code
- * null} value resets the recognizer to default.
- *
+ * null} value resets the recognizer to default.
* @hide
*/
@TestApi
@RequiresPermission(Manifest.permission.MANAGE_SPEECH_RECOGNITION)
public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
- mHandler.sendMessage(
- Message.obtain(mHandler, MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT, componentName));
+ throw new UnsupportedOperationException();
}
- private static void checkIsCalledFromMainThread() {
- if (Looper.myLooper() != Looper.getMainLooper()) {
- throw new RuntimeException(
- "SpeechRecognizer should be used only from the application's main thread");
- }
- }
-
- private void putMessage(Message msg) {
- if (mService == null) {
- mPendingTasks.offer(msg);
- } else {
- mHandler.sendMessage(msg);
- }
- }
-
- /** sends the actual message to the service */
- private void handleStartListening(Intent recognizerIntent) {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.startListening(recognizerIntent, mListener, mContext.getAttributionSource());
- if (DBG) Log.d(TAG, "service start listening command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "startListening() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- /** sends the actual message to the service */
- private void handleStopMessage() {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.stopListening(mListener);
- if (DBG) Log.d(TAG, "service stop listening command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "stopListening() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- /** sends the actual message to the service */
- private void handleCancelMessage() {
- if (!checkOpenConnection()) {
- return;
- }
- try {
- mService.cancel(mListener, /*isShutdown*/ false);
- if (DBG) Log.d(TAG, "service cancel command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "cancel() failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
-
- private void handleSetTemporaryComponent(ComponentName componentName) {
- if (DBG) {
- Log.d(TAG, "handleSetTemporaryComponent, componentName=" + componentName);
- }
-
- if (!maybeInitializeManagerService()) {
- return;
- }
-
- try {
- mManagerService.setTemporaryComponent(componentName);
- } catch (final RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- private void handleCheckRecognitionSupport(
- Intent recognizerIntent,
- Executor callbackExecutor,
- RecognitionSupportCallback recognitionSupportCallback) {
- if (!maybeInitializeManagerService() || !checkOpenConnection()) {
- return;
- }
- try {
- mService.checkRecognitionSupport(
- recognizerIntent,
- mContext.getAttributionSource(),
- new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
- if (DBG) Log.d(TAG, "service support command succeeded");
- } catch (final Exception e) {
- Log.e(TAG, "checkRecognitionSupport() failed", e);
- callbackExecutor.execute(() -> recognitionSupportCallback.onError(ERROR_CLIENT));
- }
- }
-
- private void handleTriggerModelDownload(
- Intent recognizerIntent,
- @Nullable Executor callbackExecutor,
- @Nullable ModelDownloadListener modelDownloadListener) {
- if (!maybeInitializeManagerService() || !checkOpenConnection()) {
- return;
- }
-
- // Trigger model download without a listener.
- if (modelDownloadListener == null) {
- try {
- mService.triggerModelDownload(
- recognizerIntent, mContext.getAttributionSource(), null);
- if (DBG) Log.d(TAG, "triggerModelDownload() without a listener");
- } catch (final Exception e) {
- Log.e(TAG, "triggerModelDownload() without a listener failed", e);
- mListener.onError(ERROR_CLIENT);
- }
- }
- // Trigger model download with a listener.
- else {
- try {
- mService.triggerModelDownload(
- recognizerIntent, mContext.getAttributionSource(),
- new InternalModelDownloadListener(callbackExecutor, modelDownloadListener));
- if (DBG) Log.d(TAG, "triggerModelDownload() with a listener");
- } catch (final Exception e) {
- Log.e(TAG, "triggerModelDownload() with a listener failed", e);
- callbackExecutor.execute(() -> modelDownloadListener.onError(ERROR_CLIENT));
- }
- }
- }
-
- private boolean checkOpenConnection() {
- if (mService != null && mService.asBinder().isBinderAlive()) {
- return true;
- }
- mListener.onError(ERROR_CLIENT);
- Log.e(TAG, "not connected to the recognition service");
- return false;
- }
-
- /** changes the listener */
- private void handleChangeListener(RecognitionListener listener) {
- if (DBG) Log.d(TAG, "handleChangeListener, listener=" + listener);
- mListener.mInternalListener = listener;
- }
-
- /** Destroys the {@code SpeechRecognizer} object. */
+ /**
+ * Destroys the {@code SpeechRecognizer} object.
+ */
public void destroy() {
- try {
- if (mService != null) {
- try {
- mService.cancel(mListener, /*isShutdown*/ true);
- } catch (final Exception e) {
- // Not important
- }
- }
-
- mService = null;
- mPendingTasks.clear();
- mListener.mInternalListener = null;
- mCloseGuard.close();
- } finally {
- Reference.reachabilityFence(this);
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- mCloseGuard.warnIfOpen();
- destroy();
- } finally {
- super.finalize();
- }
- }
-
- /** Establishes a connection to system server proxy and initializes the session. */
- private void connectToSystemService() {
- if (!maybeInitializeManagerService()) {
- return;
- }
-
- ComponentName componentName = getSpeechRecognizerComponentName();
-
- if (!mOnDevice && componentName == null) {
- mListener.onError(ERROR_CLIENT);
- return;
- }
-
- try {
- mManagerService.createSession(
- componentName,
- mClientToken,
- mOnDevice,
- new IRecognitionServiceManagerCallback.Stub(){
- @Override
- public void onSuccess(IRecognitionService service) throws RemoteException {
- if (DBG) {
- Log.i(TAG, "Connected to speech recognition service");
- }
- mService = service;
- while (!mPendingTasks.isEmpty()) {
- mHandler.sendMessage(mPendingTasks.poll());
- }
- }
-
- @Override
- public void onError(int errorCode) throws RemoteException {
- Log.e(TAG, "Bind to system recognition service failed with error "
- + errorCode);
- mListener.onError(errorCode);
- }
- });
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- private synchronized boolean maybeInitializeManagerService() {
- if (DBG) {
- Log.i(TAG, "#maybeInitializeManagerService found = " + mManagerService);
- }
- if (mManagerService != null) {
- return true;
- }
-
- IBinder service = ServiceManager.getService(Context.SPEECH_RECOGNITION_SERVICE);
- if (service == null && mOnDevice) {
- service = (IBinder) mContext.getSystemService(Context.SPEECH_RECOGNITION_SERVICE);
- }
- mManagerService = IRecognitionServiceManager.Stub.asInterface(service);
-
- if (mManagerService == null) {
- if (mListener != null) {
- mListener.onError(ERROR_CLIENT);
- }
- return false;
- }
- return true;
- }
-
- /**
- * Returns the component name to be used for establishing a connection, based on the parameters
- * used during initialization.
- *
- * <p>Note the 3 different scenarios:
- * <ol>
- * <li>On-device speech recognizer which is determined by the manufacturer and not
- * changeable by the user
- * <li>Default user-selected speech recognizer as specified by
- * {@code Settings.Secure.VOICE_RECOGNITION_SERVICE}
- * <li>Custom speech recognizer supplied by the client.
- */
- private ComponentName getSpeechRecognizerComponentName() {
- if (mOnDevice) {
- return null;
- }
-
- if (mServiceComponent != null) {
- return mServiceComponent;
- }
-
- String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.VOICE_RECOGNITION_SERVICE);
-
- if (TextUtils.isEmpty(serviceComponent)) {
- Log.e(TAG, "no selected voice recognition service");
- mListener.onError(ERROR_CLIENT);
- return null;
- }
-
- return ComponentName.unflattenFromString(serviceComponent);
- }
-
- private static class CheckRecognitionSupportArgs {
- final Intent mIntent;
- final Executor mCallbackExecutor;
- final RecognitionSupportCallback mCallback;
-
- private CheckRecognitionSupportArgs(
- Intent intent,
- Executor callbackExecutor,
- RecognitionSupportCallback callback) {
- mIntent = intent;
- mCallbackExecutor = callbackExecutor;
- mCallback = callback;
- }
- }
-
- private static class ModelDownloadListenerArgs {
- final Intent mIntent;
- final Executor mExecutor;
- final ModelDownloadListener mModelDownloadListener;
-
- private ModelDownloadListenerArgs(Intent intent, Executor executor,
- ModelDownloadListener modelDownloadListener) {
- mIntent = intent;
- mExecutor = executor;
- mModelDownloadListener = modelDownloadListener;
- }
- }
-
- /**
- * Internal wrapper of IRecognitionListener which will propagate the results to
- * RecognitionListener
- */
- private static class InternalRecognitionListener extends IRecognitionListener.Stub {
- private RecognitionListener mInternalListener;
-
- private static final int MSG_BEGINNING_OF_SPEECH = 1;
- private static final int MSG_BUFFER_RECEIVED = 2;
- private static final int MSG_END_OF_SPEECH = 3;
- private static final int MSG_ERROR = 4;
- private static final int MSG_READY_FOR_SPEECH = 5;
- private static final int MSG_RESULTS = 6;
- private static final int MSG_PARTIAL_RESULTS = 7;
- private static final int MSG_RMS_CHANGED = 8;
- private static final int MSG_ON_EVENT = 9;
- private static final int MSG_SEGMENT_RESULTS = 10;
- private static final int MSG_SEGMENT_END_SESSION = 11;
- private static final int MSG_LANGUAGE_DETECTION = 12;
-
- private final Handler mInternalHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- if (mInternalListener == null) {
- return;
- }
- switch (msg.what) {
- case MSG_BEGINNING_OF_SPEECH:
- mInternalListener.onBeginningOfSpeech();
- break;
- case MSG_BUFFER_RECEIVED:
- mInternalListener.onBufferReceived((byte[]) msg.obj);
- break;
- case MSG_END_OF_SPEECH:
- mInternalListener.onEndOfSpeech();
- break;
- case MSG_ERROR:
- mInternalListener.onError((Integer) msg.obj);
- break;
- case MSG_READY_FOR_SPEECH:
- mInternalListener.onReadyForSpeech((Bundle) msg.obj);
- break;
- case MSG_RESULTS:
- mInternalListener.onResults((Bundle) msg.obj);
- break;
- case MSG_PARTIAL_RESULTS:
- mInternalListener.onPartialResults((Bundle) msg.obj);
- break;
- case MSG_RMS_CHANGED:
- mInternalListener.onRmsChanged((Float) msg.obj);
- break;
- case MSG_ON_EVENT:
- mInternalListener.onEvent(msg.arg1, (Bundle) msg.obj);
- break;
- case MSG_SEGMENT_RESULTS:
- mInternalListener.onSegmentResults((Bundle) msg.obj);
- break;
- case MSG_SEGMENT_END_SESSION:
- mInternalListener.onEndOfSegmentedSession();
- break;
- case MSG_LANGUAGE_DETECTION:
- mInternalListener.onLanguageDetection((Bundle) msg.obj);
- break;
- }
- }
- };
-
- public void onBeginningOfSpeech() {
- Message.obtain(mInternalHandler, MSG_BEGINNING_OF_SPEECH).sendToTarget();
- }
-
- public void onBufferReceived(final byte[] buffer) {
- Message.obtain(mInternalHandler, MSG_BUFFER_RECEIVED, buffer).sendToTarget();
- }
-
- public void onEndOfSpeech() {
- Message.obtain(mInternalHandler, MSG_END_OF_SPEECH).sendToTarget();
- }
-
- public void onError(final int error) {
- Message.obtain(mInternalHandler, MSG_ERROR, error).sendToTarget();
- }
-
- public void onReadyForSpeech(final Bundle noiseParams) {
- Message.obtain(mInternalHandler, MSG_READY_FOR_SPEECH, noiseParams).sendToTarget();
- }
-
- public void onResults(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_RESULTS, results).sendToTarget();
- }
-
- public void onPartialResults(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_PARTIAL_RESULTS, results).sendToTarget();
- }
-
- public void onRmsChanged(final float rmsdB) {
- Message.obtain(mInternalHandler, MSG_RMS_CHANGED, rmsdB).sendToTarget();
- }
-
- public void onSegmentResults(final Bundle bundle) {
- Message.obtain(mInternalHandler, MSG_SEGMENT_RESULTS, bundle).sendToTarget();
- }
-
- public void onEndOfSegmentedSession() {
- Message.obtain(mInternalHandler, MSG_SEGMENT_END_SESSION).sendToTarget();
- }
-
- public void onLanguageDetection(final Bundle results) {
- Message.obtain(mInternalHandler, MSG_LANGUAGE_DETECTION, results).sendToTarget();
- }
-
- public void onEvent(final int eventType, final Bundle params) {
- Message.obtain(mInternalHandler, MSG_ON_EVENT, eventType, eventType, params)
- .sendToTarget();
- }
- }
-
- private static class InternalSupportCallback extends IRecognitionSupportCallback.Stub {
- private final Executor mExecutor;
- private final RecognitionSupportCallback mCallback;
-
- private InternalSupportCallback(Executor executor, RecognitionSupportCallback callback) {
- this.mExecutor = executor;
- this.mCallback = callback;
- }
-
- @Override
- public void onSupportResult(RecognitionSupport recognitionSupport) throws RemoteException {
- mExecutor.execute(() -> mCallback.onSupportResult(recognitionSupport));
- }
-
- @Override
- public void onError(int errorCode) throws RemoteException {
- mExecutor.execute(() -> mCallback.onError(errorCode));
- }
- }
-
- private static class InternalModelDownloadListener extends IModelDownloadListener.Stub {
- private final Executor mExecutor;
- private final ModelDownloadListener mModelDownloadListener;
-
- private InternalModelDownloadListener(
- Executor executor,
- @NonNull ModelDownloadListener modelDownloadListener) {
- mExecutor = executor;
- mModelDownloadListener = modelDownloadListener;
- }
-
- @Override
- public void onProgress(int completedPercent) throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onProgress(completedPercent));
- }
-
- @Override
- public void onSuccess() throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onSuccess());
- }
-
- @Override
- public void onScheduled() throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onScheduled());
- }
-
- @Override
- public void onError(int error) throws RemoteException {
- mExecutor.execute(() -> mModelDownloadListener.onError(error));
- }
+ throw new UnsupportedOperationException();
}
}
diff --git a/core/java/android/speech/SpeechRecognizerImpl.java b/core/java/android/speech/SpeechRecognizerImpl.java
new file mode 100644
index 0000000..6c00874
--- /dev/null
+++ b/core/java/android/speech/SpeechRecognizerImpl.java
@@ -0,0 +1,745 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.speech;
+
+import android.Manifest;
+import android.annotation.CallbackExecutor;
+import android.annotation.MainThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Slog;
+
+import java.util.Objects;
+import java.util.Queue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+
+/**
+ * @hide
+ */
+class SpeechRecognizerImpl extends SpeechRecognizer {
+ /** DEBUG value to enable verbose debug prints */
+ private static final boolean DBG = false;
+
+ /** Log messages identifier */
+ private static final String TAG = "SpeechRecognizer";
+
+ /** action codes */
+ private static final int MSG_START = 1;
+ private static final int MSG_STOP = 2;
+ private static final int MSG_CANCEL = 3;
+ private static final int MSG_CHANGE_LISTENER = 4;
+ private static final int MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT = 5;
+ private static final int MSG_CHECK_RECOGNITION_SUPPORT = 6;
+ private static final int MSG_TRIGGER_MODEL_DOWNLOAD = 7;
+
+ /** The actual RecognitionService endpoint */
+ private IRecognitionService mService;
+
+ /** Context with which the manager was created */
+ private final Context mContext;
+
+ /** Component to direct service intent to */
+ private final ComponentName mServiceComponent;
+
+ /** Whether to use on-device speech recognizer. */
+ private final boolean mOnDevice;
+
+ private IRecognitionServiceManager mManagerService;
+
+ /** Handler that will execute the main tasks */
+ private Handler mHandler = new Handler(Looper.getMainLooper()) {
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_START:
+ handleStartListening((Intent) msg.obj);
+ break;
+ case MSG_STOP:
+ handleStopMessage();
+ break;
+ case MSG_CANCEL:
+ handleCancelMessage();
+ break;
+ case MSG_CHANGE_LISTENER:
+ handleChangeListener((RecognitionListener) msg.obj);
+ break;
+ case MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT:
+ handleSetTemporaryComponent((ComponentName) msg.obj);
+ break;
+ case MSG_CHECK_RECOGNITION_SUPPORT:
+ CheckRecognitionSupportArgs args = (CheckRecognitionSupportArgs) msg.obj;
+ handleCheckRecognitionSupport(
+ args.mIntent, args.mCallbackExecutor, args.mCallback);
+ break;
+ case MSG_TRIGGER_MODEL_DOWNLOAD:
+ ModelDownloadListenerArgs modelDownloadListenerArgs =
+ (ModelDownloadListenerArgs) msg.obj;
+ handleTriggerModelDownload(
+ modelDownloadListenerArgs.mIntent,
+ modelDownloadListenerArgs.mExecutor,
+ modelDownloadListenerArgs.mModelDownloadListener);
+ break;
+ }
+ }
+ };
+
+ /**
+ * Temporary queue, saving the messages until the connection will be established, afterwards,
+ * only mHandler will receive the messages
+ */
+ private final Queue<Message> mPendingTasks = new LinkedBlockingQueue<>();
+
+ /** The Listener that will receive all the callbacks */
+ private final InternalRecognitionListener mListener = new InternalRecognitionListener();
+
+ private final IBinder mClientToken = new Binder();
+
+ /**
+ * The right way to create a {@code SpeechRecognizer} is by using
+ * {@link #createSpeechRecognizer} static factory method
+ */
+ /* package */ SpeechRecognizerImpl(
+ final Context context,
+ final ComponentName serviceComponent) {
+ this(context, serviceComponent, false);
+ }
+
+ /**
+ * The right way to create a {@code SpeechRecognizer} is by using
+ * {@link #createOnDeviceSpeechRecognizer} static factory method
+ */
+ /* package */ SpeechRecognizerImpl(final Context context, boolean onDevice) {
+ this(context, null, onDevice);
+ }
+
+ private SpeechRecognizerImpl(
+ final Context context,
+ final ComponentName serviceComponent,
+ final boolean onDevice) {
+ mContext = context;
+ mServiceComponent = serviceComponent;
+ mOnDevice = onDevice;
+ }
+
+ @NonNull
+ @MainThread
+ /* package */ static SpeechRecognizerImpl lenientlyCreateOnDeviceSpeechRecognizer(
+ @NonNull final Context context) {
+ if (context == null) {
+ throw new IllegalArgumentException("Context cannot be null");
+ }
+ checkIsCalledFromMainThread();
+ return new SpeechRecognizerImpl(context, /* onDevice */ true);
+ }
+
+ @Override
+ @MainThread
+ public void setRecognitionListener(RecognitionListener listener) {
+ checkIsCalledFromMainThread();
+ if (mListener.mInternalListener == null) {
+ // This shortcut is needed because otherwise, if there's an error connecting, it never
+ // gets delivered. I.e., the onSuccess callback set up in connectToSystemService does
+ // not get called, MSG_CHANGE_LISTENER does not get executed, so the onError in the same
+ // place does not get forwarded anywhere.
+ // Thread-wise, this is safe as both this method and the handler are on the UI thread.
+ handleChangeListener(listener);
+ } else {
+ putMessage(Message.obtain(mHandler, MSG_CHANGE_LISTENER, listener));
+ }
+ }
+
+ @Override
+ @MainThread
+ public void startListening(final Intent recognizerIntent) {
+ if (recognizerIntent == null) {
+ throw new IllegalArgumentException("intent must not be null");
+ }
+ checkIsCalledFromMainThread();
+
+ if (DBG) {
+ Slog.i(TAG, "#startListening called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch #startListening.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(mHandler, MSG_START, recognizerIntent));
+ }
+
+ @Override
+ @MainThread
+ public void stopListening() {
+ checkIsCalledFromMainThread();
+
+ if (DBG) {
+ Slog.i(TAG, "#stopListening called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ putMessage(Message.obtain(mHandler, MSG_STOP));
+ }
+
+ @Override
+ @MainThread
+ public void cancel() {
+ checkIsCalledFromMainThread();
+ putMessage(Message.obtain(mHandler, MSG_CANCEL));
+ }
+
+ @Override
+ public void checkRecognitionSupport(
+ @NonNull Intent recognizerIntent,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull RecognitionSupportCallback supportListener) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ Objects.requireNonNull(supportListener, "listener must not be null");
+
+ if (DBG) {
+ Slog.i(TAG, "#checkRecognitionSupport called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(mHandler, MSG_CHECK_RECOGNITION_SUPPORT,
+ new CheckRecognitionSupportArgs(recognizerIntent, executor, supportListener)));
+ }
+
+ @Override
+ public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ if (DBG) {
+ Slog.i(TAG, "#triggerModelDownload without a listener called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(
+ mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
+ new ModelDownloadListenerArgs(recognizerIntent, null, null)));
+ }
+
+ @Override
+ public void triggerModelDownload(
+ @NonNull Intent recognizerIntent,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull ModelDownloadListener listener) {
+ Objects.requireNonNull(recognizerIntent, "intent must not be null");
+ if (DBG) {
+ Slog.i(TAG, "#triggerModelDownload with a listener called");
+ if (mService == null) {
+ Slog.i(TAG, "Connection is not established yet");
+ }
+ }
+ if (mService == null) {
+ // First time connection: first establish a connection, then dispatch.
+ connectToSystemService();
+ }
+ putMessage(Message.obtain(
+ mHandler, MSG_TRIGGER_MODEL_DOWNLOAD,
+ new ModelDownloadListenerArgs(recognizerIntent, executor, listener)));
+ }
+
+ @Override
+ @RequiresPermission(Manifest.permission.MANAGE_SPEECH_RECOGNITION)
+ public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
+ mHandler.sendMessage(
+ Message.obtain(mHandler, MSG_SET_TEMPORARY_ON_DEVICE_COMPONENT, componentName));
+ }
+
+ /* package */ static void checkIsCalledFromMainThread() {
+ if (Looper.myLooper() != Looper.getMainLooper()) {
+ throw new RuntimeException(
+ "SpeechRecognizer should be used only from the application's main thread");
+ }
+ }
+
+ private void putMessage(Message msg) {
+ if (mService == null) {
+ mPendingTasks.offer(msg);
+ } else {
+ mHandler.sendMessage(msg);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleStartListening(Intent recognizerIntent) {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.startListening(recognizerIntent, mListener, mContext.getAttributionSource());
+ if (DBG) Log.d(TAG, "service start listening command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "startListening() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleStopMessage() {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.stopListening(mListener);
+ if (DBG) Log.d(TAG, "service stop listening command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "stopListening() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ /** sends the actual message to the service */
+ private void handleCancelMessage() {
+ if (!checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.cancel(mListener, /*isShutdown*/ false);
+ if (DBG) Log.d(TAG, "service cancel command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "cancel() failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ }
+
+ private void handleSetTemporaryComponent(ComponentName componentName) {
+ if (DBG) {
+ Log.d(TAG, "handleSetTemporaryComponent, componentName=" + componentName);
+ }
+
+ if (!maybeInitializeManagerService()) {
+ return;
+ }
+
+ try {
+ mManagerService.setTemporaryComponent(componentName);
+ } catch (final RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ private void handleCheckRecognitionSupport(
+ Intent recognizerIntent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback recognitionSupportCallback) {
+ if (!maybeInitializeManagerService() || !checkOpenConnection()) {
+ return;
+ }
+ try {
+ mService.checkRecognitionSupport(
+ recognizerIntent,
+ mContext.getAttributionSource(),
+ new InternalSupportCallback(callbackExecutor, recognitionSupportCallback));
+ if (DBG) Log.d(TAG, "service support command succeeded");
+ } catch (final Exception e) {
+ Log.e(TAG, "checkRecognitionSupport() failed", e);
+ callbackExecutor.execute(() -> recognitionSupportCallback.onError(ERROR_CLIENT));
+ }
+ }
+
+ private void handleTriggerModelDownload(
+ Intent recognizerIntent,
+ @Nullable Executor callbackExecutor,
+ @Nullable ModelDownloadListener modelDownloadListener) {
+ if (!maybeInitializeManagerService() || !checkOpenConnection()) {
+ return;
+ }
+
+ if (modelDownloadListener == null) {
+ // Trigger model download without a listener.
+ try {
+ mService.triggerModelDownload(
+ recognizerIntent, mContext.getAttributionSource(), null);
+ if (DBG) Log.d(TAG, "triggerModelDownload() without a listener");
+ } catch (final Exception e) {
+ Log.e(TAG, "triggerModelDownload() without a listener failed", e);
+ mListener.onError(ERROR_CLIENT);
+ }
+ } else {
+ // Trigger model download with a listener.
+ try {
+ mService.triggerModelDownload(
+ recognizerIntent, mContext.getAttributionSource(),
+ new InternalModelDownloadListener(callbackExecutor, modelDownloadListener));
+ if (DBG) Log.d(TAG, "triggerModelDownload() with a listener");
+ } catch (final Exception e) {
+ Log.e(TAG, "triggerModelDownload() with a listener failed", e);
+ callbackExecutor.execute(() -> modelDownloadListener.onError(ERROR_CLIENT));
+ }
+ }
+ }
+
+ private boolean checkOpenConnection() {
+ if (mService != null && mService.asBinder().isBinderAlive()) {
+ return true;
+ }
+ mListener.onError(ERROR_CLIENT);
+ Log.e(TAG, "not connected to the recognition service");
+ return false;
+ }
+
+ /** changes the listener */
+ private void handleChangeListener(RecognitionListener listener) {
+ if (DBG) Log.d(TAG, "handleChangeListener, listener=" + listener);
+ mListener.mInternalListener = listener;
+ }
+
+ @Override
+ public void destroy() {
+ if (mService != null) {
+ try {
+ mService.cancel(mListener, /*isShutdown*/ true);
+ } catch (final Exception e) {
+ // Not important
+ }
+ }
+
+ mService = null;
+ mPendingTasks.clear();
+ mListener.mInternalListener = null;
+ }
+
+ /** Establishes a connection to system server proxy and initializes the session. */
+ private void connectToSystemService() {
+ if (!maybeInitializeManagerService()) {
+ return;
+ }
+
+ ComponentName componentName = getSpeechRecognizerComponentName();
+
+ if (!mOnDevice && componentName == null) {
+ mListener.onError(ERROR_CLIENT);
+ return;
+ }
+
+ try {
+ mManagerService.createSession(
+ componentName,
+ mClientToken,
+ mOnDevice,
+ new IRecognitionServiceManagerCallback.Stub(){
+ @Override
+ public void onSuccess(IRecognitionService service) throws RemoteException {
+ if (DBG) {
+ Log.i(TAG, "Connected to speech recognition service");
+ }
+ mService = service;
+ while (!mPendingTasks.isEmpty()) {
+ mHandler.sendMessage(mPendingTasks.poll());
+ }
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ Log.e(TAG, "Bind to system recognition service failed with error "
+ + errorCode);
+ mListener.onError(errorCode);
+ }
+ });
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ private synchronized boolean maybeInitializeManagerService() {
+ if (DBG) {
+ Log.i(TAG, "#maybeInitializeManagerService found = " + mManagerService);
+ }
+ if (mManagerService != null) {
+ return true;
+ }
+
+ IBinder service = ServiceManager.getService(Context.SPEECH_RECOGNITION_SERVICE);
+ if (service == null && mOnDevice) {
+ service = (IBinder) mContext.getSystemService(Context.SPEECH_RECOGNITION_SERVICE);
+ }
+ mManagerService = IRecognitionServiceManager.Stub.asInterface(service);
+
+ if (mManagerService == null) {
+ if (mListener != null) {
+ mListener.onError(ERROR_CLIENT);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns the component name to be used for establishing a connection, based on the parameters
+ * used during initialization.
+ *
+ * <p>Note the 3 different scenarios:
+ * <ol>
+ * <li>On-device speech recognizer which is determined by the manufacturer and not
+ * changeable by the user
+ * <li>Default user-selected speech recognizer as specified by
+ * {@code Settings.Secure.VOICE_RECOGNITION_SERVICE}
+ * <li>Custom speech recognizer supplied by the client.
+ * </ol>
+ */
+ @SuppressWarnings("NonUserGetterCalled")
+ private ComponentName getSpeechRecognizerComponentName() {
+ if (mOnDevice) {
+ return null;
+ }
+
+ if (mServiceComponent != null) {
+ return mServiceComponent;
+ }
+
+ String serviceComponent = Settings.Secure.getString(mContext.getContentResolver(),
+ Settings.Secure.VOICE_RECOGNITION_SERVICE);
+
+ if (TextUtils.isEmpty(serviceComponent)) {
+ Log.e(TAG, "no selected voice recognition service");
+ mListener.onError(ERROR_CLIENT);
+ return null;
+ }
+
+ return ComponentName.unflattenFromString(serviceComponent);
+ }
+
+ private static class CheckRecognitionSupportArgs {
+ final Intent mIntent;
+ final Executor mCallbackExecutor;
+ final RecognitionSupportCallback mCallback;
+
+ private CheckRecognitionSupportArgs(
+ Intent intent,
+ Executor callbackExecutor,
+ RecognitionSupportCallback callback) {
+ mIntent = intent;
+ mCallbackExecutor = callbackExecutor;
+ mCallback = callback;
+ }
+ }
+
+ private static class ModelDownloadListenerArgs {
+ final Intent mIntent;
+ final Executor mExecutor;
+ final ModelDownloadListener mModelDownloadListener;
+
+ private ModelDownloadListenerArgs(Intent intent, Executor executor,
+ ModelDownloadListener modelDownloadListener) {
+ mIntent = intent;
+ mExecutor = executor;
+ mModelDownloadListener = modelDownloadListener;
+ }
+ }
+
+ /**
+ * Internal wrapper of IRecognitionListener which will propagate the results to
+ * RecognitionListener
+ */
+ private static class InternalRecognitionListener extends IRecognitionListener.Stub {
+ private RecognitionListener mInternalListener;
+
+ private static final int MSG_BEGINNING_OF_SPEECH = 1;
+ private static final int MSG_BUFFER_RECEIVED = 2;
+ private static final int MSG_END_OF_SPEECH = 3;
+ private static final int MSG_ERROR = 4;
+ private static final int MSG_READY_FOR_SPEECH = 5;
+ private static final int MSG_RESULTS = 6;
+ private static final int MSG_PARTIAL_RESULTS = 7;
+ private static final int MSG_RMS_CHANGED = 8;
+ private static final int MSG_ON_EVENT = 9;
+ private static final int MSG_SEGMENT_RESULTS = 10;
+ private static final int MSG_SEGMENT_END_SESSION = 11;
+ private static final int MSG_LANGUAGE_DETECTION = 12;
+
+ private final Handler mInternalHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ if (mInternalListener == null) {
+ return;
+ }
+ switch (msg.what) {
+ case MSG_BEGINNING_OF_SPEECH:
+ mInternalListener.onBeginningOfSpeech();
+ break;
+ case MSG_BUFFER_RECEIVED:
+ mInternalListener.onBufferReceived((byte[]) msg.obj);
+ break;
+ case MSG_END_OF_SPEECH:
+ mInternalListener.onEndOfSpeech();
+ break;
+ case MSG_ERROR:
+ mInternalListener.onError((Integer) msg.obj);
+ break;
+ case MSG_READY_FOR_SPEECH:
+ mInternalListener.onReadyForSpeech((Bundle) msg.obj);
+ break;
+ case MSG_RESULTS:
+ mInternalListener.onResults((Bundle) msg.obj);
+ break;
+ case MSG_PARTIAL_RESULTS:
+ mInternalListener.onPartialResults((Bundle) msg.obj);
+ break;
+ case MSG_RMS_CHANGED:
+ mInternalListener.onRmsChanged((Float) msg.obj);
+ break;
+ case MSG_ON_EVENT:
+ mInternalListener.onEvent(msg.arg1, (Bundle) msg.obj);
+ break;
+ case MSG_SEGMENT_RESULTS:
+ mInternalListener.onSegmentResults((Bundle) msg.obj);
+ break;
+ case MSG_SEGMENT_END_SESSION:
+ mInternalListener.onEndOfSegmentedSession();
+ break;
+ case MSG_LANGUAGE_DETECTION:
+ mInternalListener.onLanguageDetection((Bundle) msg.obj);
+ break;
+ }
+ }
+ };
+
+ public void onBeginningOfSpeech() {
+ Message.obtain(mInternalHandler, MSG_BEGINNING_OF_SPEECH).sendToTarget();
+ }
+
+ public void onBufferReceived(final byte[] buffer) {
+ Message.obtain(mInternalHandler, MSG_BUFFER_RECEIVED, buffer).sendToTarget();
+ }
+
+ public void onEndOfSpeech() {
+ Message.obtain(mInternalHandler, MSG_END_OF_SPEECH).sendToTarget();
+ }
+
+ public void onError(final int error) {
+ Message.obtain(mInternalHandler, MSG_ERROR, error).sendToTarget();
+ }
+
+ public void onReadyForSpeech(final Bundle noiseParams) {
+ Message.obtain(mInternalHandler, MSG_READY_FOR_SPEECH, noiseParams).sendToTarget();
+ }
+
+ public void onResults(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_RESULTS, results).sendToTarget();
+ }
+
+ public void onPartialResults(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_PARTIAL_RESULTS, results).sendToTarget();
+ }
+
+ public void onRmsChanged(final float rmsdB) {
+ Message.obtain(mInternalHandler, MSG_RMS_CHANGED, rmsdB).sendToTarget();
+ }
+
+ public void onSegmentResults(final Bundle bundle) {
+ Message.obtain(mInternalHandler, MSG_SEGMENT_RESULTS, bundle).sendToTarget();
+ }
+
+ public void onEndOfSegmentedSession() {
+ Message.obtain(mInternalHandler, MSG_SEGMENT_END_SESSION).sendToTarget();
+ }
+
+ public void onLanguageDetection(final Bundle results) {
+ Message.obtain(mInternalHandler, MSG_LANGUAGE_DETECTION, results).sendToTarget();
+ }
+
+ public void onEvent(final int eventType, final Bundle params) {
+ Message.obtain(mInternalHandler, MSG_ON_EVENT, eventType, eventType, params)
+ .sendToTarget();
+ }
+ }
+
+ private static class InternalSupportCallback extends IRecognitionSupportCallback.Stub {
+ private final Executor mExecutor;
+ private final RecognitionSupportCallback mCallback;
+
+ private InternalSupportCallback(Executor executor, RecognitionSupportCallback callback) {
+ this.mExecutor = executor;
+ this.mCallback = callback;
+ }
+
+ @Override
+ public void onSupportResult(RecognitionSupport recognitionSupport) throws RemoteException {
+ mExecutor.execute(() -> mCallback.onSupportResult(recognitionSupport));
+ }
+
+ @Override
+ public void onError(int errorCode) throws RemoteException {
+ mExecutor.execute(() -> mCallback.onError(errorCode));
+ }
+ }
+
+ private static class InternalModelDownloadListener extends IModelDownloadListener.Stub {
+ private final Executor mExecutor;
+ private final ModelDownloadListener mModelDownloadListener;
+
+ private InternalModelDownloadListener(
+ Executor executor,
+ @NonNull ModelDownloadListener modelDownloadListener) {
+ mExecutor = executor;
+ mModelDownloadListener = modelDownloadListener;
+ }
+
+ @Override
+ public void onProgress(int completedPercent) throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onProgress(completedPercent));
+ }
+
+ @Override
+ public void onSuccess() throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onSuccess());
+ }
+
+ @Override
+ public void onScheduled() throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onScheduled());
+ }
+
+ @Override
+ public void onError(int error) throws RemoteException {
+ mExecutor.execute(() -> mModelDownloadListener.onError(error));
+ }
+ }
+}
diff --git a/core/java/android/speech/SpeechRecognizerProxy.java b/core/java/android/speech/SpeechRecognizerProxy.java
new file mode 100644
index 0000000..be9be9a
--- /dev/null
+++ b/core/java/android/speech/SpeechRecognizerProxy.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.speech;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.util.CloseGuard;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.lang.ref.Reference;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ */
+class SpeechRecognizerProxy extends SpeechRecognizer {
+
+ private final CloseGuard mCloseGuard = new CloseGuard();
+
+ private final SpeechRecognizer mDelegate;
+
+ SpeechRecognizerProxy(final SpeechRecognizer delegate) {
+ mDelegate = delegate;
+ mCloseGuard.open("SpeechRecognizer#destroy()");
+ }
+
+ @Override
+ public void setRecognitionListener(RecognitionListener listener) {
+ mDelegate.setRecognitionListener(listener);
+ }
+
+ @Override
+ public void startListening(Intent recognizerIntent) {
+ mDelegate.startListening(recognizerIntent);
+ }
+
+ @Override
+ public void stopListening() {
+ mDelegate.stopListening();
+ }
+
+ @Override
+ public void cancel() {
+ mDelegate.cancel();
+ }
+
+ @Override
+ public void destroy() {
+ try {
+ mCloseGuard.close();
+ mDelegate.destroy();
+ } finally {
+ Reference.reachabilityFence(this);
+ }
+ }
+
+ @Override
+ public void checkRecognitionSupport(
+ @NonNull Intent recognizerIntent,
+ @NonNull Executor executor,
+ @NonNull RecognitionSupportCallback supportListener) {
+ mDelegate.checkRecognitionSupport(recognizerIntent, executor, supportListener);
+ }
+
+ @Override
+ public void triggerModelDownload(@NonNull Intent recognizerIntent) {
+ mDelegate.triggerModelDownload(recognizerIntent);
+ }
+
+ @Override
+ public void triggerModelDownload(
+ @NonNull Intent recognizerIntent,
+ @NonNull Executor executor,
+ @NonNull ModelDownloadListener listener) {
+ mDelegate.triggerModelDownload(recognizerIntent, executor, listener);
+ }
+
+ @Override
+ public void setTemporaryOnDeviceRecognizer(@Nullable ComponentName componentName) {
+ mDelegate.setTemporaryOnDeviceRecognizer(componentName);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ mCloseGuard.warnIfOpen();
+ destroy();
+ } finally {
+ super.finalize();
+ }
+ }
+}
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 47c29d9..89aceb9 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -3913,7 +3913,6 @@
* @see Layout.Builder
*/
@NonNull
- @FlaggedApi(FLAG_USE_BOUNDS_FOR_WIDTH)
public final CharSequence getText() {
return mText;
}
diff --git a/core/java/android/tracing/OWNERS b/core/java/android/tracing/OWNERS
index 079d4c5..2ebe2e9 100644
--- a/core/java/android/tracing/OWNERS
+++ b/core/java/android/tracing/OWNERS
@@ -1,3 +1,6 @@
carmenjackson@google.com
kevinjeon@google.com
+pablogamito@google.com
+natanieljr@google.com
+keanmariotti@google.com
include platform/external/perfetto:/OWNERS
diff --git a/core/java/android/tracing/flags.aconfig b/core/java/android/tracing/flags.aconfig
index 4b4f6d6..c6e8844 100644
--- a/core/java/android/tracing/flags.aconfig
+++ b/core/java/android/tracing/flags.aconfig
@@ -5,4 +5,11 @@
namespace: "windowing_tools"
description: "Move transition tracing to Perfetto"
bug: "309630341"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "perfetto_protolog"
+ namespace: "windowing_tools"
+ description: "Migrate protolog to Perfetto"
+ bug: "276432490"
+}
diff --git a/core/java/android/util/AtomicFile.java b/core/java/android/util/AtomicFile.java
index d084a9e..36800ea 100644
--- a/core/java/android/util/AtomicFile.java
+++ b/core/java/android/util/AtomicFile.java
@@ -48,6 +48,7 @@
* be accessed or modified concurrently by multiple threads or processes. The caller is responsible
* for ensuring appropriate mutual exclusion invariants whenever it accesses the file.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AtomicFile {
private static final String LOG_TAG = "AtomicFile";
@@ -68,6 +69,8 @@
* @hide Internal constructor that also allows you to have the class
* automatically log commit events.
*/
+ @android.ravenwood.annotation.RavenwoodThrow(blockedBy =
+ SystemConfigFileCommitEventLogger.class)
public AtomicFile(File baseName, String commitTag) {
this(baseName, new SystemConfigFileCommitEventLogger(commitTag));
}
diff --git a/core/java/android/util/LruCache.java b/core/java/android/util/LruCache.java
index 3f7fdd8..be1ec41 100644
--- a/core/java/android/util/LruCache.java
+++ b/core/java/android/util/LruCache.java
@@ -18,6 +18,7 @@
import android.compat.annotation.UnsupportedAppUsage;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -61,6 +62,7 @@
* of <a href="http://developer.android.com/sdk/compatibility-library.html">Android's
* Support Package</a> for earlier releases.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LruCache<K, V> {
@UnsupportedAppUsage
private final LinkedHashMap<K, V> map;
@@ -208,7 +210,7 @@
break;
}
- Map.Entry<K, V> toEvict = map.eldest();
+ Map.Entry<K, V> toEvict = eldest();
if (toEvict == null) {
break;
}
@@ -224,6 +226,16 @@
}
}
+ @android.ravenwood.annotation.RavenwoodReplace
+ private Map.Entry<K, V> eldest() {
+ return map.eldest();
+ }
+
+ private Map.Entry<K, V> eldest$ravenwood() {
+ final Iterator<Map.Entry<K, V>> it = map.entrySet().iterator();
+ return it.hasNext() ? it.next() : null;
+ }
+
/**
* Removes the entry for {@code key} if it exists.
*
diff --git a/core/java/android/view/AttachedSurfaceControl.java b/core/java/android/view/AttachedSurfaceControl.java
index fd5517d..f28574e 100644
--- a/core/java/android/view/AttachedSurfaceControl.java
+++ b/core/java/android/view/AttachedSurfaceControl.java
@@ -27,9 +27,6 @@
import com.android.window.flags.Flags;
-import java.util.concurrent.Executor;
-import java.util.function.Consumer;
-
/**
* Provides an interface to the root-Surface of a View Hierarchy or Window. This
* is used in combination with the {@link android.view.SurfaceControl} API to enable
@@ -197,42 +194,6 @@
}
/**
- * Add a trusted presentation listener on the SurfaceControl associated with this window.
- *
- * @param t Transaction that the trusted presentation listener is added on. This should
- * be applied by the caller.
- * @param thresholds The {@link SurfaceControl.TrustedPresentationThresholds} that will specify
- * when the to invoke the callback.
- * @param executor The {@link Executor} where the callback will be invoked on.
- * @param listener The {@link Consumer} that will receive the callbacks when entered or
- * exited the threshold.
- *
- * @see SurfaceControl.Transaction#setTrustedPresentationCallback(SurfaceControl,
- * SurfaceControl.TrustedPresentationThresholds, Executor, Consumer)
- *
- * @hide b/287076178 un-hide with API bump
- */
- default void addTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull SurfaceControl.TrustedPresentationThresholds thresholds,
- @NonNull Executor executor, @NonNull Consumer<Boolean> listener) {
- }
-
- /**
- * Remove a trusted presentation listener on the SurfaceControl associated with this window.
- *
- * @param t Transaction that the trusted presentation listener removed on. This should
- * be applied by the caller.
- * @param listener The {@link Consumer} that was previously registered with
- * addTrustedPresentationCallback that should be removed.
- *
- * @see SurfaceControl.Transaction#clearTrustedPresentationCallback(SurfaceControl)
- * @hide b/287076178 un-hide with API bump
- */
- default void removeTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull Consumer<Boolean> listener) {
- }
-
- /**
* Transfer the currently in progress touch gesture from the host to the requested
* {@link SurfaceControlViewHost.SurfacePackage}. This requires that the
* SurfaceControlViewHost was created with the current host's inputToken.
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 17bbee6d0..36b74e3 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -73,6 +73,8 @@
import android.window.ITaskFpsCallback;
import android.window.ScreenCapture;
import android.window.WindowContextInfo;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
/**
* System private interface to the window manager.
@@ -1075,4 +1077,10 @@
@JavaPassthrough(annotation = "@android.annotation.RequiresPermission(android.Manifest"
+ ".permission.MONITOR_INPUT)")
void unregisterDecorViewGestureListener(IDecorViewGestureListener listener, int displayId);
+
+ void registerTrustedPresentationListener(in IBinder window, in ITrustedPresentationListener listener,
+ in TrustedPresentationThresholds thresholds, int id);
+
+
+ void unregisterTrustedPresentationListener(in ITrustedPresentationListener listener, int id);
}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index d0a4d1a..ad0bf7c 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -197,7 +197,9 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"FRAME_RATE_COMPATIBILITY_"},
- value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE})
+ value = {FRAME_RATE_COMPATIBILITY_DEFAULT, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
+ FRAME_RATE_COMPATIBILITY_EXACT, FRAME_RATE_COMPATIBILITY_NO_VOTE,
+ FRAME_RATE_COMPATIBILITY_MIN, FRAME_RATE_COMPATIBILITY_GTE})
public @interface FrameRateCompatibility {}
// From native_window.h. Keep these in sync.
@@ -242,6 +244,13 @@
*/
public static final int FRAME_RATE_COMPATIBILITY_MIN = 102;
+ // From window.h. Keep these in sync.
+ /**
+ * The surface requests a frame rate that is greater than or equal to {@code frameRate}.
+ * @hide
+ */
+ public static final int FRAME_RATE_COMPATIBILITY_GTE = 103;
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"CHANGE_FRAME_RATE_"},
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d58c07d..a268bca 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -34,6 +34,7 @@
import static android.view.flags.Flags.FLAG_VIEW_VELOCITY_API;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
import static android.view.flags.Flags.viewVelocityApi;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__DEEP_PRESS;
import static com.android.internal.util.FrameworkStatsLog.TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS;
@@ -5154,9 +5155,10 @@
private Runnable mHandwritingDelegatorCallback;
private String mAllowedHandwritingDelegatePackageName;
- // These two fields are set if the view is a handwriting delegate.
+ // These three fields are set if the view is a handwriting delegate.
private boolean mIsHandwritingDelegate;
private String mAllowedHandwritingDelegatorPackageName;
+ private @InputMethodManager.HandwritingDelegateFlags int mHandwritingDelegateFlags;
/**
* Solid color to use as a background when creating the drawing cache. Enables
@@ -12747,6 +12749,30 @@
}
/**
+ * Sets flags configuring the handwriting delegation behavior for this delegate editor view.
+ *
+ * <p>This method has no effect unless {@link #setIsHandwritingDelegate} is also called to
+ * configure this view to act as a handwriting delegate.
+ *
+ * @param flags {@link InputMethodManager#HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED} or
+ * {@code 0}
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public void setHandwritingDelegateFlags(
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
+ mHandwritingDelegateFlags = flags;
+ }
+
+ /**
+ * Returns flags configuring the handwriting delegation behavior for this delegate editor view,
+ * as set by {@link #setHandwritingDelegateFlags}.
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public @InputMethodManager.HandwritingDelegateFlags int getHandwritingDelegateFlags() {
+ return mHandwritingDelegateFlags;
+ }
+
+ /**
* Gets the coordinates of this view in the coordinate space of the
* {@link Surface} that contains the view.
*
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ff1e831..d27f787 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -92,6 +92,7 @@
import static android.view.WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_SYSTEM_BARS;
import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
import static android.view.accessibility.Flags.forceInvertColor;
+import static android.view.accessibility.Flags.reduceWindowContentChangedEventThrottle;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER;
import static android.view.flags.Flags.toolkitSetFrameRateReadOnly;
@@ -122,6 +123,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.database.ContentObserver;
import android.graphics.BLASTBufferQueue;
import android.graphics.Canvas;
import android.graphics.Color;
@@ -391,6 +393,9 @@
*/
private CompatOnBackInvokedCallback mCompatOnBackInvokedCallback;
+ @Nullable
+ private ContentObserver mForceInvertObserver;
+
/**
* Callback for notifying about global configuration changes.
*/
@@ -1596,6 +1601,24 @@
| DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
| DisplayManager.EVENT_FLAG_DISPLAY_REMOVED,
mBasePackageName);
+
+ if (forceInvertColor()) {
+ if (mForceInvertObserver == null) {
+ mForceInvertObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateForceDarkMode();
+ }
+ };
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(
+ Settings.Secure.ACCESSIBILITY_FORCE_INVERT_COLOR_ENABLED
+ ),
+ false,
+ mForceInvertObserver,
+ UserHandle.myUserId());
+ }
+ }
}
/**
@@ -1609,6 +1632,14 @@
DisplayManagerGlobal
.getInstance()
.unregisterDisplayListener(mDisplayListener);
+
+ if (forceInvertColor()) {
+ if (mForceInvertObserver != null) {
+ mContext.getContentResolver().unregisterContentObserver(mForceInvertObserver);
+ mForceInvertObserver = null;
+ }
+ }
+
if (mExtraDisplayListenerLogging) {
Slog.w(mTag, "Unregister listeners: " + mBasePackageName, new Throwable());
}
@@ -2181,8 +2212,14 @@
}
}
- void notifyInsetsAnimationRunningStateChanged(boolean running) {
- mInsetsAnimationRunning = running;
+ /**
+ * Notify the when the running state of a insets animation changed.
+ */
+ @VisibleForTesting
+ public void notifyInsetsAnimationRunningStateChanged(boolean running) {
+ if (sToolkitSetFrameRateReadOnlyFlagValue) {
+ mInsetsAnimationRunning = running;
+ }
}
@Override
@@ -2442,6 +2479,19 @@
if (updateBoundsLayer(t)) {
applyTransactionOnDraw(t);
}
+
+ // Set the frame rate selection strategy to FRAME_RATE_SELECTION_STRATEGY_SELF
+ // This strategy ensures that the frame rate specifications do not cascade down to
+ // the descendant layers. This is particularly important for applications like Chrome,
+ // where child surfaces should adhere to default behavior instead of no preference
+ if (sToolkitSetFrameRateReadOnlyFlagValue) {
+ try {
+ mFrameRateTransaction.setFrameRateSelectionStrategy(sc,
+ sc.FRAME_RATE_SELECTION_STRATEGY_SELF).applyAsyncUnsafe();
+ } catch (Exception e) {
+ Log.e(mTag, "Unable to set frame rate selection strategy ", e);
+ }
+ }
}
private void destroySurface() {
@@ -11361,6 +11411,10 @@
}
private boolean canContinueThrottle(View source, int changeType) {
+ if (!reduceWindowContentChangedEventThrottle()) {
+ // Old behavior. Always throttle.
+ return true;
+ }
if (mSource == null) {
// We don't have a pending event.
return true;
@@ -11919,18 +11973,6 @@
scheduleTraversals();
}
- @Override
- public void addTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull SurfaceControl.TrustedPresentationThresholds thresholds,
- @NonNull Executor executor, @NonNull Consumer<Boolean> listener) {
- t.setTrustedPresentationCallback(getSurfaceControl(), thresholds, executor, listener);
- }
-
- @Override
- public void removeTrustedPresentationCallback(@NonNull SurfaceControl.Transaction t,
- @NonNull Consumer<Boolean> listener) {
- t.clearTrustedPresentationCallback(getSurfaceControl());
- }
private void logAndTrace(String msg) {
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
@@ -11944,7 +11986,7 @@
return;
}
- int frameRateCategory = mIsFrameRateBoosting
+ int frameRateCategory = mIsFrameRateBoosting || mInsetsAnimationRunning
? FRAME_RATE_CATEGORY_HIGH : preferredFrameRateCategory;
try {
@@ -12058,6 +12100,14 @@
}
/**
+ * Get the value of mLastPreferredFrameRateCategory
+ */
+ @VisibleForTesting
+ public int getLastPreferredFrameRateCategory() {
+ return mLastPreferredFrameRateCategory;
+ }
+
+ /**
* Get the value of mPreferredFrameRate
*/
@VisibleForTesting
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 046ea77..f668088 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -122,7 +122,9 @@
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.window.ITrustedPresentationListener;
import android.window.TaskFpsCallback;
+import android.window.TrustedPresentationThresholds;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -5884,4 +5886,35 @@
default boolean replaceContentOnDisplayWithSc(int displayId, @NonNull SurfaceControl sc) {
throw new UnsupportedOperationException();
}
+
+ /**
+ * Add a trusted presentation listener associated with a window. If the listener has already
+ * been registered, an AndroidRuntimeException will be thrown.
+ *
+ * @param window The Window to add the trusted presentation listener for
+ * @param thresholds The {@link TrustedPresentationThresholds} that will specify
+ * when the to invoke the callback.
+ * @param executor The {@link Executor} where the callback will be invoked on.
+ * @param listener The {@link ITrustedPresentationListener} that will receive the callbacks
+ * when entered or exited trusted presentation per the thresholds.
+ *
+ * @hide b/287076178 un-hide with API bump
+ */
+ default void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, @NonNull Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Removes a presentation listener associated with a window. If the listener was not previously
+ * registered, the call will be a noop.
+ *
+ * @hide
+ * @see #registerTrustedPresentationListener(IBinder,
+ * TrustedPresentationThresholds, Executor, Consumer)
+ */
+ default void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index 214f1ec..a7d814e 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -30,9 +30,13 @@
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.AndroidRuntimeException;
+import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
+import android.util.Pair;
import android.view.inputmethod.InputMethodManager;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
import com.android.internal.util.FastPrintWriter;
@@ -43,6 +47,7 @@
import java.util.ArrayList;
import java.util.WeakHashMap;
import java.util.concurrent.Executor;
+import java.util.function.Consumer;
import java.util.function.IntConsumer;
/**
@@ -143,6 +148,9 @@
private Runnable mSystemPropertyUpdater;
+ private final TrustedPresentationListener mTrustedPresentationListener =
+ new TrustedPresentationListener();
+
private WindowManagerGlobal() {
}
@@ -324,7 +332,7 @@
final Context context = view.getContext();
if (context != null
&& (context.getApplicationInfo().flags
- & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
+ & ApplicationInfo.FLAG_HARDWARE_ACCELERATED) != 0) {
wparams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
}
}
@@ -482,7 +490,7 @@
if (who != null) {
WindowLeaked leak = new WindowLeaked(
what + " " + who + " has leaked window "
- + root.getView() + " that was originally added here");
+ + root.getView() + " that was originally added here");
leak.setStackTrace(root.getLocation().getStackTrace());
Log.e(TAG, "", leak);
}
@@ -790,6 +798,86 @@
}
}
+ public void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ mTrustedPresentationListener.addListener(window, thresholds, listener, executor);
+ }
+
+ public void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ mTrustedPresentationListener.removeListener(listener);
+ }
+
+ private final class TrustedPresentationListener extends
+ ITrustedPresentationListener.Stub {
+ private static int sId = 0;
+ private final ArrayMap<Consumer<Boolean>, Pair<Integer, Executor>> mListeners =
+ new ArrayMap<>();
+
+ private final Object mTplLock = new Object();
+
+ private void addListener(IBinder window, TrustedPresentationThresholds thresholds,
+ Consumer<Boolean> listener, Executor executor) {
+ synchronized (mTplLock) {
+ if (mListeners.containsKey(listener)) {
+ throw new AndroidRuntimeException("Trying to add duplicate listener");
+ }
+ int id = sId++;
+ mListeners.put(listener, new Pair<>(id, executor));
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .registerTrustedPresentationListener(window, this, thresholds, id);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ }
+ }
+
+ private void removeListener(Consumer<Boolean> listener) {
+ synchronized (mTplLock) {
+ var removedListener = mListeners.remove(listener);
+ if (removedListener == null) {
+ Log.i(TAG, "listener " + listener + " does not exist.");
+ return;
+ }
+
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .unregisterTrustedPresentationListener(this, removedListener.first);
+ } catch (RemoteException e) {
+ e.rethrowAsRuntimeException();
+ }
+ }
+ }
+
+ @Override
+ public void onTrustedPresentationChanged(int[] inTrustedStateListenerIds,
+ int[] outOfTrustedStateListenerIds) {
+ ArrayList<Runnable> firedListeners = new ArrayList<>();
+ synchronized (mTplLock) {
+ mListeners.forEach((listener, idExecutorPair) -> {
+ final var listenerId = idExecutorPair.first;
+ final var executor = idExecutorPair.second;
+ for (int id : inTrustedStateListenerIds) {
+ if (listenerId == id) {
+ firedListeners.add(() -> executor.execute(
+ () -> listener.accept(/*presentationState*/true)));
+ }
+ }
+ for (int id : outOfTrustedStateListenerIds) {
+ if (listenerId == id) {
+ firedListeners.add(() -> executor.execute(
+ () -> listener.accept(/*presentationState*/false)));
+ }
+ }
+ });
+ }
+ for (int i = 0; i < firedListeners.size(); i++) {
+ firedListeners.get(i).run();
+ }
+ }
+ }
+
/** @hide */
public void addWindowlessRoot(ViewRootImpl impl) {
synchronized (mLock) {
@@ -801,7 +889,7 @@
public void removeWindowlessRoot(ViewRootImpl impl) {
synchronized (mLock) {
mWindowlessRoots.remove(impl);
- }
+ }
}
public void setRecentsAppBehindSystemBars(boolean behindSystemBars) {
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index d7b74b3..b4b1fde 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -37,6 +37,7 @@
import android.util.Log;
import android.window.ITaskFpsCallback;
import android.window.TaskFpsCallback;
+import android.window.TrustedPresentationThresholds;
import android.window.WindowContext;
import android.window.WindowMetricsController;
import android.window.WindowProvider;
@@ -508,4 +509,17 @@
}
return false;
}
+
+ @Override
+ public void registerTrustedPresentationListener(@NonNull IBinder window,
+ @NonNull TrustedPresentationThresholds thresholds, @NonNull Executor executor,
+ @NonNull Consumer<Boolean> listener) {
+ mGlobal.registerTrustedPresentationListener(window, thresholds, executor, listener);
+ }
+
+ @Override
+ public void unregisterTrustedPresentationListener(@NonNull Consumer<Boolean> listener) {
+ mGlobal.unregisterTrustedPresentationListener(listener);
+
+ }
}
diff --git a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
index c337cb4..b299678 100644
--- a/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
+++ b/core/java/android/view/accessibility/flags/accessibility_flags.aconfig
@@ -34,7 +34,7 @@
namespace: "accessibility"
name: "flash_notification_system_api"
description: "Makes flash notification APIs as system APIs for calling from mainline module"
- bug: "282821643"
+ bug: "303131332"
}
flag {
@@ -53,7 +53,21 @@
flag {
namespace: "accessibility"
+ name: "reduce_window_content_changed_event_throttle"
+ description: "Reduces the throttle of AccessibilityEvent of TYPE_WINDOW_CONTENT_CHANGED"
+ bug: "277305460"
+}
+
+flag {
+ namespace: "accessibility"
name: "update_always_on_a11y_service"
description: "Updates the Always-On A11yService state when the user changes the enablement of the shortcut."
bug: "298869916"
}
+
+flag {
+ name: "enable_system_pinch_zoom_gesture"
+ namespace: "accessibility"
+ description: "Feature flag for system pinch zoom gesture detector and related opt-out apis"
+ bug: "283323770"
+}
\ No newline at end of file
diff --git a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
index 614102b..c244287 100644
--- a/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
+++ b/core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java
@@ -514,14 +514,15 @@
@NonNull IInputMethodClient client,
@UserIdInt int userId,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
final IInputMethodManager service = getService();
if (service == null) {
return false;
}
try {
return service.acceptStylusHandwritingDelegation(
- client, userId, delegatePackageName, delegatorPackageName);
+ client, userId, delegatePackageName, delegatorPackageName, flags);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 589b7a3..6d7a543 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -17,6 +17,7 @@
package android.view.inputmethod;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
import static android.view.inputmethod.InputConnection.CURSOR_UPDATE_IMMEDIATE;
import static android.view.inputmethod.InputConnection.CURSOR_UPDATE_MONITOR;
import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.DISPLAY_ID;
@@ -425,6 +426,23 @@
private static final boolean OPTIMIZE_NONEDITABLE_VIEWS =
SystemProperties.getBoolean("debug.imm.optimize_noneditable_views", true);
+ /** @hide */
+ @IntDef(flag = true, prefix = { "HANDWRITING_DELEGATE_FLAG_" }, value = {
+ HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface HandwritingDelegateFlags {}
+
+ /**
+ * Flag indicating that views from the default home screen ({@link Intent#CATEGORY_HOME}) may
+ * act as a handwriting delegator for the delegate editor view. If set, views from the home
+ * screen package will be trusted for handwriting delegation, in addition to views in the {@code
+ * delegatorPackageName} passed to {@link #acceptStylusHandwritingDelegation(View, String,
+ * int)}.
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public static final int HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED = 0x0001;
+
/**
* @deprecated Use {@link IInputMethodManagerGlobalInvoker} instead.
*/
@@ -2345,17 +2363,20 @@
* @see #isStylusHandwritingAvailable()
*/
public void startStylusHandwriting(@NonNull View view) {
- startStylusHandwritingInternal(view, null /* delegatorPackageName */);
+ startStylusHandwritingInternal(
+ view, /* delegatorPackageName= */ null, /* handwritingDelegateFlags= */ 0);
}
private boolean startStylusHandwritingInternal(
- @NonNull View view, @Nullable String delegatorPackageName) {
+ @NonNull View view, @Nullable String delegatorPackageName,
+ @HandwritingDelegateFlags int handwritingDelegateFlags) {
Objects.requireNonNull(view);
// Re-dispatch if there is a context mismatch.
final InputMethodManager fallbackImm = getFallbackInputMethodManagerIfNecessary(view);
if (fallbackImm != null) {
- fallbackImm.startStylusHandwritingInternal(view, delegatorPackageName);
+ fallbackImm.startStylusHandwritingInternal(
+ view, delegatorPackageName, handwritingDelegateFlags);
}
boolean useDelegation = !TextUtils.isEmpty(delegatorPackageName);
@@ -2375,7 +2396,7 @@
if (useDelegation) {
return IInputMethodManagerGlobalInvoker.acceptStylusHandwritingDelegation(
mClient, UserHandle.myUserId(), view.getContext().getOpPackageName(),
- delegatorPackageName);
+ delegatorPackageName, handwritingDelegateFlags);
} else {
IInputMethodManagerGlobalInvoker.startStylusHandwriting(mClient);
}
@@ -2470,16 +2491,17 @@
*/
public boolean acceptStylusHandwritingDelegation(@NonNull View delegateView) {
return startStylusHandwritingInternal(
- delegateView, delegateView.getContext().getOpPackageName());
+ delegateView, delegateView.getContext().getOpPackageName(),
+ delegateView.getHandwritingDelegateFlags());
}
/**
* Accepts and starts a stylus handwriting session on the delegate view, if handwriting
* initiation delegation was previously requested using
- * {@link #prepareStylusHandwritingDelegation(View, String)} from te delegator and the view
+ * {@link #prepareStylusHandwritingDelegation(View, String)} from the delegator and the view
* belongs to a specified delegate package.
*
- * <p>Note: If delegator and delegate are in same application package use
+ * <p>Note: If delegator and delegate are in the same application package, use
* {@link #acceptStylusHandwritingDelegation(View)} instead.</p>
*
* @param delegateView delegate view capable of receiving input via {@link InputConnection}
@@ -2493,8 +2515,35 @@
public boolean acceptStylusHandwritingDelegation(
@NonNull View delegateView, @NonNull String delegatorPackageName) {
Objects.requireNonNull(delegatorPackageName);
+ return startStylusHandwritingInternal(
+ delegateView, delegatorPackageName, delegateView.getHandwritingDelegateFlags());
+ }
- return startStylusHandwritingInternal(delegateView, delegatorPackageName);
+ /**
+ * Accepts and starts a stylus handwriting session on the delegate view, if handwriting
+ * initiation delegation was previously requested using {@link
+ * #prepareStylusHandwritingDelegation(View, String)} from the delegator and the view belongs to
+ * a specified delegate package.
+ *
+ * <p>Note: If delegator and delegate are in the same application package, use {@link
+ * #acceptStylusHandwritingDelegation(View)} instead.
+ *
+ * @param delegateView delegate view capable of receiving input via {@link InputConnection} on
+ * which {@link #startStylusHandwriting(View)} will be called.
+ * @param delegatorPackageName package name of the delegator that handled initial stylus stroke.
+ * @param flags {@link #HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED} or {@code 0}
+ * @return {@code true} if view belongs to allowed delegate package declared in {@link
+ * #prepareStylusHandwritingDelegation(View, String)} and handwriting session can start.
+ * @see #prepareStylusHandwritingDelegation(View, String)
+ * @see #acceptStylusHandwritingDelegation(View)
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public boolean acceptStylusHandwritingDelegation(
+ @NonNull View delegateView, @NonNull String delegatorPackageName,
+ @HandwritingDelegateFlags int flags) {
+ Objects.requireNonNull(delegatorPackageName);
+
+ return startStylusHandwritingInternal(delegateView, delegatorPackageName, flags);
}
/**
diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig
index 7486362..dc6aa6c 100644
--- a/core/java/android/view/inputmethod/flags.aconfig
+++ b/core/java/android/view/inputmethod/flags.aconfig
@@ -31,3 +31,10 @@
bug: "284527000"
is_fixed_read_only: true
}
+
+flag {
+ name: "home_screen_handwriting_delegator"
+ namespace: "input_method"
+ description: "Feature flag for supporting stylus handwriting delegation from RemoteViews on the home screen"
+ bug: "279959705"
+}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 1acebf4..da31348 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -16,11 +16,14 @@
package android.widget;
+import static android.view.inputmethod.Flags.FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR;
+
import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.annotation.ColorRes;
import android.annotation.DimenRes;
import android.annotation.DrawableRes;
+import android.annotation.FlaggedApi;
import android.annotation.IdRes;
import android.annotation.IntDef;
import android.annotation.LayoutRes;
@@ -92,6 +95,7 @@
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.LayoutInflater.Filter;
+import android.view.MotionEvent;
import android.view.RemotableViewMethod;
import android.view.View;
import android.view.ViewGroup;
@@ -239,6 +243,7 @@
private static final int SET_REMOTE_COLLECTION_ITEMS_ADAPTER_TAG = 31;
private static final int ATTRIBUTE_REFLECTION_ACTION_TAG = 32;
private static final int SET_REMOTE_ADAPTER_TAG = 33;
+ private static final int SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG = 34;
/** @hide **/
@IntDef(prefix = "MARGIN_", value = {
@@ -1510,6 +1515,53 @@
}
}
+ /** Helper action to configure handwriting delegation via {@link PendingIntent}. */
+ private class SetOnStylusHandwritingResponse extends Action {
+ final PendingIntent mPendingIntent;
+
+ SetOnStylusHandwritingResponse(@IdRes int id, @Nullable PendingIntent pendingIntent) {
+ this.mViewId = id;
+ this.mPendingIntent = pendingIntent;
+ }
+
+ SetOnStylusHandwritingResponse(@NonNull Parcel parcel) {
+ mViewId = parcel.readInt();
+ mPendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel);
+ }
+
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mViewId);
+ PendingIntent.writePendingIntentOrNullToParcel(mPendingIntent, dest);
+ }
+
+ @Override
+ public void apply(View root, ViewGroup rootParent, ActionApplyParams params) {
+ final View target = root.findViewById(mViewId);
+ if (target == null) return;
+
+ if (hasFlags(FLAG_WIDGET_IS_COLLECTION_CHILD)) {
+ Log.w(LOG_TAG, "Cannot use setOnStylusHandwritingPendingIntent for collection item "
+ + "(id: " + mViewId + ")");
+ return;
+ }
+
+ if (mPendingIntent != null) {
+ RemoteResponse response = RemoteResponse.fromPendingIntent(mPendingIntent);
+ target.setHandwritingDelegatorCallback(
+ () -> response.handleViewInteraction(target, params.handler));
+ target.setAllowedHandwritingDelegatePackage(mPendingIntent.getCreatorPackage());
+ } else {
+ target.setHandwritingDelegatorCallback(null);
+ target.setAllowedHandwritingDelegatePackage(null);
+ }
+ }
+
+ @Override
+ public int getActionTag() {
+ return SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG;
+ }
+ }
+
/**
* Equivalent to calling
* {@link android.widget.CompoundButton#setOnCheckedChangeListener(
@@ -4189,6 +4241,8 @@
return new SetRemoteCollectionItemListAdapterAction(parcel);
case ATTRIBUTE_REFLECTION_ACTION_TAG:
return new AttributeReflectionAction(parcel);
+ case SET_ON_STYLUS_HANDWRITING_RESPONSE_TAG:
+ return new SetOnStylusHandwritingResponse(parcel);
default:
throw new ActionException("Tag " + tag + " not found");
}
@@ -4742,6 +4796,33 @@
}
/**
+ * Equivalent to calling {@link View#setHandwritingDelegatorCallback(Runnable)} to send the
+ * provided {@link PendingIntent}.
+ *
+ * <p>A common use case is a remote view which looks like a text editor but does not actually
+ * support text editing itself, and clicking on the remote view launches an activity containing
+ * an EditText. To support handwriting initiation in this case, this method can be called on the
+ * remote view to configure it as a handwriting delegator, meaning that stylus movement on the
+ * remote view triggers a {@link PendingIntent} and starts handwriting mode for the delegate
+ * EditText. The {@link PendingIntent} is typically the same as the one passed to {@link
+ * #setOnClickPendingIntent} which launches the activity containing the EditText. The EditText
+ * should call {@link View#setIsHandwritingDelegate} to set it as a delegate, and also use
+ * {@link View#setAllowedHandwritingDelegatorPackage} or {@link
+ * android.view.inputmethod.InputMethodManager#HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED}
+ * if necessary to support delegators from the package displaying the remote view.
+ *
+ * @param viewId identifier of the view that will trigger the {@link PendingIntent} when a
+ * stylus {@link MotionEvent} occurs within the view's bounds
+ * @param pendingIntent the {@link PendingIntent} to send, or {@code null} to clear the
+ * handwriting delegation
+ */
+ @FlaggedApi(FLAG_HOME_SCREEN_HANDWRITING_DELEGATOR)
+ public void setOnStylusHandwritingPendingIntent(
+ @IdRes int viewId, @Nullable PendingIntent pendingIntent) {
+ addAction(new SetOnStylusHandwritingResponse(viewId, pendingIntent));
+ }
+
+ /**
* @hide
* Equivalent to calling
* {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)},
diff --git a/core/java/android/widget/ToastPresenter.java b/core/java/android/widget/ToastPresenter.java
index 6884e63..6963237 100644
--- a/core/java/android/widget/ToastPresenter.java
+++ b/core/java/android/widget/ToastPresenter.java
@@ -91,7 +91,6 @@
private final WeakReference<Context> mContext;
private final Resources mResources;
- private final WeakReference<WindowManager> mWindowManager;
private final IAccessibilityManager mAccessibilityManagerService;
private final INotificationManager mNotificationManager;
private final String mPackageName;
@@ -104,7 +103,6 @@
INotificationManager notificationManager, String packageName) {
mContext = new WeakReference<>(context);
mResources = context.getResources();
- mWindowManager = new WeakReference<>(context.getSystemService(WindowManager.class));
mNotificationManager = notificationManager;
mPackageName = packageName;
mContextPackageName = context.getPackageName();
@@ -274,7 +272,7 @@
public void hide(@Nullable ITransientNotificationCallback callback) {
checkState(mView != null, "No toast to hide.");
- final WindowManager windowManager = mWindowManager.get();
+ final WindowManager windowManager = getWindowManager(mView);
if (mView.getParent() != null && windowManager != null) {
windowManager.removeViewImmediate(mView);
}
@@ -295,6 +293,17 @@
mToken = null;
}
+ private WindowManager getWindowManager(View view) {
+ Context context = mContext.get();
+ if (context == null && view != null) {
+ context = view.getContext();
+ }
+ if (context != null) {
+ return context.getSystemService(WindowManager.class);
+ }
+ return null;
+ }
+
/**
* Sends {@link AccessibilityEvent#TYPE_NOTIFICATION_STATE_CHANGED} event if accessibility is
* enabled.
@@ -331,7 +340,7 @@
}
private void addToastView() {
- final WindowManager windowManager = mWindowManager.get();
+ final WindowManager windowManager = getWindowManager(mView);
if (windowManager == null) {
return;
}
diff --git a/core/java/android/window/ITaskOrganizerController.aidl b/core/java/android/window/ITaskOrganizerController.aidl
index e10f7c8..478aeec 100644
--- a/core/java/android/window/ITaskOrganizerController.aidl
+++ b/core/java/android/window/ITaskOrganizerController.aidl
@@ -70,20 +70,4 @@
/** Updates a state of camera compat control for stretched issues in the viewfinder. */
void updateCameraCompatControlState(in WindowContainerToken task, int state);
-
- /**
- * Controls whether ignore orientation request logic in {@link
- * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
- * requested orientations to others.
- *
- * @param isDisabled when {@code true}, the system always ignores the value of {@link
- * com.android.server.wm.DisplayArea#getIgnoreOrientationRequest} and app
- * requested orientation is respected.
- * @param fromOrientations The orientations we want to map to the correspondent orientations
- * in toOrientation.
- * @param toOrientations The orientations we map to the ones in fromOrientations at the same
- * index
- */
- void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- in int[] fromOrientations, in int[] toOrientations);
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/core/java/android/window/ITrustedPresentationListener.aidl
similarity index 75%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to core/java/android/window/ITrustedPresentationListener.aidl
index f4feee1..b33128a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/core/java/android/window/ITrustedPresentationListener.aidl
@@ -13,8 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package android.window;
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+/**
+ * @hide
+ */
+oneway interface ITrustedPresentationListener {
+ void onTrustedPresentationChanged(in int[] enteredTrustedStateIds, in int[] exitedTrustedStateIds);
+}
\ No newline at end of file
diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java
index cd1275c..6d36b57 100644
--- a/core/java/android/window/TaskOrganizer.java
+++ b/core/java/android/window/TaskOrganizer.java
@@ -266,31 +266,6 @@
}
/**
- * Controls whether ignore orientation request logic in {@link
- * com.android.server.wm.DisplayArea} is disabled at runtime and how to optionally map some
- * requested orientation to others.
- *
- * @param isIgnoreOrientationRequestDisabled when {@code true}, the system always ignores the
- * value of {@link com.android.server.wm.DisplayArea#getIgnoreOrientationRequest}
- * and app requested orientation is respected.
- * @param fromOrientations The orientations we want to map to the correspondent orientations
- * in toOrientation.
- * @param toOrientations The orientations we map to the ones in fromOrientations at the same
- * index
- * @hide
- */
- @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
- public void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- @Nullable int[] fromOrientations, @Nullable int[] toOrientations) {
- try {
- mTaskOrganizerController.setOrientationRequestPolicy(isIgnoreOrientationRequestDisabled,
- fromOrientations, toOrientations);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Gets the executor to run callbacks on.
* @hide
*/
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/core/java/android/window/TrustedPresentationListener.java
similarity index 70%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to core/java/android/window/TrustedPresentationListener.java
index f4feee1..02fd6d9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/core/java/android/window/TrustedPresentationListener.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright 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.
@@ -13,8 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package android.window;
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+/**
+ * @hide
+ */
+public interface TrustedPresentationListener {
+
+ void onTrustedPresentationChanged(boolean inTrustedPresentationState);
+
+}
diff --git a/core/java/android/window/TrustedPresentationThresholds.aidl b/core/java/android/window/TrustedPresentationThresholds.aidl
new file mode 100644
index 0000000..d7088bf
--- /dev/null
+++ b/core/java/android/window/TrustedPresentationThresholds.aidl
@@ -0,0 +1,3 @@
+package android.window;
+
+parcelable TrustedPresentationThresholds;
diff --git a/core/java/android/window/TrustedPresentationThresholds.java b/core/java/android/window/TrustedPresentationThresholds.java
new file mode 100644
index 0000000..801d35c
--- /dev/null
+++ b/core/java/android/window/TrustedPresentationThresholds.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.window;
+
+import android.annotation.FloatRange;
+import android.annotation.IntRange;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.view.SurfaceControl;
+
+import androidx.annotation.NonNull;
+
+/**
+ * @hide
+ */
+public final class TrustedPresentationThresholds implements Parcelable {
+ /**
+ * The min alpha the {@link SurfaceControl} is required to have to be considered inside the
+ * threshold.
+ */
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f)
+ public final float mMinAlpha;
+
+ /**
+ * The min fraction of the SurfaceControl that was presented to the user to be considered
+ * inside the threshold.
+ */
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f)
+ public final float mMinFractionRendered;
+
+ /**
+ * The time in milliseconds required for the {@link SurfaceControl} to be in the threshold.
+ */
+ @IntRange(from = 1)
+ public final int mStabilityRequirementMs;
+
+ private void checkValid() {
+ if (mMinAlpha <= 0 || mMinFractionRendered <= 0 || mStabilityRequirementMs < 1) {
+ throw new IllegalArgumentException(
+ "TrustedPresentationThresholds values are invalid");
+ }
+ }
+
+ /**
+ * Creates a new TrustedPresentationThresholds.
+ *
+ * @param minAlpha The min alpha the {@link SurfaceControl} is required to
+ * have to be considered inside the
+ * threshold.
+ * @param minFractionRendered The min fraction of the SurfaceControl that was presented
+ * to the user to be considered
+ * inside the threshold.
+ * @param stabilityRequirementMs The time in milliseconds required for the
+ * {@link SurfaceControl} to be in the threshold.
+ */
+ public TrustedPresentationThresholds(
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f) float minAlpha,
+ @FloatRange(from = 0f, fromInclusive = false, to = 1f) float minFractionRendered,
+ @IntRange(from = 1) int stabilityRequirementMs) {
+ this.mMinAlpha = minAlpha;
+ this.mMinFractionRendered = minFractionRendered;
+ this.mStabilityRequirementMs = stabilityRequirementMs;
+ checkValid();
+ }
+
+ @Override
+ public String toString() {
+ return "TrustedPresentationThresholds { "
+ + "minAlpha = " + mMinAlpha + ", "
+ + "minFractionRendered = " + mMinFractionRendered + ", "
+ + "stabilityRequirementMs = " + mStabilityRequirementMs
+ + " }";
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeFloat(mMinAlpha);
+ dest.writeFloat(mMinFractionRendered);
+ dest.writeInt(mStabilityRequirementMs);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @hide
+ */
+ TrustedPresentationThresholds(@NonNull Parcel in) {
+ mMinAlpha = in.readFloat();
+ mMinFractionRendered = in.readFloat();
+ mStabilityRequirementMs = in.readInt();
+
+ checkValid();
+ }
+
+ /**
+ * @hide
+ */
+ public static final @NonNull Creator<TrustedPresentationThresholds> CREATOR =
+ new Creator<TrustedPresentationThresholds>() {
+ @Override
+ public TrustedPresentationThresholds[] newArray(int size) {
+ return new TrustedPresentationThresholds[size];
+ }
+
+ @Override
+ public TrustedPresentationThresholds createFromParcel(@NonNull Parcel in) {
+ return new TrustedPresentationThresholds(in);
+ }
+ };
+}
diff --git a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
index 9fe30df..727bff4 100644
--- a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
+++ b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig
@@ -14,4 +14,12 @@
description: "Make it possible to move cutout across edges through device config"
bug: "302387383"
is_fixed_read_only: true
-}
\ No newline at end of file
+}
+
+flag {
+ name: "density_390_api"
+ namespace: "large_screen_experiences_app_compat"
+ description: "Whether the API DisplayMetrics.DENSITY_390 is available"
+ bug: "297550533"
+ is_fixed_read_only: true
+}
diff --git a/core/java/com/android/internal/app/NfcResolverActivity.java b/core/java/com/android/internal/app/NfcResolverActivity.java
new file mode 100644
index 0000000..402192a
--- /dev/null
+++ b/core/java/com/android/internal/app/NfcResolverActivity.java
@@ -0,0 +1,59 @@
+/*
+ * 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.internal.app;
+
+import static android.service.chooser.CustomChoosers.EXTRA_RESOLVE_INFOS;
+import static android.service.chooser.Flags.supportNfcResolver;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+
+/**
+ * Caller-customizable variant of {@link ResolverActivity} to support the
+ * {@link CustomChoosers#showNfcResolver()} API.
+ */
+public class NfcResolverActivity extends ResolverActivity {
+
+ @Override
+ @SuppressWarnings("MissingSuperCall") // Called indirectly via `super_onCreate()`.
+ protected void onCreate(Bundle savedInstanceState) {
+ if (!supportNfcResolver()) {
+ super_onCreate(savedInstanceState);
+ finish();
+ return;
+ }
+
+ Intent intent = getIntent();
+ Intent target = intent.getParcelableExtra(Intent.EXTRA_INTENT, Intent.class);
+ ArrayList<ResolveInfo> rList =
+ intent.getParcelableArrayListExtra(EXTRA_RESOLVE_INFOS, ResolveInfo.class);
+ CharSequence title = intent.getExtras().getCharSequence(
+ Intent.EXTRA_TITLE,
+ getResources().getText(com.android.internal.R.string.chooseActivity));
+
+ super.onCreate(
+ savedInstanceState,
+ target,
+ title,
+ /* initialIntents=*/ null,
+ rList,
+ /* supportsAlwaysUseOption=*/ false);
+ }
+}
diff --git a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
index 7be27be..1bd0982 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiSystemPropertiesFlags.java
@@ -87,10 +87,6 @@
public static final Flag NOTIF_COOLDOWN_RULE = devFlag(
"persist.debug.sysui.notification.notif_cooldown_rule", "rule1");
- /** b/301242692: Visit extra URIs used in notifications to prevent security issues. */
- public static final Flag VISIT_RISKY_URIS = devFlag(
- "persist.sysui.notification.visit_risky_uris");
-
/** b/303716154: For debugging only: use short bitmap duration. */
public static final Flag DEBUG_SHORT_BITMAP_DURATION = devFlag(
"persist.sysui.notification.debug_short_bitmap_duration");
diff --git a/core/java/com/android/internal/protolog/ProtoLogGroup.java b/core/java/com/android/internal/protolog/ProtoLogGroup.java
index 4bb7c33..8c2a525 100644
--- a/core/java/com/android/internal/protolog/ProtoLogGroup.java
+++ b/core/java/com/android/internal/protolog/ProtoLogGroup.java
@@ -93,6 +93,7 @@
WM_DEBUG_DREAM(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, true, Consts.TAG_WM),
WM_DEBUG_DIMMER(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
+ WM_DEBUG_TPL(Consts.ENABLE_DEBUG, Consts.ENABLE_LOG_TO_PROTO_DEBUG, false, Consts.TAG_WM),
TEST_GROUP(true, true, false, "WindowManagerProtoLogTest");
private final boolean mEnabled;
diff --git a/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java b/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
index 84e8647..23df304 100644
--- a/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
+++ b/core/java/com/android/internal/vibrator/persistence/SerializedVibrationEffect.java
@@ -65,9 +65,9 @@
@Override
public void write(@NonNull TypedXmlSerializer serializer)
throws IOException {
- serializer.startTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION);
+ serializer.startTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION_EFFECT);
writeContent(serializer);
- serializer.endTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION);
+ serializer.endTag(XmlConstants.NAMESPACE, XmlConstants.TAG_VIBRATION_EFFECT);
}
@Override
diff --git a/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java b/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
index 3561fe4..2b8b61d 100644
--- a/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
+++ b/core/java/com/android/internal/vibrator/persistence/VibrationEffectXmlParser.java
@@ -18,7 +18,7 @@
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_PREDEFINED_EFFECT;
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_PRIMITIVE_EFFECT;
-import static com.android.internal.vibrator.persistence.XmlConstants.TAG_VIBRATION;
+import static com.android.internal.vibrator.persistence.XmlConstants.TAG_VIBRATION_EFFECT;
import static com.android.internal.vibrator.persistence.XmlConstants.TAG_WAVEFORM_EFFECT;
import android.annotation.NonNull;
@@ -44,9 +44,9 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <predefined-effect name="click" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -54,7 +54,7 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <waveform-effect>
* <waveform-entry amplitude="default" durationMs="10" />
* <waveform-entry amplitude="0" durationMs="10" />
@@ -65,7 +65,7 @@
* <waveform-entry amplitude="255" durationMs="20" />
* </repeating>
* </waveform-effect>
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -73,10 +73,10 @@
*
* <pre>
* {@code
- * <vibration>
+ * <vibration-effect>
* <primitive-effect name="click" />
* <primitive-effect name="tick" scale="0.5" delayMs="100" />
- * </vibration>
+ * </vibration-effect>
* }
* </pre>
*
@@ -94,7 +94,7 @@
public static XmlSerializedVibration<VibrationEffect> parseTag(
@NonNull TypedXmlPullParser parser, @XmlConstants.Flags int flags)
throws XmlParserException, IOException {
- XmlValidator.checkStartTag(parser, TAG_VIBRATION);
+ XmlValidator.checkStartTag(parser, TAG_VIBRATION_EFFECT);
XmlValidator.checkTagHasNoUnexpectedAttributes(parser);
return parseVibrationContent(parser, flags);
diff --git a/core/java/com/android/internal/vibrator/persistence/XmlConstants.java b/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
index 6b69a15..8b92153 100644
--- a/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
+++ b/core/java/com/android/internal/vibrator/persistence/XmlConstants.java
@@ -35,7 +35,7 @@
public static final String NAMESPACE = null;
- public static final String TAG_VIBRATION = "vibration";
+ public static final String TAG_VIBRATION_EFFECT = "vibration-effect";
public static final String TAG_VIBRATION_SELECT = "vibration-select";
public static final String TAG_PREDEFINED_EFFECT = "predefined-effect";
diff --git a/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java b/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
index f807ab9..3233fa2 100644
--- a/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
+++ b/core/java/com/android/internal/vibrator/persistence/XmlSerializedVibration.java
@@ -54,7 +54,8 @@
*
* <p>This allows the same serialized representation of a vibration to be used in different
* contexts (e.g. a {@link android.os.VibrationEffect} can be written into any of the tags
- * {@code <vibration>}, {@code <parallel-vibration>} or {@code <vibration vibratorId="0">}).
+ * {@code <vibration-effect>}, {@code <parallel-vibration-effect>}
+ * or {@code <vibration-effect vibratorId="0">}).
*
* @param serializer The output XML serializer where the vibration will be written
*/
diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl
index 1c3fd93..595bf3b 100644
--- a/core/java/com/android/internal/view/IInputMethodManager.aidl
+++ b/core/java/com/android/internal/view/IInputMethodManager.aidl
@@ -152,8 +152,8 @@
in String delegatorPackageName);
/** Accepts and starts a stylus handwriting session for the delegate view **/
- boolean acceptStylusHandwritingDelegation(in IInputMethodClient client,
- in int userId, in String delegatePackageName, in String delegatorPackageName);
+ boolean acceptStylusHandwritingDelegation(in IInputMethodClient client, in int userId,
+ in String delegatePackageName, in String delegatorPackageName, int flags);
/** Returns {@code true} if currently selected IME supports Stylus handwriting. */
@JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = "
diff --git a/core/java/com/android/server/LocalServices.java b/core/java/com/android/server/LocalServices.java
index 9c632ea..2a10918 100644
--- a/core/java/com/android/server/LocalServices.java
+++ b/core/java/com/android/server/LocalServices.java
@@ -29,6 +29,7 @@
*
* {@hide}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class LocalServices {
private LocalServices() {}
@@ -69,4 +70,14 @@
sLocalServiceObjects.remove(type);
}
}
+
+ /**
+ * Remove all known service instances, must be only used in tests.
+ */
+ @VisibleForTesting
+ public static void removeAllServicesForTest() {
+ synchronized (sLocalServiceObjects) {
+ sLocalServiceObjects.clear();
+ }
+ }
}
diff --git a/core/jni/android_os_PerformanceHintManager.cpp b/core/jni/android_os_PerformanceHintManager.cpp
index 95bf49f..aebe7ea 100644
--- a/core/jni/android_os_PerformanceHintManager.cpp
+++ b/core/jni/android_os_PerformanceHintManager.cpp
@@ -16,15 +16,16 @@
#define LOG_TAG "PerfHint-jni"
-#include "jni.h"
-
+#include <android/performance_hint.h>
#include <dlfcn.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedPrimitiveArray.h>
#include <utils/Log.h>
+
#include <vector>
#include "core_jni_helpers.h"
+#include "jni.h"
namespace android {
@@ -44,6 +45,11 @@
typedef int (*APH_setThreads)(APerformanceHintSession*, const pid_t*, size_t);
typedef void (*APH_getThreadIds)(APerformanceHintSession*, int32_t* const, size_t* const);
typedef void (*APH_setPreferPowerEfficiency)(APerformanceHintSession*, bool);
+typedef void (*APH_reportActualWorkDuration2)(APerformanceHintSession*, AWorkDuration*);
+
+typedef AWorkDuration* (*AWD_create)();
+typedef void (*AWD_setTimeNanos)(AWorkDuration*, int64_t);
+typedef void (*AWD_release)(AWorkDuration*);
bool gAPerformanceHintBindingInitialized = false;
APH_getManager gAPH_getManagerFn = nullptr;
@@ -56,6 +62,14 @@
APH_setThreads gAPH_setThreadsFn = nullptr;
APH_getThreadIds gAPH_getThreadIdsFn = nullptr;
APH_setPreferPowerEfficiency gAPH_setPreferPowerEfficiencyFn = nullptr;
+APH_reportActualWorkDuration2 gAPH_reportActualWorkDuration2Fn = nullptr;
+
+AWD_create gAWD_createFn = nullptr;
+AWD_setTimeNanos gAWD_setWorkPeriodStartTimestampNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualTotalDurationNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualCpuDurationNanosFn = nullptr;
+AWD_setTimeNanos gAWD_setActualGpuDurationNanosFn = nullptr;
+AWD_release gAWD_releaseFn = nullptr;
void ensureAPerformanceHintBindingInitialized() {
if (gAPerformanceHintBindingInitialized) return;
@@ -112,9 +126,46 @@
(APH_setPreferPowerEfficiency)dlsym(handle_,
"APerformanceHint_setPreferPowerEfficiency");
LOG_ALWAYS_FATAL_IF(gAPH_setPreferPowerEfficiencyFn == nullptr,
- "Failed to find required symbol"
+ "Failed to find required symbol "
"APerformanceHint_setPreferPowerEfficiency!");
+ gAPH_reportActualWorkDuration2Fn =
+ (APH_reportActualWorkDuration2)dlsym(handle_,
+ "APerformanceHint_reportActualWorkDuration2");
+ LOG_ALWAYS_FATAL_IF(gAPH_reportActualWorkDuration2Fn == nullptr,
+ "Failed to find required symbol "
+ "APerformanceHint_reportActualWorkDuration2!");
+
+ gAWD_createFn = (AWD_create)dlsym(handle_, "AWorkDuration_create");
+ LOG_ALWAYS_FATAL_IF(gAWD_createFn == nullptr,
+ "Failed to find required symbol AWorkDuration_create!");
+
+ gAWD_setWorkPeriodStartTimestampNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setWorkPeriodStartTimestampNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setWorkPeriodStartTimestampNanosFn == nullptr,
+ "Failed to find required symbol "
+ "AWorkDuration_setWorkPeriodStartTimestampNanos!");
+
+ gAWD_setActualTotalDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualTotalDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualTotalDurationNanosFn == nullptr,
+ "Failed to find required symbol "
+ "AWorkDuration_setActualTotalDurationNanos!");
+
+ gAWD_setActualCpuDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualCpuDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualCpuDurationNanosFn == nullptr,
+ "Failed to find required symbol AWorkDuration_setActualCpuDurationNanos!");
+
+ gAWD_setActualGpuDurationNanosFn =
+ (AWD_setTimeNanos)dlsym(handle_, "AWorkDuration_setActualGpuDurationNanos");
+ LOG_ALWAYS_FATAL_IF(gAWD_setActualGpuDurationNanosFn == nullptr,
+ "Failed to find required symbol AWorkDuration_setActualGpuDurationNanos!");
+
+ gAWD_releaseFn = (AWD_release)dlsym(handle_, "AWorkDuration_release");
+ LOG_ALWAYS_FATAL_IF(gAWD_releaseFn == nullptr,
+ "Failed to find required symbol AWorkDuration_release!");
+
gAPerformanceHintBindingInitialized = true;
}
@@ -238,6 +289,25 @@
enabled);
}
+static void nativeReportActualWorkDuration2(JNIEnv* env, jclass clazz, jlong nativeSessionPtr,
+ jlong workPeriodStartTimestampNanos,
+ jlong actualTotalDurationNanos,
+ jlong actualCpuDurationNanos,
+ jlong actualGpuDurationNanos) {
+ ensureAPerformanceHintBindingInitialized();
+
+ AWorkDuration* workDuration = gAWD_createFn();
+ gAWD_setWorkPeriodStartTimestampNanosFn(workDuration, workPeriodStartTimestampNanos);
+ gAWD_setActualTotalDurationNanosFn(workDuration, actualTotalDurationNanos);
+ gAWD_setActualCpuDurationNanosFn(workDuration, actualCpuDurationNanos);
+ gAWD_setActualGpuDurationNanosFn(workDuration, actualGpuDurationNanos);
+
+ gAPH_reportActualWorkDuration2Fn(reinterpret_cast<APerformanceHintSession*>(nativeSessionPtr),
+ workDuration);
+
+ gAWD_releaseFn(workDuration);
+}
+
static const JNINativeMethod gPerformanceHintMethods[] = {
{"nativeAcquireManager", "()J", (void*)nativeAcquireManager},
{"nativeGetPreferredUpdateRateNanos", "(J)J", (void*)nativeGetPreferredUpdateRateNanos},
@@ -249,6 +319,7 @@
{"nativeSetThreads", "(J[I)V", (void*)nativeSetThreads},
{"nativeGetThreadIds", "(J)[I", (void*)nativeGetThreadIds},
{"nativeSetPreferPowerEfficiency", "(JZ)V", (void*)nativeSetPreferPowerEfficiency},
+ {"nativeReportActualWorkDuration", "(JJJJJ)V", (void*)nativeReportActualWorkDuration2},
};
int register_android_os_PerformanceHintManager(JNIEnv* env) {
diff --git a/core/proto/android/service/notification.proto b/core/proto/android/service/notification.proto
index 17ca7c8..a2978be 100644
--- a/core/proto/android/service/notification.proto
+++ b/core/proto/android/service/notification.proto
@@ -359,6 +359,8 @@
optional PeopleType allow_messages_from = 18;
optional ConversationType allow_conversations_from = 19;
+
+ optional ChannelType allow_channels = 20;
}
// Enum identifying the type of rule that changed; values set to match ones used in the
@@ -368,3 +370,11 @@
RULE_TYPE_MANUAL = 1;
RULE_TYPE_AUTOMATIC = 2;
}
+
+// Enum used in DNDPolicyProto to indicate the type of channels permitted to
+// break through DND. Mirrors values in ZenPolicy.
+enum ChannelType {
+ CHANNEL_TYPE_UNSET = 0;
+ CHANNEL_TYPE_PRIORITY = 1;
+ CHANNEL_TYPE_NONE = 2;
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 0021640..38fde3d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -102,6 +102,7 @@
<protected-broadcast android:name="android.intent.action.OVERLAY_PRIORITY_CHANGED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_UNSUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.UNARCHIVE_PACKAGE" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
<protected-broadcast android:name="android.os.action.DEVICE_IDLE_MODE_CHANGED" />
@@ -7468,6 +7469,13 @@
<permission android:name="android.permission.SIGNAL_REBOOT_READINESS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows the holder to launch an Intent Resolver flow with custom presentation
+ and/or targets.
+ @FlaggedApi("android.service.chooser.support_nfc_resolver")
+ @hide -->
+ <permission android:name="android.permission.SHOW_CUSTOMIZED_RESOLVER"
+ android:protectionLevel="signature|privileged" />
+
<!-- @hide Allows an application to get a People Tile preview for a given shortcut. -->
<permission android:name="android.permission.GET_PEOPLE_TILE_PREVIEW"
android:protectionLevel="signature|recents" />
@@ -7890,6 +7898,18 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+ <activity android:name="com.android.internal.app.NfcResolverActivity"
+ android:theme="@style/Theme.Dialog.Alert"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:multiprocess="true"
+ android:permission="android.permission.SHOW_CUSTOMIZED_RESOLVER"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.service.chooser.action.SHOW_CUSTOMIZED_RESOLVER" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
<activity android:name="com.android.internal.app.IntentForwarderActivity"
android:finishOnCloseSystemDialogs="true"
android:theme="@style/Theme.DeviceDefault.Resolver"
diff --git a/core/res/res/raw/default_ringtone_vibration_effect.ahv b/core/res/res/raw/default_ringtone_vibration_effect.ahv
index c66fc04..c4a27a4 100644
--- a/core/res/res/raw/default_ringtone_vibration_effect.ahv
+++ b/core/res/res/raw/default_ringtone_vibration_effect.ahv
@@ -18,7 +18,7 @@
*/
-->
-<vibration>
+<vibration-effect>
<waveform-effect>
<waveform-entry amplitude="0" durationMs="0" />
<waveform-entry amplitude="255" durationMs="12" />
@@ -44,4 +44,4 @@
<waveform-entry amplitude="0" durationMs="1000" />
</repeating>
</waveform-effect>
-</vibration>
\ No newline at end of file
+</vibration-effect>
\ No newline at end of file
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index f5b82892..625b1413 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Sleutelborduitleg is gestel op <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Tik om dit te verander."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fisieke sleutelborde is opgestel"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tik om sleutelborde te bekyk"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index fbef5011..1ec3ffd 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"የቁልፍ ሰሌዳ አቀማመጥ ወደ <xliff:g id="LAYOUT_1">%1$s</xliff:g>፣ <xliff:g id="LAYOUT_2">%2$s</xliff:g>፣ <xliff:g id="LAYOUT_3">%3$s</xliff:g> ተቀናብሯል… ለመቀጠል መታ ያድርጉ።"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"የተዋቀሩ አካላዊ የቁልፍ ሰሌዳዎች"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"የቁልፍ ሰሌዳዎችን ለማየት መታ ያድርጉ"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"የግል"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"አባዛ"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"ሥራ"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"ሥራ 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"ሥራ 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"ሙከራ"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"የጋራ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 9ca2d199..04fb300 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1694,7 +1694,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"إزالة"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"هل تريد رفع مستوى الصوت فوق المستوى الموصى به؟\n\nقد يضر سماع صوت عالٍ لفترات طويلة بسمعك."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"هل تريد مواصلة الاستماع بصوت عالٍ؟\n\nكان مستوى صوت سمّاعة الرأس مرتفعًا لمدة أطول مما يُنصَح به، وقد يضر هذا بسمعك."</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"تم رصد صوت مرتفع\n\nكان مستوى صوت سمّاعة الرأس مرتفعًا لمدة أطول مما يُنصَح به، وقد يضر هذا بسمعك."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"تم رصد صوت مرتفع\n\nكان مستوى صوت سمّاعة الرأس أعلى من المستوى الذي يُنصَح به، ما قد يضرّ بسمعك."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"هل تريد استخدام اختصار \"سهولة الاستخدام\"؟"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"عند تفعيل الاختصار، يؤدي الضغط على زرّي التحكّم في مستوى الصوت معًا لمدة 3 ثوانٍ إلى تفعيل إحدى ميزات إمكانية الوصول."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"هل تريد تفعيل الاختصار لميزات إمكانية الوصول؟"</string>
@@ -2363,4 +2363,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"تم ضبط تنسيق لوحة المفاتيح على <xliff:g id="LAYOUT_1">%1$s</xliff:g> و<xliff:g id="LAYOUT_2">%2$s</xliff:g> و<xliff:g id="LAYOUT_3">%3$s</xliff:g>… انقر لتغييره."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"تم إعداد لوحات المفاتيح الخارجية"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"انقر لعرض لوحات المفاتيح."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml
index 7473f49..826844f 100644
--- a/core/res/res/values-as/strings.xml
+++ b/core/res/res/values-as/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"কীব’ৰ্ডৰ লে’আউট <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> হিচাপে ছেট কৰা হৈছে… সলনি কৰিবলৈ টিপক।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ভৌতিক কীব’ৰ্ড কনফিগাৰ কৰা হৈছে"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"কীব’ৰ্ড চাবলৈ টিপক"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index b1002e2..66a5670 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatura düzəni <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> kimi ayarlanıb… Dəyişmək üçün toxunun."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziki klaviaturalar konfiqurasiya edilib"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klaviaturalara baxmaq üçün toxunun"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 196818a..b6121ed 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tastature je podešen na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da biste promenili."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke tastature su konfigurisane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da biste videli tastature"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index d7efa8a..3c01f1b 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Раскладка клавіятуры наладжана для наступных моў: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Націсніце, каб змяніць."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Фізічныя клавіятуры наладжаны"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Націсніце, каб праглядзець клавіятуры"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index b9e1db4..3b1ff9e 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"За клавиатурната подредба са зададени <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> и <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Докоснете за промяна."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физическите клавиатури са конфигурирани"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Докоснете за преглед на клавиатурите"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 669c99e..58dd7c2 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"এটি কোনও একটি অ্যাপের সাথে অথবা হার্ডওয়্যার সেন্সরের সাথে আপনার ইন্টার্যাকশন ট্র্যাক করতে এবং আপনার হয়ে বিভিন্ন অ্যাপের সাথে ইন্টার্যাক্ট করতে পারে।"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"অনুমতি দিন"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"খারিজ করুন"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"আনইনস্টল করুন"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"কোনও অ্যাপ অনুমতির অনুরোধ আড়াল করছে তাই আপনার উত্তর যাচাই করা যাবে না।"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"কোনও ফিচার ব্যবহার করা শুরু করতে, সেটিতে ট্যাপ করুন:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"অ্যাক্সেসিবিলিটি বোতামের সাহায্যে আপনি যেসব ফিচার ব্যবহার করতে চান সেগুলি বেছে নিন"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"ভলিউম কী শর্টকাটের সাহায্যে আপনি যেসব ফিচার ব্যবহার করতে চান সেগুলি বেছে নিন"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"কীবোর্ড লেআউট <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>-এ সেট করা আছে… পালটাতে ট্যাপ করুন।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ফিজিক্যাল কীবোর্ড কনফিগার করা হয়েছে"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"কীবোর্ড দেখতে ট্যাপ করুন"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 9dcd869..aa66e02 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tastature je postavljen na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da promijenite."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke tastature su konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da pregledate tastature"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 66e76ac..be8654d 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disseny del teclat definit en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca per canviar-ho."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclats físic configurats"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca per veure els teclats"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 1acb8d4..ed2f93a 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1712,10 +1712,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Služba může sledovat vaše interakce s aplikací nebo hardwarovým senzorem a komunikovat s aplikacemi namísto vás."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Povolit"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Zakázat"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Odinstalovat"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Žádost o oprávnění skrývá nějaká aplikace, proto vaši odpověď nelze ověřit."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Chcete-li některou funkci začít používat, klepněte na ni:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Vyberte funkce, které budete používat s tlačítkem přístupnosti"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Vyberte funkce, které budete používat se zkratkou tlačítka hlasitosti"</string>
@@ -2363,4 +2361,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Rozložení klávesnice je nastaveno na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Klepnutím jej změníte."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyzické klávesnice byly nakonfigurovány"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klepnutím zobrazíte klávesnice"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Soukromé"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klonovat"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Práce"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Práce 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Práce 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Komunální"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index bedd941..35def43 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturlayoutet er angivet som <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tryk for at ændre dette."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysiske tastaturer er konfigureret"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tryk for at se tastaturer"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 2867da9..50501c6 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1711,7 +1711,7 @@
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Zulassen"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Ablehnen"</string>
<string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Deinstallieren"</string>
- <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Eine App verdeckt die Berechtigungsanfrage und deine Antwort kann deshalb nicht überprüft werden."</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Die Berechtigungsanfrage wird durch eine andere App verdeckt. Daher kann deine Antwort nicht geprüft werden."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Zum Auswählen der gewünschten Funktion tippen:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Funktionen auswählen, die du mit der Schaltfläche \"Bedienungshilfen\" verwenden möchtest"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Funktionen für Verknüpfung mit Lautstärketaste auswählen"</string>
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturlayout festgelegt auf <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Zum Ändern tippen."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physische Tastaturen konfiguriert"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Zum Ansehen der Tastaturen tippen"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privat"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klon"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Geschäftlich"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Geschäftlich 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Geschäftlich 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Gemeinsam genutzt"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index b6b4da2..dc73c21 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Η διάταξη πληκτρολογίου ορίστηκε σε <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Πατήστε για αλλαγή."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Τα φυσικά πληκτρολόγια διαμορφώθηκαν"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Πατήστε για να δείτε πληκτρολόγια"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Ιδιωτικό"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Κλώνος"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Εργασία"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Εργασία 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Εργασία 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Δοκιμή"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Κοινόχρηστο"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 94ae6cb..179bdb4 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index ec41583..5fb0e5a 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Private"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Work"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Work 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Work 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 2c15524..2a4f88e 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ff91080..0f08d2f 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index b1dd1f1..0bdd2974 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Keyboard layout set to <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tap to change."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Physical keyboards configured"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tap to view keyboards"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Private"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Work"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Work 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Work 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Communal"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 39a479e..bef851d 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiar esta opción."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Presiona para ver los teclados"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privado"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clonar"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Trabajo"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Trabajo 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Trabajo 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Probar"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Compartido"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 30ed624..29f0f8f 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1691,7 +1691,7 @@
<string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"Quitar"</string>
<string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos."</string>
<string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"¿Seguir escuchando a un volumen alto?\n\nEl volumen de los auriculares ha estado alto durante más tiempo del recomendado, lo que puede dañar tu audición."</string>
- <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Sonido alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición."</string>
+ <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Volumen alto detectado\n\nEl volumen de los auriculares está más alto de lo recomendado, lo que puede dañar tu audición."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"¿Utilizar acceso directo de accesibilidad?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Si el acceso directo está activado, pulsa los dos botones de volumen durante 3 segundos para iniciar una función de accesibilidad."</string>
<string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"¿Quieres activar el acceso directo a las funciones de accesibilidad?"</string>
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca para cambiarlo."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca para ver los teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index c4ea351..4a42b00 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatuuripaigutuseks on määratud <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … puudutage muutmiseks."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Füüsilised klaviatuurid on seadistatud"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Puudutage klaviatuuride vaatamiseks"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 26362d5..3b76e88 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ezarri da <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> eta <xliff:g id="LAYOUT_3">%3$s</xliff:g> gisa teklatuaren diseinua… Diseinu hori aldatzeko, sakatu hau."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Konfiguratu dira teklatu fisikoak"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Sakatu hau teklatuak ikusteko"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index c96c580..71dbc43 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1711,7 +1711,7 @@
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"اجازه دادن"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"مجاز نبودن"</string>
<string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"حذف نصب"</string>
- <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"برنامهای درخواست اجازه را میپوشاند و بنابراین نمیتوان پاسخ شما را تأیید کرد."</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"پاسخ شما تأیید نشد زیرا یک برنامه درخواست اجازه را مسدود کرده است."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"برای استفاده از ویژگی، روی آن ضربه بزنید:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"انتخاب ویژگیهای موردنظر برای استفاده با دکمه دسترسپذیری"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"انتخاب ویژگیهای موردنظر برای استفاده با میانبر کلید میزان صدا"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"جانمایی صفحهکلید چنین تنظیم شد: <xliff:g id="LAYOUT_1">%1$s</xliff:g>، <xliff:g id="LAYOUT_2">%2$s</xliff:g>، <xliff:g id="LAYOUT_3">%3$s</xliff:g>… برای تغییر ضربه بزنید"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"صفحهکلیدهای فیزیکی پیکربندی شدند"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"برای مشاهده صفحهکلیدها ضربه بزنید"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index c203786..c69bafe 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Näppäimistöasetteluksi valittu <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Muuta asetuksia napauttamalla."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyysiset näppäimistöt määritetty"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Katso näppäimistöt napauttamalla"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index f06d20f..6c88f45 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disposition du clavier définie à <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Touchez pour modifier."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Claviers physiques configurés"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Touchez pour afficher les claviers"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index b69db32..e0345dd 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Disposition du clavier définie sur <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Appuyez pour la modifier."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Claviers physiques configurés"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Appuyez pour voir les claviers"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privé"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Professionnel"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Professionnel 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Professionnel 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Commun"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index f26dbfb..c1e2bbf 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"O deseño do teclado estableceuse en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca para cambialo."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Configuráronse varios teclados físicos"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca para ver os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index d64e33a..da75282 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"કીબોર્ડનું લેઆઉટ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> પર સેટ કરવામાં આવ્યું છે… બદલવા માટે ટૅપ કરો."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ભૌતિક કીબોર્ડની ગોઠવણી કરવામાં આવી છે"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"કીબોર્ડ જોવા માટે ટૅપ કરો"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 61db784..d448b51 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1951,7 +1951,7 @@
<string name="language_selection_title" msgid="52674936078683285">"भाषा जोड़ें"</string>
<string name="country_selection_title" msgid="5221495687299014379">"क्षेत्र प्राथमिकता"</string>
<string name="search_language_hint" msgid="7004225294308793583">"भाषा का नाम लिखें"</string>
- <string name="language_picker_section_suggested" msgid="6556199184638990447">"दिए गए सुझाव"</string>
+ <string name="language_picker_section_suggested" msgid="6556199184638990447">"सुझाई गई भाषाएं"</string>
<string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"सुझाए गए देश/इलाके"</string>
<string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"सुझाई गई भाषाएं"</string>
<string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"सुझाए गए इलाके"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"कीबोर्ड का लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… पर सेट कर दिया गया है. इसे बदलने के लिए टैप करें."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"फ़िज़िकल कीबोर्ड कॉन्फ़िगर किए गए"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"कीबोर्ड देखने के लिए टैप करें"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 4b9b7bc..5ee1527 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Raspored tipkovnice postavljen je na <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Dodirnite da biste ga promijenili."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizičke su tipkovnice konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dodirnite da bi se prikazale tipkovnice"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 5827300..2c4c77e 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"A billentyűzetkiosztás a következőkre van beállítva: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… A módosításhoz koppintson."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizikai billentyűzetek beállítva"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Koppintson a billentyűzetek megtekintéséhez"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 9e313a6..482e075 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Կարող է հետագծել ձեր գործողությունները հավելվածներում և սարքակազմի սենսորների վրա, ինչպես նաև հավելվածներում կատարել գործողություններ ձեր անունից։"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Թույլատրել"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Մերժել"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Ապատեղադրել"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Հավելվածը թաքցնում է թույլտվության հայտը, ուստի ձեր պատասխանը հնարավոր չէ ստուգել։"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Ընտրեք՝ որ գործառույթն օգտագործել"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Ընտրեք գործառույթները, որոնք կբացվեն «Հատուկ գործառույթներ» կոճակի միջոցով"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Ընտրեք գործառույթները, որոնք կբացվեն ձայնի կարգավորման կոճակի միջոցով"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ստեղնաշարի համար կարգավորված են <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> դասավորությունները։ Հպեք փոխելու համար։"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Ֆիզիկական ստեղնաշարերը կարգավորված են"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Հպեք՝ ստեղնաշարերը դիտելու համար"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index b4044aa..f18d834 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -1247,7 +1247,7 @@
<string name="unsupported_display_size_show" msgid="980129850974919375">"Selalu tampilkan"</string>
<string name="unsupported_compile_sdk_message" msgid="7326293500707890537">"<xliff:g id="APP_NAME">%1$s</xliff:g> dibuat untuk versi OS Android yang tidak kompatibel dan mungkin berperilaku tak terduga. Versi aplikasi yang diupdate mungkin tersedia."</string>
<string name="unsupported_compile_sdk_show" msgid="1601210057960312248">"Selalu tampilkan"</string>
- <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Periksa apakah ada update"</string>
+ <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Periksa update"</string>
<string name="smv_application" msgid="3775183542777792638">"Apl <xliff:g id="APPLICATION">%1$s</xliff:g> (proses <xliff:g id="PROCESS">%2$s</xliff:g>) telah melanggar kebijakan StrictMode yang diberlakukannya sendiri."</string>
<string name="smv_process" msgid="1398801497130695446">"Proses <xliff:g id="PROCESS">%1$s</xliff:g> telah melanggar kebijakan StrictMode yang diberlakukan secara otomatis."</string>
<string name="android_upgrading_title" product="default" msgid="7279077384220829683">"Mengupdate ponsel…"</string>
@@ -1989,7 +1989,7 @@
<string name="app_streaming_blocked_message_for_settings_dialog" product="tablet" msgid="3286849551133045896">"Setelan ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g>. Coba di tablet."</string>
<string name="app_streaming_blocked_message_for_settings_dialog" product="default" msgid="6264287556598916295">"Setelan ini tidak dapat diakses di <xliff:g id="DEVICE">%1$s</xliff:g>. Coba di ponsel."</string>
<string name="deprecated_target_sdk_message" msgid="5246906284426844596">"Aplikasi ini dibuat untuk versi lama Android. Aplikasi mungkin tidak berfungsi dengan baik dan tidak menyertakan perlindungan privasi dan keamanan terbaru. Periksa update, atau hubungi developer aplikasi."</string>
- <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Periksa apakah ada update"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Periksa update"</string>
<string name="deprecated_abi_message" msgid="6820548011196218091">"Aplikasi ini tidak kompatibel dengan versi terbaru Android. Periksa update atau hubungi developer aplikasi."</string>
<string name="new_sms_notification_title" msgid="6528758221319927107">"Ada pesan baru"</string>
<string name="new_sms_notification_content" msgid="3197949934153460639">"Buka aplikasi SMS untuk melihat"</string>
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tata letak keyboard disetel ke <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ketuk untuk mengubah."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Keyboard fisik telah dikonfigurasi"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ketuk untuk melihat keyboard"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 062b4bc..30d4231 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Lyklaskipan er stillt á <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ýttu til að breyta."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Vélbúnaðarlyklaborð eru stillt"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ýttu til að sjá lyklaborð"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Lokað"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Afrit"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Vinna"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Vinna 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Vinna 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Prófun"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Sameiginlegt"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 2e024cb..076c5a3 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout tastiera impostato su <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tocca per cambiare l\'impostazione."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastiere fisiche configurate"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tocca per visualizzare le tastiere"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index e5e85c4..e8e3847 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"פריסת המקלדת מוגדרת ל<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… אפשר להקיש כדי לשנות את ההגדרה הזו."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"הוגדרו מקלדות פיזיות"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"יש להקיש כדי להציג את המקלדות"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"פרטי"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"שכפול"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"פרופיל עבודה"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"פרופיל עבודה 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"פרופיל עבודה 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"בדיקה"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"שיתופי"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 6e86b57..8931518 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>などに設定されています。タップで変更できます。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"物理キーボードの設定完了"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"タップするとキーボードを表示できます"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 34f56546..1ecdf74 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -2359,4 +2359,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"დაყენდა კლავიატურის განლაგება: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… შეეხეთ შესაცვლელად."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ფიზიკური კლავიატურები კონფიგურირებულია"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"შეეხეთ კლავიატურების სანახავად"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"პირადი"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"კლონი"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"სამსახური"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"სამსახური 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"სამსახური 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"სატესტო"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"საერთო"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 839f3f9..3e33115 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Пернетақта схемасы \"<xliff:g id="LAYOUT_1">%1$s</xliff:g>\", \"<xliff:g id="LAYOUT_2">%2$s</xliff:g>\", \"<xliff:g id="LAYOUT_3">%3$s</xliff:g>\" деп орнатылды… Өзгерту үшін түртіңіз."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физикалық пернетақталар конфигурацияланды"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Пернетақталарды көру үшін түртіңіз."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 9a29150..0bcf992 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"បានកំណត់ប្លង់ក្ដារចុចទៅ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… សូមចុចដើម្បីប្ដូរ។"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"បានកំណត់រចនាសម្ព័ន្ធក្ដារចុចរូបវន្ត"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ចុចដើម្បីមើលក្ដារចុច"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 9f1700d..a69601a 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಅನ್ನು <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> ಗೆ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ… ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ಕೀಬೋರ್ಡ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 907e802..77d45c7 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"키보드 레이아웃이 <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>로 설정됩니다. 변경하려면 탭하세요."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"실제 키보드에 구성됨"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"키보드를 보려면 탭하세요."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 5efcfc4b..ee7b407 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Баскычтопко төмөнкү калып коюлду: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Өзгөртүү үчүн басыңыз."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физикалык баскычтоптор конфигурацияланды"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Баскычтопторду көрүү үчүн басыңыз"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index d0f698d..d9698e3 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ຕັ້ງໂຄງຮ່າງແປ້ນພິມເປັນ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… ແຕະເພື່ອປ່ຽນແປງ."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ຕັ້ງຄ່າແປ້ນພິມແທ້ແລ້ວ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ແຕະເພື່ອເບິ່ງແປ້ນພິມ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 6b6bc50..2a2a088 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Išdėstymas nustatytas į <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Palieskite, kad pakeistumėte."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Sukonfigūruotos fizinės klaviatūros"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Palieskite, kad peržiūrėtumėte klaviatūras"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 931e681..8c7c206 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ir iestatīti šādi tastatūras izkārtojumi: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Lai to mainītu, pieskarieties."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziskās tastatūras ir konfigurētas"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Lai skatītu tastatūras, pieskarieties"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 420adfe..4d2f72e 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Може да ја следи вашата интеракција со апликациите или со хардверските сензори и да врши интеракција со апликациите во ваше име."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволи"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Одбиј"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Деинсталирај"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Апликација го прикрива барањето за дозвола, па вашиот одговор не може да се потврди."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Допрете на функција за да почнете да ја користите:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Изберете ги функциите што ќе ги користите со копчето за пристапност"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Изберете ги функциите што ќе ги користите со кратенката за копчето за јачина на звук"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Распоредот на тастатурата е поставен на <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Допрете за да промените."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физичките тастатури се конфигурирани"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Допрете за да ги видите тастатурите"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 466dab6..be40575 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"കീബോർഡ് ലേഔട്ട് ആയി ഇനിപ്പറയുന്നവ സജ്ജീകരിച്ചു: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… മാറ്റാൻ ടാപ്പ് ചെയ്യുക."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"യഥാർത്ഥ കീബോർഡുകൾ കോൺഫിഗർ ചെയ്തു"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"കീബോർഡുകൾ കാണാൻ ടാപ്പ് ചെയ്യുക"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 3cb9cb2..c215b88 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Гарын бүдүүвчийг <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> болгож тохируулсан… Өөрчлөхийн тулд товшино уу."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Биет гарыг тохируулсан"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Гарыг харахын тулд товшино уу"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index b20754b..03fcc17 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"कीबोर्ड लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> वर सेट करा… बदलण्यासाठी टॅप करा."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"वास्तविक कीबोर्ड कॉंफिगर केला"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"कीबोर्ड पाहण्यासाठी टॅप करा"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 6b1742c..84b79a8 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Reka letak papan kekunci ditetapkan kepada <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Ketik untuk menukar reka letak."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Papan kekunci fizikal dikonfigurasikan"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Ketik untuk melihat papan kekunci"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index edbe31f..01906b9 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"၎င်းသည် သင်နှင့် အက်ပ်တစ်ခု (သို့) အာရုံခံကိရိယာအကြား ပြန်လှန်တုံ့ပြန်မှုများကို မှတ်သားနိုင်ပြီး သင့်ကိုယ်စား အက်ပ်များနှင့် ပြန်လှန်တုံ့ပြန်နိုင်သည်။"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ခွင့်ပြုရန်"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ပယ်ရန်"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"ပရိုဂရမ်ကို ဖယ်ရှားရန်"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"အက်ပ်တစ်ခုသည် ခွင့်ပြုချက်တောင်းဆိုမှုကို ပိတ်နေသဖြင့် သင့်တုံ့ပြန်မှုကို စိစစ်၍မရပါ။"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ဝန်ဆောင်မှုကို စတင်အသုံးပြုရန် တို့ပါ−"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"အများသုံးနိုင်မှု ခလုတ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"အသံခလုတ် ဖြတ်လမ်းလင့်ခ်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုများကို ရွေးပါ"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ကီးဘုတ်အပြင်အဆင်ကို <xliff:g id="LAYOUT_1">%1$s</xliff:g>၊ <xliff:g id="LAYOUT_2">%2$s</xliff:g>၊ <xliff:g id="LAYOUT_3">%3$s</xliff:g> သို့ သတ်မှတ်လိုက်သည်… ပြောင်းရန် တို့ပါ။"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ပကတိကီးဘုတ်များကို စီစဉ်သတ်မှတ်ထားသည်"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ကီးဘုတ်များကြည့်ရန် တို့ပါ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 0732e67..d8e3b40 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastaturoppsettet er satt til <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Trykk for å endre det."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"De fysiske tastaturene er konfigurert"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Trykk for å se tastaturene"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 7ac4c14..126f612 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"किबोर्ड लेआउट <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> भाषामा सेट गरिएको छ… बदल्न ट्याप गर्नुहोस्।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"भौतिक किबोर्डहरू कन्फिगर गरिएका छन्"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"किबोर्डहरू हेर्न ट्याप गर्नुहोस्"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 8f08689..bc18797 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Toetsenbordindeling ingesteld op <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Tik om te wijzigen."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysieke toetsenborden zijn ingesteld"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tik om toetsenborden te bekijken"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml
index e91e005..7f66887 100644
--- a/core/res/res/values-or/strings.xml
+++ b/core/res/res/values-or/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"କୀବୋର୍ଡ ଲେଆଉଟକୁ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>ରେ ସେଟ କରାଯାଇଛି… ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ଫିଜିକାଲ କୀବୋର୍ଡଗୁଡ଼ିକୁ କନଫିଗର କରାଯାଇଛି"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"କୀବୋର୍ଡଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 29a0094..0396149 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ਕੀ-ਬੋਰਡ ਦਾ ਖਾਕਾ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> \'ਤੇ ਸੈੱਟ ਹੈ… ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡਾਂ ਦਾ ਸੰਰੂਪਣ ਕੀਤਾ ਗਿਆ"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"ਕੀ-ਬੋਰਡਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 208810d..66d5570 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Ustawiono układ klawiatury <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Kliknij, aby to zmienić."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Skonfigurowano klawiatury fizyczne"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Kliknij, aby wyświetlić klawiatury"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index c509ed5..e32c738 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para mudar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para conferir os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index daa2504..15e08ba 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Esquema do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para o alterar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para ver os teclados"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privado"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clone"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Trabalho"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Trabalho 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Trabalho 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Teste"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Comum"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index c509ed5..e32c738 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Layout do teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toque para mudar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toque para conferir os teclados"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 562fcc9..7b41180 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -2360,4 +2360,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tastatura este setată la <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Atinge pentru a schimba."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastaturile fizice au fost configurate"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Atinge pentru a vedea tastaturile"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Privat"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Clonează"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Serviciu"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Serviciu 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Serviciu 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Test"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Comun"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 84a4776..2f16db3 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Настроены раскладки клавиатуры для яз.: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> и др. Нажмите, чтобы изменить."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физические клавиатуры настроены"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Нажмите, чтобы посмотреть подключенные клавиатуры."</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index c54e768..ac86d7b 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"මෙයට යෙදුමක් හෝ දෘඪාංග සංවේදකයක් සමඟ ඔබේ අන්තර්ක්රියා හඹා යෑමට, සහ ඔබ වෙනුවෙන් යෙදුම් සමඟ අන්තර්ක්රියාවේ යෙදීමට හැකි ය."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"ඉඩ දෙන්න"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"ප්රතික්ෂේප කරන්න"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"අස්ථාපනය කරන්න"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"යෙදුමක් අවසර ඉල්ලීම අඳුරු කරන බැවින්, ඔබේ ප්රතිචාරය සත්යාපනය කළ නොහැක."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"එය භාවිත කිරීම ආරම්භ කිරීමට විශේෂාංගයක් තට්ටු කරන්න:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ප්රවේශ්යතා බොත්තම සමග භාවිත කිරීමට විශේෂාංග තෝරා ගන්න"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"හඬ පරිමා යතුරු කෙටිමග සමග භාවිත කිරීමට විශේෂාංග තෝරා ගන්න"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"යතුරු පුවරුව <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> ලෙස සකසා ඇත… වෙනස් කිරීමට තට්ටු කරන්න."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"භෞතික යතුරු පුවරුව වින්යාස කෙරිණි"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"යතුරු පුවරු බැලීමට තට්ටු කරන්න"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index f2153231..d1d7897 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -2361,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Rozloženie klávesnice je nastavené na jazyky <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> a <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Môžete to zmeniť klepnutím."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fyzické klávesnice sú nakonfigurované"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klávesnice si zobrazíte klepnutím"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index e8ba9dd..19866f3 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -2361,4 +2361,11 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Razporeditev tipkovnice je nastavljena na »<xliff:g id="LAYOUT_1">%1$s</xliff:g>«, »<xliff:g id="LAYOUT_2">%2$s</xliff:g>«, »<xliff:g id="LAYOUT_3">%3$s</xliff:g>« … Za spremembo se dotaknite."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fizične tipkovnice so konfigurirane"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Dotaknite se za ogled tipkovnic"</string>
+ <string name="profile_label_private" msgid="6463418670715290696">"Zasebno"</string>
+ <string name="profile_label_clone" msgid="769106052210954285">"Klon"</string>
+ <string name="profile_label_work" msgid="3495359133038584618">"Delo"</string>
+ <string name="profile_label_work_2" msgid="4691533661598632135">"Delo 2"</string>
+ <string name="profile_label_work_3" msgid="4834572253956798917">"Delo 3"</string>
+ <string name="profile_label_test" msgid="9168641926186071947">"Preizkus"</string>
+ <string name="profile_label_communal" msgid="8743921499944800427">"Skupno"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 1d28440..2cd76fd 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Mund të monitorojë ndërveprimet me një aplikacion ose një sensor hardueri dhe të ndërveprojë me aplikacionet në emrin tënd."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Lejo"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Refuzo"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Çinstalo"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Një aplikacion po fsheh kërkesën për leje, prandaj përgjigja jote nuk mund të verifikohet."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Trokit te një veçori për të filluar ta përdorësh atë:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Zgjidh veçoritë që do të përdorësh me butonin e qasshmërisë"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Zgjidh veçoritë që do të përdorësh me shkurtoren e tastit të volumit"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Struktura e tastierës u caktua në: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Trokit për ta ndryshuar."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tastierat fizike u konfiguruan"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Trokit për të parë tastierat"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index a6c994e..9e77bf6 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -2360,4 +2360,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Распоред тастатуре је подешен на <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Додирните да бисте променили."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Физичке тастатуре су конфигурисане"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Додирните да бисте видели тастатуре"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 15b7029..ab5bfca 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Tangentbordslayouten är inställd på <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> … Tryck om du vill ändra."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fysiska tangentbord har konfigurerats"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Tryck för att visa tangentbord"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index aef89ee..61c0b17 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Muundo wa kibodi umewekwa kuwa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Gusa ili ubadilishe."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Mipangilio ya kibodi halisi imewekwa"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Gusa ili uangalie kibodi"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index f81e935..edf6c2d 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"கீபோர்டு தளவமைப்பு <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… ஆகிய மொழிகளில் அமைக்கப்பட்டது, மாற்ற தட்டவும்."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"கீபோர்டுகள் உள்ளமைக்கப்பட்டன"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"கீபோர்டுகளைப் பார்க்க தட்டவும்"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index 671aefb..d862e2f 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"కీబోర్డ్ లేఅవుట్ <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>కు సెట్ చేయబడింది… మార్చడానికి ట్యాప్ చేయండి."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"ఫిజికల్ కీబోర్డ్లు కాన్ఫిగర్ చేయబడ్డాయి"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"కీబోర్డ్లను చూడటానికి ట్యాప్ చేయండి"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 2d5ddf4..bda7e8a 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"ตั้งค่ารูปแบบแป้นพิมพ์เป็นภาษา<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… แตะเพื่อเปลี่ยน"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"กำหนดค่าแป้นพิมพ์จริงแล้ว"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"แตะเพื่อดูแป้นพิมพ์"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 47c4b5e..53201ea 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Naitakda ang layout ng keyboard sa <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… I-tap para baguhin."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Na-configure ang mga pisikal na keyboard"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"I-tap para tingnan ang mga keyboard"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 03536fe..ee1168f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klavye düzeni <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g> olarak ayarlandı… Değiştirmek için dokunun."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Fiziksel klavyeler yapılandırıldı"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klavyeleri görüntülemek için dokunun"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 24cbc3f..b1adf52 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1712,10 +1712,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Цей сервіс може відстежувати вашу взаємодію з додатком чи апаратним датчиком, а також взаємодіяти з додатками від вашого імені."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Дозволити"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Заборонити"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Видалити"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Інший додаток перекриває запит на доступ, тому вашу відповідь не вдається підтвердити."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Натисніть функцію, щоб почати використовувати її:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Виберіть функції для кнопки спеціальних можливостей"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Виберіть функції для комбінації з клавішами гучності"</string>
@@ -2363,4 +2361,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Вибрано такі розкладки клавіатури: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Натисніть, щоб змінити."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Фізичні клавіатури налаштовано"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Натисніть, щоб переглянути клавіатури"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index 728b5ee..92fd266 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"یہ کسی ایپ یا ہارڈویئر سینسر کے ساتھ آپ کے تعاملات کو ٹریک کر سکتا ہے، اور آپ کی طرف سے ایپس کے ساتھ تعامل کر سکتا ہے۔"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"اجازت دیں"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"مسترد کریں"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"اَن انسٹال کریں"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"ایپ اجازت کی درخواست کو مبہم کر رہی ہے لہذا آپ کے جواب کی تصدیق نہیں کی جا سکتی۔"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"ایک خصوصیت کا استعمال شروع کرنے کیلئے اسے تھپتھپائیں:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"ایکسیسبیلٹی بٹن کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"والیوم کلید کے شارٹ کٹ کے ساتھ استعمال کرنے کیلئے خصوصیات منتخب کریں"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"کی بورڈ لے آؤٹ <xliff:g id="LAYOUT_1">%1$s</xliff:g>، <xliff:g id="LAYOUT_2">%2$s</xliff:g>، <xliff:g id="LAYOUT_3">%3$s</xliff:g> پر سیٹ ہے… تبدیل کرنے کے لیے تھپتھپائیں۔"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"فزیکل کی بورڈز کنفیگر کئے گئے"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"کی بورڈز دیکھنے کے لیے تھپتھپائیں"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 1e1807e..79d9f9d 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"Ilova yoki qurilma sensori bilan munosabatlaringizni kuzatishi hamda sizning nomingizdan ilovalar bilan ishlashi mumkin."</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"Ruxsat"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"Rad etish"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"Oʻchirib tashlash"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"Ilova ruxsat olish talabini berkitmoqda, shu sababdan javobingizni tasdiqlash imkonsiz."</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"Kerakli funksiyani tanlang"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"Qulayliklar tugmasi bilan foydalanish uchun funksiyalarni tanlang"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"Tovush tugmasi bilan ishga tushiriladigan funksiyalarni tanlang"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Klaviatura terilmasi bunga sozlandi: <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Oʻzgartirish uchun ustiga bosing."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Tashqi klaviaturalar sozlandi"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Klaviaturalarni ochish uchun ustiga bosing"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 94ebd97..2ddf49f 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Đã thiết lập bố cục bàn phím thành <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Hãy nhấn để thay đổi."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Đã định cấu hình bàn phím vật lý"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Nhấn để xem bàn phím"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 108f507..f3b6a39 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"键盘布局已设为<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…点按即可更改。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已配置物理键盘"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"点按即可查看键盘"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index a37f9a8..bf72080 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"鍵盤版面配置已設定為<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…輕按即可變更。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已設定實體鍵盤"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"輕按即可查看鍵盤"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 5dced74..1158cfd 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1710,10 +1710,8 @@
<string name="accessibility_service_action_perform_description" msgid="2718852014003170558">"可追蹤你與應用程式或硬體感應器的互動,並代表你與應用程式進行互動。"</string>
<string name="accessibility_dialog_button_allow" msgid="2092558122987144530">"允許"</string>
<string name="accessibility_dialog_button_deny" msgid="4129575637812472671">"拒絕"</string>
- <!-- no translation found for accessibility_dialog_button_uninstall (2952465517671708108) -->
- <skip />
- <!-- no translation found for accessibility_dialog_touch_filtered_warning (3741940116597822451) -->
- <skip />
+ <string name="accessibility_dialog_button_uninstall" msgid="2952465517671708108">"解除安裝"</string>
+ <string name="accessibility_dialog_touch_filtered_warning" msgid="3741940116597822451">"應用程式遮擋了權限要求,因此系統無法驗證你的回覆。"</string>
<string name="accessibility_select_shortcut_menu_title" msgid="6002726538854613272">"輕觸即可開始使用所需功能:"</string>
<string name="accessibility_edit_shortcut_menu_button_title" msgid="239446795930436325">"選擇要搭配無障礙工具按鈕使用的功能"</string>
<string name="accessibility_edit_shortcut_menu_volume_title" msgid="1077294237378645981">"選擇要搭配音量快速鍵使用的功能"</string>
@@ -2361,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"鍵盤配置已設為<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>…輕觸即可變更。"</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"已設定實體鍵盤"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"輕觸即可查看鍵盤"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index aaa1787..db7c253 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -2359,4 +2359,18 @@
<string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Uhlaka lwekhibhodi lusethelwe ku-<xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Thepha ukuze ushintshe."</string>
<string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Amakhibhodi aphathekayo amisiwe"</string>
<string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Thepha ukuze ubuke amakhibhodi"</string>
+ <!-- no translation found for profile_label_private (6463418670715290696) -->
+ <skip />
+ <!-- no translation found for profile_label_clone (769106052210954285) -->
+ <skip />
+ <!-- no translation found for profile_label_work (3495359133038584618) -->
+ <skip />
+ <!-- no translation found for profile_label_work_2 (4691533661598632135) -->
+ <skip />
+ <!-- no translation found for profile_label_work_3 (4834572253956798917) -->
+ <skip />
+ <!-- no translation found for profile_label_test (9168641926186071947) -->
+ <skip />
+ <!-- no translation found for profile_label_communal (8743921499944800427) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 1d4e01a..ba1f392 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2246,6 +2246,9 @@
<!-- The default volume for the ring stream -->
<integer name="config_audio_ring_vol_default">5</integer>
+ <!-- The default min volume for the alarm stream -->
+ <integer name="config_audio_alarm_min_vol">1</integer>
+
<!-- The default value for whether head tracking for
spatial audio is enabled for a newly connected audio device -->
<bool name="config_spatial_audio_head_tracking_enabled_default">false</bool>
@@ -6830,6 +6833,9 @@
window that does not wrap content). -->
<bool name="config_allowFloatingWindowsFillScreen">false</bool>
+ <!-- Whether to enable left-right split in portrait on this device -->
+ <bool name="config_leftRightSplitInPortrait">false</bool>
+
<!-- Whether scroll haptic feedback is enabled for rotary encoder scrolls on
{@link MotionEvent#AXIS_SCROLL} generated by {@link InputDevice#SOURCE_ROTARY_ENCODER}
devices. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 4b0fa4b..7787c5d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -287,6 +287,7 @@
<java-symbol type="integer" name="config_audio_notif_vol_steps" />
<java-symbol type="integer" name="config_audio_ring_vol_default" />
<java-symbol type="integer" name="config_audio_ring_vol_steps" />
+ <java-symbol type="integer" name="config_audio_alarm_min_vol" />
<java-symbol type="bool" name="config_spatial_audio_head_tracking_enabled_default" />
<java-symbol type="bool" name="config_avoidGfxAccel" />
<java-symbol type="bool" name="config_bluetooth_address_validation" />
@@ -406,6 +407,7 @@
<java-symbol type="bool" name="config_supportsMultiWindow" />
<java-symbol type="bool" name="config_supportsSplitScreenMultiWindow" />
<java-symbol type="bool" name="config_supportsMultiDisplay" />
+ <java-symbol type="bool" name="config_leftRightSplitInPortrait" />
<java-symbol type="integer" name="config_supportsNonResizableMultiWindow" />
<java-symbol type="integer" name="config_respectsActivityMinWidthHeightMultiWindow" />
<java-symbol type="dimen" name="config_minPercentageMultiWindowSupportHeight" />
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 445ddf5..37f592f 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -66,6 +66,7 @@
"testables",
"com.android.text.flags-aconfig-java",
"flag-junit",
+ "ravenwood-junit",
],
libs: [
@@ -163,3 +164,15 @@
"framework-res",
],
}
+
+android_ravenwood_test {
+ name: "FrameworksCoreTestsRavenwood",
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+ srcs: [
+ "src/android/os/FileUtilsTest.java",
+ ],
+ auto_gen_config: true,
+}
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index a0d8183..60500d5 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -51,20 +51,17 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.content.Context;
import android.os.FileUtils.MemoryPipe;
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
import android.provider.DocumentsContract.Document;
import android.util.DataUnit;
-import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
-import com.google.android.collect.Sets;
-
-import libcore.io.Streams;
-
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -74,12 +71,19 @@
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Random;
@RunWith(AndroidJUnit4.class)
public class FileUtilsTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
private static final String TEST_DATA =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
@@ -90,17 +94,13 @@
private final int[] DATA_SIZES = { 32, 32_000, 32_000_000 };
- private Context getContext() {
- return InstrumentationRegistry.getContext();
- }
-
@Before
public void setUp() throws Exception {
- mDir = getContext().getDir("testing", Context.MODE_PRIVATE);
+ mDir = Files.createTempDirectory("FileUtils").toFile();
mTestFile = new File(mDir, "test.file");
mCopyFile = new File(mDir, "copy.file");
- mTarget = getContext().getFilesDir();
+ mTarget = mDir;
FileUtils.deleteContents(mTarget);
}
@@ -152,6 +152,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_FileToPipe() throws Exception {
for (int size : DATA_SIZES) {
final File src = new File(mTarget, "src");
@@ -172,6 +173,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_PipeToFile() throws Exception {
for (int size : DATA_SIZES) {
final File dest = new File(mTarget, "dest");
@@ -191,6 +193,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_PipeToPipe() throws Exception {
for (int size : DATA_SIZES) {
byte[] expected = new byte[size];
@@ -208,6 +211,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = MemoryPipe.class)
public void testCopy_ShortPipeToFile() throws Exception {
byte[] source = new byte[33_000_000];
new Random().nextBytes(source);
@@ -424,6 +428,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_normal() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test"));
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
@@ -443,6 +448,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_unknown() throws Exception {
assertNameEquals("test",
FileUtils.buildUniqueFile(mTarget, "application/octet-stream", "test"));
@@ -456,6 +462,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_dir() throws Exception {
assertNameEquals("test", FileUtils.buildUniqueFile(mTarget, Document.MIME_TYPE_DIR, "test"));
new File(mTarget, "test").mkdir();
@@ -470,6 +477,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_increment() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "image/jpeg", "test.jpg"));
new File(mTarget, "test.jpg").createNewFile();
@@ -489,6 +497,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = android.webkit.MimeTypeMap.class)
public void testBuildUniqueFile_mimeless() throws Exception {
assertNameEquals("test.jpg", FileUtils.buildUniqueFile(mTarget, "test.jpg"));
new File(mTarget, "test.jpg").createNewFile();
@@ -584,6 +593,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode() throws Exception {
assertTranslate("r", O_RDONLY, MODE_READ_ONLY);
@@ -603,6 +613,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testMalformedTransate_int() throws Exception {
try {
// The non-standard Linux access mode 3 should throw
@@ -614,6 +625,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testMalformedTransate_string() throws Exception {
try {
// The non-standard Linux access mode 3 should throw
@@ -625,6 +637,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode_Invalid() throws Exception {
try {
translateModeStringToPosix("rwx");
@@ -639,6 +652,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testTranslateMode_Access() throws Exception {
assertEquals(O_RDONLY, translateModeAccessToPosix(F_OK));
assertEquals(O_RDONLY, translateModeAccessToPosix(R_OK));
@@ -648,6 +662,7 @@
}
@Test
+ @IgnoreUnderRavenwood(reason = "Requires kernel support")
public void testConvertToModernFd() throws Exception {
final String nonce = String.valueOf(System.nanoTime());
@@ -720,13 +735,24 @@
private byte[] readFile(File file) throws Exception {
try (FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
- Streams.copy(in, out);
+ copy(in, out);
return out.toByteArray();
}
}
+ private static int copy(InputStream in, OutputStream out) throws IOException {
+ int total = 0;
+ byte[] buffer = new byte[8192];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
+ }
+ return total;
+ }
+
private void assertDirContents(String... expected) {
- final HashSet<String> expectedSet = Sets.newHashSet(expected);
+ final HashSet<String> expectedSet = new HashSet<>(Arrays.asList(expected));
String[] actual = mDir.list();
if (actual == null) actual = new String[0];
diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
index 20ba427..9b4dec4 100644
--- a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
+++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java
@@ -182,4 +182,42 @@
s.setPreferPowerEfficiency(true);
s.setPreferPowerEfficiency(true);
}
+
+ @Test
+ public void testReportActualWorkDurationWithWorkDurationClass() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(16);
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 8, 6));
+ s.reportActualWorkDuration(new WorkDuration(1, 33, 14, 20));
+ s.reportActualWorkDuration(new WorkDuration(1, 14, 10, 6));
+ }
+
+ @Test
+ public void testReportActualWorkDurationWithWorkDurationClass_IllegalArgument() {
+ Session s = createSession();
+ assumeNotNull(s);
+ s.updateTargetWorkDuration(16);
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(-1, 12, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(0, 12, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, -1, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 0, 8, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, -1, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 0, 6));
+ });
+ assertThrows(IllegalArgumentException.class, () -> {
+ s.reportActualWorkDuration(new WorkDuration(1, 12, 8, -1));
+ });
+ }
}
diff --git a/core/tests/coretests/src/android/view/ViewRootImplTest.java b/core/tests/coretests/src/android/view/ViewRootImplTest.java
index e0e3a35..6172622 100644
--- a/core/tests/coretests/src/android/view/ViewRootImplTest.java
+++ b/core/tests/coretests/src/android/view/ViewRootImplTest.java
@@ -628,6 +628,42 @@
});
}
+ /**
+ * We should boost the frame rate if the value of mInsetsAnimationRunning is true.
+ */
+ @Test
+ @RequiresFlagsEnabled(FLAG_TOOLKIT_SET_FRAME_RATE_READ_ONLY)
+ public void votePreferredFrameRate_insetsAnimation() {
+ View view = new View(sContext);
+ WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(TYPE_APPLICATION_OVERLAY);
+ wmlp.token = new Binder(); // Set a fake token to bypass 'is your activity running' check
+
+ sInstrumentation.runOnMainSync(() -> {
+ WindowManager wm = sContext.getSystemService(WindowManager.class);
+ Display display = wm.getDefaultDisplay();
+ DisplayMetrics metrics = new DisplayMetrics();
+ display.getMetrics(metrics);
+ wmlp.width = (int) (metrics.widthPixels * 0.9);
+ wmlp.height = (int) (metrics.heightPixels * 0.9);
+ wm.addView(view, wmlp);
+ });
+ sInstrumentation.waitForIdleSync();
+
+ ViewRootImpl viewRootImpl = view.getViewRootImpl();
+ sInstrumentation.runOnMainSync(() -> {
+ view.invalidate();
+ assertEquals(viewRootImpl.getLastPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_NORMAL);
+ viewRootImpl.notifyInsetsAnimationRunningStateChanged(true);
+ view.invalidate();
+ });
+ sInstrumentation.waitForIdleSync();
+
+ sInstrumentation.runOnMainSync(() -> {
+ assertEquals(viewRootImpl.getLastPreferredFrameRateCategory(),
+ FRAME_RATE_CATEGORY_HIGH);
+ });
+ }
@Test
public void forceInvertOffDarkThemeOff_forceDarkModeDisabled() {
diff --git a/core/tests/utiltests/Android.bp b/core/tests/utiltests/Android.bp
index 06340a2..967047e 100644
--- a/core/tests/utiltests/Android.bp
+++ b/core/tests/utiltests/Android.bp
@@ -57,8 +57,10 @@
static_libs: [
"androidx.annotation_annotation",
"androidx.test.rules",
+ "mockito_ravenwood",
],
srcs: [
+ "src/android/util/AtomicFileTest.java",
"src/android/util/DataUnitTest.java",
"src/android/util/EventLogTest.java",
"src/android/util/IndentingPrintWriterTest.java",
diff --git a/core/tests/utiltests/src/android/util/AtomicFileTest.java b/core/tests/utiltests/src/android/util/AtomicFileTest.java
index 6f59714..742307b 100644
--- a/core/tests/utiltests/src/android/util/AtomicFileTest.java
+++ b/core/tests/utiltests/src/android/util/AtomicFileTest.java
@@ -23,16 +23,16 @@
import static org.mockito.ArgumentMatchers.longThat;
import static org.mockito.Mockito.spy;
-import android.app.Instrumentation;
-import android.content.Context;
import android.os.SystemClock;
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -46,9 +46,13 @@
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
@RunWith(Parameterized.class)
public class AtomicFileTest {
+ @Rule
+ public final RavenwoodRule mRavenwood = new RavenwoodRule();
+
private static final String BASE_NAME = "base";
private static final String NEW_NAME = BASE_NAME + ".new";
private static final String LEGACY_BACKUP_NAME = BASE_NAME + ".bak";
@@ -80,14 +84,10 @@
@Parameterized.Parameter(3)
public byte[] mExpectedBytes;
- private final Instrumentation mInstrumentation =
- InstrumentationRegistry.getInstrumentation();
- private final Context mContext = mInstrumentation.getContext();
-
- private final File mDirectory = mContext.getFilesDir();
- private final File mBaseFile = new File(mDirectory, BASE_NAME);
- private final File mNewFile = new File(mDirectory, NEW_NAME);
- private final File mLegacyBackupFile = new File(mDirectory, LEGACY_BACKUP_NAME);
+ private File mDirectory;
+ private File mBaseFile;
+ private File mNewFile;
+ private File mLegacyBackupFile;
@Parameterized.Parameters(name = "{0}")
public static Object[][] data() {
@@ -199,6 +199,13 @@
}
@Before
+ public void setUp() throws Exception {
+ mDirectory = Files.createTempDirectory("AtomicFile").toFile();
+ mBaseFile = new File(mDirectory, BASE_NAME);
+ mNewFile = new File(mDirectory, NEW_NAME);
+ mLegacyBackupFile = new File(mDirectory, LEGACY_BACKUP_NAME);
+ }
+
@After
public void deleteFiles() {
mBaseFile.delete();
@@ -274,6 +281,7 @@
}
@Test
+ @IgnoreUnderRavenwood(blockedBy = SystemConfigFileCommitEventLogger.class)
public void testTimeLogging() throws Exception {
var logger = spy(new SystemConfigFileCommitEventLogger("name"));
var file = new AtomicFile(mBaseFile, logger);
diff --git a/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java b/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
index 2814a5f..7d8c53f 100644
--- a/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
+++ b/core/tests/vibrator/src/android/os/vibrator/persistence/VibrationEffectXmlSerializationTest.java
@@ -74,18 +74,18 @@
.addPrimitive(PRIMITIVE_CLICK)
.addPrimitive(PRIMITIVE_TICK, 0.2497f)
.compose();
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
VibrationEffect effect2 = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String xml2 = "<vibration>"
+ String xml2 = "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
TypedXmlPullParser parser = createXmlPullParser(xml);
assertParseElementSucceeds(parser, effect);
@@ -95,7 +95,7 @@
// Test no-issues when an end-tag follows the vibration XML.
// To test this, starting with the corresponding "start-tag" is necessary.
parser = createXmlPullParser("<next-tag>" + xml + "</next-tag>");
- // Move the parser once to point to the "<vibration> tag.
+ // Move the parser once to point to the "<vibration-effect> tag.
parser.next();
assertParseElementSucceeds(parser, effect);
parser.next();
@@ -114,7 +114,7 @@
assertEndOfDocument(parser);
// Check when there is comment before the end tag.
- xml = "<vibration><primitive-effect name=\"tick\"/><!-- comment --></vibration>";
+ xml = "<vibration-effect><primitive-effect name=\"tick\"/><!-- hi --></vibration-effect>";
parser = createXmlPullParser(xml);
assertParseElementSucceeds(
parser, VibrationEffect.startComposition().addPrimitive(PRIMITIVE_TICK).compose());
@@ -128,18 +128,18 @@
.addPrimitive(PRIMITIVE_CLICK)
.addPrimitive(PRIMITIVE_TICK, 0.2497f)
.compose();
- String vibrationXml1 = "<vibration>"
+ String vibrationXml1 = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
VibrationEffect effect2 = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String vibrationXml2 = "<vibration>"
+ String vibrationXml2 = "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
String xml = "<vibration-select>" + vibrationXml1 + vibrationXml2 + "</vibration-select>";
TypedXmlPullParser parser = createXmlPullParser(xml);
@@ -150,7 +150,7 @@
// Test no-issues when an end-tag follows the vibration XML.
// To test this, starting with the corresponding "start-tag" is necessary.
parser = createXmlPullParser("<next-tag>" + xml + "</next-tag>");
- // Move the parser once to point to the "<vibration> tag.
+ // Move the parser once to point to the "<vibration-effect> tag.
parser.next();
assertParseElementSucceeds(parser, effect1, effect2);
parser.next();
@@ -183,7 +183,8 @@
@Test
public void testParseElement_withHiddenApis_onlySucceedsWithFlag() throws Exception {
// Check when the root tag is "vibration".
- String xml = "<vibration><predefined-effect name=\"texture_tick\"/></vibration>";
+ String xml =
+ "<vibration-effect><predefined-effect name=\"texture_tick\"/></vibration-effect>";
assertParseElementSucceeds(createXmlPullParser(xml),
VibrationXmlSerializer.FLAG_ALLOW_HIDDEN_APIS,
VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK));
@@ -201,29 +202,29 @@
public void testParseElement_badXml_throwsException() throws Exception {
// No "vibration-select" tag.
assertParseElementFails(
- "<vibration>random text<primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<bad-tag><primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<primitive-effect name=\"click\"/></vibration>");
- assertParseElementFails("<vibration><primitive-effect name=\"click\"/>");
+ "<vibration-effect>rand text<primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<bad-tag><primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<primitive-effect name=\"click\"/></vibration-effect>");
+ assertParseElementFails("<vibration-effect><primitive-effect name=\"click\"/>");
// Incomplete XML.
assertParseElementFails("<vibration-select><primitive-effect name=\"click\"/>");
assertParseElementFails("<vibration-select>"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
- + "</vibration>");
+ + "</vibration-effect>");
// Bad vibration XML.
assertParseElementFails("<vibration-select>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</vibration-select>");
// "vibration-select" tag should have no attributes.
assertParseElementFails("<vibration-select bad_attr=\"123\">"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<predefined-effect name=\"tick\"/>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</vibration-select>");
}
@@ -235,12 +236,12 @@
.addPrimitive(PRIMITIVE_LOW_TICK, 1f, 356)
.addPrimitive(PRIMITIVE_SPIN, 0.6364f, 7)
.compose();
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<primitive-effect name=\"click\"/>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
+ "<primitive-effect name=\"low_tick\" delayMs=\"356\"/>"
+ "<primitive-effect name=\"spin\" scale=\"0.6364\" delayMs=\"7\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, "click", "tick", "low_tick", "spin");
@@ -254,8 +255,9 @@
@Test
public void testParseDocument_withVibrationSelectTag_withHiddenApis_onlySucceedsWithFlag()
throws Exception {
- // Check when the root tag is "vibration".
- String xml = "<vibration><predefined-effect name=\"texture_tick\"/></vibration>";
+ // Check when the root tag is "vibration-effect".
+ String xml =
+ "<vibration-effect><predefined-effect name=\"texture_tick\"/></vibration-effect>";
assertParseDocumentSucceeds(xml,
VibrationXmlSerializer.FLAG_ALLOW_HIDDEN_APIS,
VibrationEffect.get(VibrationEffect.EFFECT_TEXTURE_TICK));
@@ -273,14 +275,14 @@
public void testWaveforms_allSucceed() throws IOException {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{123, 456, 789, 0},
new int[]{254, 1, 255, 0}, /* repeat= */ 0);
- String xml = "<vibration>"
+ String xml = "<vibration-effect>"
+ "<waveform-effect><repeating>"
+ "<waveform-entry durationMs=\"123\" amplitude=\"254\"/>"
+ "<waveform-entry durationMs=\"456\" amplitude=\"1\"/>"
+ "<waveform-entry durationMs=\"789\" amplitude=\"255\"/>"
+ "<waveform-entry durationMs=\"0\" amplitude=\"0\"/>"
+ "</repeating></waveform-effect>"
- + "</vibration>";
+ + "</vibration-effect>";
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, "123", "456", "789", "254", "1", "255", "0");
@@ -297,7 +299,8 @@
for (Map.Entry<String, Integer> entry : createPublicPredefinedEffectsMap().entrySet()) {
VibrationEffect effect = VibrationEffect.get(entry.getValue());
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\"/></vibration>", entry.getKey());
+ "<vibration-effect><predefined-effect name=\"%s\"/></vibration-effect>",
+ entry.getKey());
assertPublicApisParserSucceeds(xml, effect);
assertPublicApisSerializerSucceeds(effect, entry.getKey());
@@ -314,7 +317,8 @@
for (Map.Entry<String, Integer> entry : createHiddenPredefinedEffectsMap().entrySet()) {
VibrationEffect effect = VibrationEffect.get(entry.getValue());
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\"/></vibration>", entry.getKey());
+ "<vibration-effect><predefined-effect name=\"%s\"/></vibration-effect>",
+ entry.getKey());
assertPublicApisParserFails(xml);
assertPublicApisSerializerFails(effect);
@@ -332,7 +336,8 @@
boolean nonDefaultFallback = !PrebakedSegment.DEFAULT_SHOULD_FALLBACK;
VibrationEffect effect = VibrationEffect.get(entry.getValue(), nonDefaultFallback);
String xml = String.format(
- "<vibration><predefined-effect name=\"%s\" fallback=\"%s\"/></vibration>",
+ "<vibration-effect><predefined-effect name=\"%s\" fallback=\"%s\"/>"
+ + "</vibration-effect>",
entry.getKey(), nonDefaultFallback);
assertPublicApisParserFails(xml);
@@ -378,7 +383,7 @@
private void assertParseElementSucceeds(
TypedXmlPullParser parser, int flags, VibrationEffect... effects) throws Exception {
String tagName = parser.getName();
- assertThat(Set.of("vibration", "vibration-select")).contains(tagName);
+ assertThat(Set.of("vibration-effect", "vibration-select")).contains(tagName);
assertThat(parseElement(parser, flags).getVibrationEffects()).containsExactly(effects);
assertThat(parser.getEventType()).isEqualTo(XmlPullParser.END_TAG);
diff --git a/core/xsd/Android.bp b/core/xsd/Android.bp
index 4e418d6..39b5311 100644
--- a/core/xsd/Android.bp
+++ b/core/xsd/Android.bp
@@ -20,7 +20,7 @@
api_dir: "vibrator/vibration/schema",
package_name: "com.android.internal.vibrator.persistence",
root_elements: [
- "vibration",
+ "vibration-effect",
"vibration-select",
],
}
diff --git a/core/xsd/vibrator/vibration/schema/current.txt b/core/xsd/vibrator/vibration/schema/current.txt
index 1766384..f0e13c4 100644
--- a/core/xsd/vibrator/vibration/schema/current.txt
+++ b/core/xsd/vibrator/vibration/schema/current.txt
@@ -37,8 +37,8 @@
enum_constant public static final com.android.internal.vibrator.persistence.PrimitiveEffectName tick;
}
- public class Vibration {
- ctor public Vibration();
+ public class VibrationEffect {
+ ctor public VibrationEffect();
method public com.android.internal.vibrator.persistence.PredefinedEffect getPredefinedEffect_optional();
method public com.android.internal.vibrator.persistence.PrimitiveEffect getPrimitiveEffect_optional();
method public com.android.internal.vibrator.persistence.WaveformEffect getWaveformEffect_optional();
@@ -49,7 +49,7 @@
public class VibrationSelect {
ctor public VibrationSelect();
- method public java.util.List<com.android.internal.vibrator.persistence.Vibration> getVibration();
+ method public java.util.List<com.android.internal.vibrator.persistence.VibrationEffect> getVibrationEffect();
}
public enum WaveformAmplitudeDefault {
@@ -80,7 +80,7 @@
public class XmlParser {
ctor public XmlParser();
method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
- method public static com.android.internal.vibrator.persistence.Vibration readVibration(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static com.android.internal.vibrator.persistence.VibrationEffect readVibrationEffect(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static com.android.internal.vibrator.persistence.VibrationSelect readVibrationSelect(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
}
diff --git a/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd b/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
index 679b9fa..fcd250b 100644
--- a/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
+++ b/core/xsd/vibrator/vibration/vibration-plus-hidden-apis.xsd
@@ -25,7 +25,7 @@
<!-- Root tag definitions -->
- <xs:element name="vibration" type="Vibration"/>
+ <xs:element name="vibration-effect" type="VibrationEffect"/>
<xs:element name="vibration-select" type="VibrationSelect"/>
@@ -33,11 +33,11 @@
<xs:complexType name="VibrationSelect">
<xs:sequence>
- <xs:element name="vibration" type="Vibration" minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="vibration-effect" type="VibrationEffect" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
- <xs:complexType name="Vibration">
+ <xs:complexType name="VibrationEffect">
<xs:choice>
<!-- Waveform vibration effect -->
diff --git a/core/xsd/vibrator/vibration/vibration.xsd b/core/xsd/vibrator/vibration/vibration.xsd
index 8406562..b9de691 100644
--- a/core/xsd/vibrator/vibration/vibration.xsd
+++ b/core/xsd/vibrator/vibration/vibration.xsd
@@ -23,7 +23,7 @@
<!-- Root tag definitions -->
- <xs:element name="vibration" type="Vibration"/>
+ <xs:element name="vibration-effect" type="VibrationEffect"/>
<xs:element name="vibration-select" type="VibrationSelect"/>
@@ -31,11 +31,11 @@
<xs:complexType name="VibrationSelect">
<xs:sequence>
- <xs:element name="vibration" type="Vibration" minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="vibration-effect" type="VibrationEffect" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
- <xs:complexType name="Vibration">
+ <xs:complexType name="VibrationEffect">
<xs:choice>
<!-- Waveform vibration effect -->
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 1f08955..3cf28c9 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -383,6 +383,8 @@
<!-- Permission required for ShortcutManagerUsageTest CTS test. -->
<permission name="android.permission.ACCESS_SHORTCUTS"/>
<permission name="android.permission.REBOOT"/>
+ <!-- Permission required for NfcResolverActivity CTS tests. -->
+ <permission name="android.permission.SHOW_CUSTOMIZED_RESOLVER"/>
<!-- Permission required for access VIBRATOR_STATE. -->
<permission name="android.permission.ACCESS_VIBRATOR_STATE"/>
<!-- Permission required for UsageStatsTest CTS test. -->
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 2237ba1..1912821 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -595,6 +595,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "-1518132958": {
+ "message": "fractionRendered boundsOverSource=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-1517908912": {
"message": "requestScrollCapture: caught exception dispatching to window.token=%s",
"level": "WARN",
@@ -961,6 +967,12 @@
"group": "WM_DEBUG_CONTENT_RECORDING",
"at": "com\/android\/server\/wm\/ContentRecorder.java"
},
+ "-1209762265": {
+ "message": "Registering listener=%s with id=%d for window=%s with %s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-1209252064": {
"message": "Clear animatingExit: reason=clearAnimatingFlags win=%s",
"level": "DEBUG",
@@ -1333,6 +1345,12 @@
"group": "WM_DEBUG_WINDOW_TRANSITIONS",
"at": "com\/android\/server\/wm\/Transition.java"
},
+ "-888703350": {
+ "message": "Skipping %s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"-883738232": {
"message": "Adding more than one toast window for UID at a time.",
"level": "WARN",
@@ -2803,6 +2821,12 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "360319850": {
+ "message": "fractionRendered scale=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"364992694": {
"message": "freezeDisplayRotation: current rotation=%d, new rotation=%d, caller=%s",
"level": "VERBOSE",
@@ -2983,6 +3007,12 @@
"group": "WM_DEBUG_BACK_PREVIEW",
"at": "com\/android\/server\/wm\/BackNavigationController.java"
},
+ "532771960": {
+ "message": "Adding untrusted state listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"535103992": {
"message": "Wallpaper may change! Adjusting",
"level": "VERBOSE",
@@ -3061,6 +3091,12 @@
"group": "WM_DEBUG_DREAM",
"at": "com\/android\/server\/wm\/ActivityTaskManagerService.java"
},
+ "605179032": {
+ "message": "checkIfInThreshold fractionRendered=%f alpha=%f currTimeMs=%d",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"608694300": {
"message": " NEW SURFACE SESSION %s",
"level": "INFO",
@@ -3289,6 +3325,12 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/WindowState.java"
},
+ "824532141": {
+ "message": "lastState=%s newState=%s alpha=%f minAlpha=%f fractionRendered=%f minFractionRendered=%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"829434921": {
"message": "Draw state now committed in %s",
"level": "VERBOSE",
@@ -3583,6 +3625,12 @@
"group": "WM_SHOW_SURFACE_ALLOC",
"at": "com\/android\/server\/wm\/ScreenRotationAnimation.java"
},
+ "1090378847": {
+ "message": "Checking %d windows",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1100065297": {
"message": "Attempted to get IME policy of a display that does not exist: %d",
"level": "WARN",
@@ -3715,6 +3763,12 @@
"group": "WM_DEBUG_FOCUS",
"at": "com\/android\/server\/wm\/ActivityRecord.java"
},
+ "1251721200": {
+ "message": "unregister failed, couldn't find deathRecipient for %s with id=%d",
+ "level": "ERROR",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1252594551": {
"message": "Window types in WindowContext and LayoutParams.type should match! Type from LayoutParams is %d, but type from WindowContext is %d",
"level": "WARN",
@@ -3853,6 +3907,12 @@
"group": "WM_DEBUG_ORIENTATION",
"at": "com\/android\/server\/wm\/TaskDisplayArea.java"
},
+ "1382634842": {
+ "message": "Unregistering listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1393721079": {
"message": "Starting remote display change: from [rot = %d], to [%dx%d, rot = %d]",
"level": "VERBOSE",
@@ -3901,6 +3961,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "1445704347": {
+ "message": "coveredRegionsAbove updated with %s frame:%s region:%s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1448683958": {
"message": "Override pending remote transitionSet=%b adapter=%s",
"level": "INFO",
@@ -4201,6 +4267,12 @@
"group": "WM_DEBUG_RECENTS_ANIMATIONS",
"at": "com\/android\/server\/wm\/RecentsAnimation.java"
},
+ "1786463281": {
+ "message": "Adding trusted state listener=%s with id=%d",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1789321832": {
"message": "Then token:%s is invalid. It might be removed",
"level": "WARN",
@@ -4375,6 +4447,12 @@
"group": "WM_DEBUG_TASKS",
"at": "com\/android\/server\/wm\/RootWindowContainer.java"
},
+ "1955470028": {
+ "message": "computeFractionRendered: visibleRegion=%s screenBounds=%s contentSize=%s scale=%f,%f",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_TPL",
+ "at": "com\/android\/server\/wm\/TrustedPresentationListenerController.java"
+ },
"1964565370": {
"message": "Starting remote animation",
"level": "INFO",
@@ -4659,6 +4737,9 @@
"WM_DEBUG_TASKS": {
"tag": "WindowManager"
},
+ "WM_DEBUG_TPL": {
+ "tag": "WindowManager"
+ },
"WM_DEBUG_WALLPAPER": {
"tag": "WindowManager"
},
diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm
index 1048742..e7e1740 100644
--- a/data/keyboards/Generic.kcm
+++ b/data/keyboards/Generic.kcm
@@ -500,7 +500,7 @@
key ESCAPE {
base: none
- alt, meta: fallback HOME
+ alt: fallback HOME
ctrl: fallback MENU
}
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp
index fd4522e..5ad144d 100644
--- a/libs/WindowManager/Shell/Android.bp
+++ b/libs/WindowManager/Shell/Android.bp
@@ -160,6 +160,7 @@
"kotlinx-coroutines-core",
"iconloader_base",
"com_android_wm_shell_flags_lib",
+ "com.android.window.flags.window-aconfig-java",
"WindowManager-Shell-proto",
"dagger2",
"jsr330",
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index 4d2d960..4511f3b 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -50,3 +50,10 @@
bug: "290220798"
is_fixed_read_only: true
}
+
+flag {
+ name: "enable_left_right_split_in_portrait"
+ namespace: "multitasking"
+ description: "Enables left/right split in portrait"
+ bug: "291018646"
+}
diff --git a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml b/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
deleted file mode 100644
index d732b01..0000000
--- a/libs/WindowManager/Shell/res/layout/docked_stack_divider.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<com.android.wm.shell.legacysplitscreen.DividerView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="match_parent"
- android:layout_width="match_parent">
-
- <View
- style="@style/DockedDividerBackground"
- android:id="@+id/docked_divider_background"
- android:background="@color/split_divider_background"/>
-
- <com.android.wm.shell.legacysplitscreen.MinimizedDockShadow
- style="@style/DockedDividerMinimizedShadow"
- android:id="@+id/minimized_dock_shadow"
- android:alpha="0"/>
-
- <com.android.wm.shell.common.split.DividerHandleView
- style="@style/DockedDividerHandle"
- android:id="@+id/docked_divider_handle"
- android:contentDescription="@string/accessibility_divider"
- android:background="@null"/>
-
-</com.android.wm.shell.legacysplitscreen.DividerView>
diff --git a/libs/WindowManager/Shell/res/layout/split_divider.xml b/libs/WindowManager/Shell/res/layout/split_divider.xml
index e3be700..db35c8c 100644
--- a/libs/WindowManager/Shell/res/layout/split_divider.xml
+++ b/libs/WindowManager/Shell/res/layout/split_divider.xml
@@ -24,17 +24,16 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <View
- style="@style/DockedDividerBackground"
- android:id="@+id/docked_divider_background"/>
-
<com.android.wm.shell.common.split.DividerHandleView
- style="@style/DockedDividerHandle"
android:id="@+id/docked_divider_handle"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:layout_gravity="center"
android:contentDescription="@string/accessibility_divider"
android:background="@null"/>
<com.android.wm.shell.common.split.DividerRoundedCorner
+ android:id="@+id/docked_divider_rounded_corner"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
diff --git a/libs/WindowManager/Shell/res/values-land/dimens.xml b/libs/WindowManager/Shell/res/values-land/dimens.xml
index a95323f..1b96fa2 100644
--- a/libs/WindowManager/Shell/res/values-land/dimens.xml
+++ b/libs/WindowManager/Shell/res/values-land/dimens.xml
@@ -16,13 +16,6 @@
*/
-->
<resources>
- <!-- Divider handle size for legacy split screen -->
- <dimen name="docked_divider_handle_width">2dp</dimen>
- <dimen name="docked_divider_handle_height">16dp</dimen>
- <!-- Divider handle size for split screen -->
- <dimen name="split_divider_handle_width">3dp</dimen>
- <dimen name="split_divider_handle_height">72dp</dimen>
-
<!-- Padding between status bar and bubbles when displayed in expanded state, smaller
value in landscape since we have limited vertical space-->
<dimen name="bubble_padding_top">4dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values-land/styles.xml b/libs/WindowManager/Shell/res/values-land/styles.xml
deleted file mode 100644
index e89f65b..0000000
--- a/libs/WindowManager/Shell/res/values-land/styles.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="DockedDividerBackground">
- <item name="android:layout_width">@dimen/split_divider_bar_width</item>
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_gravity">center_horizontal</item>
- <item name="android:background">@color/split_divider_background</item>
- </style>
-
- <style name="DockedDividerHandle">
- <item name="android:layout_gravity">center</item>
- <item name="android:layout_width">48dp</item>
- <item name="android:layout_height">96dp</item>
- </style>
-
- <style name="DockedDividerMinimizedShadow">
- <item name="android:layout_width">8dp</item>
- <item name="android:layout_height">match_parent</item>
- </style>
-</resources>
-
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index f20d44d..8f9de61 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -96,6 +96,9 @@
<dimen name="docked_divider_handle_width">16dp</dimen>
<dimen name="docked_divider_handle_height">2dp</dimen>
<!-- Divider handle size for split screen -->
+ <dimen name="split_divider_handle_region_width">96dp</dimen>
+ <dimen name="split_divider_handle_region_height">48dp</dimen>
+
<dimen name="split_divider_handle_width">72dp</dimen>
<dimen name="split_divider_handle_height">3dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/styles.xml b/libs/WindowManager/Shell/res/values/styles.xml
index 468cfd5..08c2a02 100644
--- a/libs/WindowManager/Shell/res/values/styles.xml
+++ b/libs/WindowManager/Shell/res/values/styles.xml
@@ -60,20 +60,9 @@
<style name="DockedDividerBackground">
<item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">@dimen/split_divider_bar_width</item>
- <item name="android:layout_gravity">center_vertical</item>
- <item name="android:background">@color/split_divider_background</item>
- </style>
-
- <style name="DockedDividerMinimizedShadow">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">8dp</item>
- </style>
-
- <style name="DockedDividerHandle">
+ <item name="android:layout_height">match_parent</item>
<item name="android:layout_gravity">center</item>
- <item name="android:layout_width">96dp</item>
- <item name="android:layout_height">48dp</item>
+ <item name="android:background">@color/split_divider_background</item>
</style>
<style name="TvPipEduText">
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
index baa52a0..5d16196 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java
@@ -397,6 +397,9 @@
* the screen and the size of the elements around it (e.g. padding, pointer, manage button).
*/
public int getMaxExpandedViewHeight(boolean isOverflow) {
+ if (mDeviceConfig.isLargeScreen() && !mDeviceConfig.isSmallTablet() && !isOverflow) {
+ return getExpandedViewHeightForLargeScreen();
+ }
// Subtract top insets because availableRect.height would account for that
int expandedContainerY = (int) getExpandedViewYTopAligned() - getInsets().top;
int paddingTop = showBubblesVertically()
@@ -414,6 +417,16 @@
- bottomPadding;
}
+ private int getExpandedViewHeightForLargeScreen() {
+ // the expanded view height on large tablets is calculated based on the shortest screen
+ // size and is the same in both portrait and landscape
+ int maxVerticalInset = Math.max(mInsets.top, mInsets.bottom);
+ int shortestScreenSide = Math.min(getScreenRect().height(), getScreenRect().width());
+ // Subtract pointer size because it's laid out in LinearLayout with the expanded view.
+ return shortestScreenSide - maxVerticalInset * 2
+ - mManageButtonHeight - mPointerWidth - mExpandedViewPadding * 2;
+ }
+
/**
* Determines the height for the bubble, ensuring a minimum height. If the height should be as
* big as available, returns {@link #MAX_HEIGHT}.
@@ -424,15 +437,6 @@
// overflow in landscape on phone is max
return MAX_HEIGHT;
}
-
- if (mDeviceConfig.isLargeScreen() && !mDeviceConfig.isSmallTablet() && !isOverflow) {
- // the expanded view height on large tablets is calculated based on the shortest screen
- // size and is the same in both portrait and landscape
- int maxVerticalInset = Math.max(mInsets.top, mInsets.bottom);
- int shortestScreenSide = Math.min(mScreenRect.height(), mScreenRect.width());
- return shortestScreenSide - 2 * maxVerticalInset - mManageButtonHeight;
- }
-
float desiredHeight = isOverflow
? mOverflowHeight
: ((Bubble) bubble).getDesiredHeight(mContext);
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
index 91a8ce7..ff4da85 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java
@@ -1510,6 +1510,11 @@
updateExpandedView();
}
setUpManageMenu();
+ if (mShowingManage) {
+ // the manage menu location depends on the manage button location which may need a
+ // layout pass, so post this to the looper
+ post(() -> showManageMenu(true));
+ }
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
index 79f188a..50e1f73 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedView.java
@@ -67,6 +67,7 @@
private boolean mIsOverflow;
private BubbleTaskViewHelper mBubbleTaskViewHelper;
private BubbleBarMenuViewController mMenuViewController;
+ private BubbleBarExpandedViewDragController mDragController;
private @Nullable Supplier<Rect> mLayerBoundsSupplier;
private @Nullable Listener mListener;
@@ -180,6 +181,8 @@
mHandleView.setOnClickListener(view -> {
mMenuViewController.showMenu(true /* animated */);
});
+
+ mDragController = new BubbleBarExpandedViewDragController(this);
}
public BubbleBarHandleView getHandleView() {
@@ -386,4 +389,11 @@
setContentVisibility(mIsContentVisible);
}
}
+
+ /**
+ * Check whether the view is animating
+ */
+ public boolean isAnimating() {
+ return mIsAnimating;
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
new file mode 100644
index 0000000..933794b
--- /dev/null
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt
@@ -0,0 +1,100 @@
+/*
+ * 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.bubbles.bar
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.graphics.PointF
+import android.view.MotionEvent
+import android.view.View
+import com.android.wm.shell.animation.Interpolators
+import com.android.wm.shell.common.bubbles.RelativeTouchListener
+
+/** Controller for handling drag interactions with [BubbleBarExpandedView] */
+class BubbleBarExpandedViewDragController(private val expandedView: BubbleBarExpandedView) {
+
+ init {
+ expandedView.handleView.setOnTouchListener(HandleDragListener())
+ }
+
+ private fun resetExpandedViewPosition(initialX: Float, initialY: Float) {
+ val listener = object : AnimatorListenerAdapter() {
+ override fun onAnimationStart(animation: Animator) {
+ expandedView.isAnimating = true
+ }
+
+ override fun onAnimationEnd(animation: Animator) {
+ expandedView.isAnimating = false
+ }
+ }
+ expandedView.animate()
+ .translationX(initialX)
+ .translationY(initialY)
+ .setDuration(RESET_POSITION_ANIM_DURATION)
+ .setInterpolator(Interpolators.EMPHASIZED_DECELERATE)
+ .setListener(listener)
+ .start()
+ }
+
+ private inner class HandleDragListener : RelativeTouchListener() {
+
+ private val expandedViewRestPosition = PointF()
+
+ override fun onDown(v: View, ev: MotionEvent): Boolean {
+ // While animating, don't allow new touch events
+ if (expandedView.isAnimating) {
+ return false
+ }
+ expandedViewRestPosition.x = expandedView.translationX
+ expandedViewRestPosition.y = expandedView.translationY
+ return true
+ }
+
+ override fun onMove(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float,
+ dx: Float,
+ dy: Float
+ ) {
+ expandedView.translationX = expandedViewRestPosition.x + dx
+ expandedView.translationY = expandedViewRestPosition.y + dy
+ }
+
+ override fun onUp(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float,
+ dx: Float,
+ dy: Float,
+ velX: Float,
+ velY: Float
+ ) {
+ resetExpandedViewPosition(expandedViewRestPosition.x, expandedViewRestPosition.y)
+ }
+
+ override fun onCancel(v: View, ev: MotionEvent, viewInitialX: Float, viewInitialY: Float) {
+ resetExpandedViewPosition(expandedViewRestPosition.x, expandedViewRestPosition.y)
+ }
+ }
+
+ companion object {
+ const val RESET_POSITION_ANIM_DURATION = 300L
+ }
+}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
index d45e126..4e55ba2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/bubbles/RelativeTouchListener.kt
@@ -78,8 +78,15 @@
velY: Float
)
+ open fun onCancel(
+ v: View,
+ ev: MotionEvent,
+ viewInitialX: Float,
+ viewInitialY: Float
+ ) {}
+
/** The raw coordinates of the last ACTION_DOWN event. */
- private val touchDown = PointF()
+ private var touchDown: PointF? = null
/** The coordinates of the view, at the time of the last ACTION_DOWN event. */
private val viewPositionOnTouchDown = PointF()
@@ -91,12 +98,11 @@
private var performedLongClick = false
- @Suppress("UNCHECKED_CAST")
override fun onTouch(v: View, ev: MotionEvent): Boolean {
addMovement(ev)
- val dx = ev.rawX - touchDown.x
- val dy = ev.rawY - touchDown.y
+ val dx = touchDown?.let { ev.rawX - it.x } ?: 0f
+ val dy = touchDown?.let { ev.rawY - it.y } ?: 0f
when (ev.action) {
MotionEvent.ACTION_DOWN -> {
@@ -108,7 +114,7 @@
// last gesture.
touchSlop = ViewConfiguration.get(v.context).scaledTouchSlop
- touchDown.set(ev.rawX, ev.rawY)
+ touchDown = PointF(ev.rawX, ev.rawY)
viewPositionOnTouchDown.set(v.translationX, v.translationY)
performedLongClick = false
@@ -120,6 +126,7 @@
}
MotionEvent.ACTION_MOVE -> {
+ if (touchDown == null) return false
if (!movedEnough && hypot(dx, dy) > touchSlop && !performedLongClick) {
movedEnough = true
v.handler?.removeCallbacksAndMessages(null)
@@ -131,6 +138,7 @@
}
MotionEvent.ACTION_UP -> {
+ if (touchDown == null) return false
if (movedEnough) {
velocityTracker.computeCurrentVelocity(1000 /* units */)
onUp(v, ev, viewPositionOnTouchDown.x, viewPositionOnTouchDown.y, dx, dy,
@@ -143,12 +151,16 @@
velocityTracker.clear()
movedEnough = false
+ touchDown = null
}
MotionEvent.ACTION_CANCEL -> {
+ if (touchDown == null) return false
v.handler?.removeCallbacksAndMessages(null)
velocityTracker.clear()
movedEnough = false
+ touchDown = null
+ onCancel(v, ev, viewPositionOnTouchDown.x, viewPositionOnTouchDown.y)
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
index ec26800..999da24 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerHandleView.java
@@ -68,24 +68,33 @@
};
private final Paint mPaint = new Paint();
- private final int mWidth;
- private final int mHeight;
- private final int mTouchingWidth;
- private final int mTouchingHeight;
+ private int mWidth;
+ private int mHeight;
+ private int mTouchingWidth;
+ private int mTouchingHeight;
private int mCurrentWidth;
private int mCurrentHeight;
private AnimatorSet mAnimator;
private boolean mTouching;
private boolean mHovering;
- private final int mHoveringWidth;
- private final int mHoveringHeight;
+ private int mHoveringWidth;
+ private int mHoveringHeight;
+ private boolean mIsLeftRightSplit;
public DividerHandleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mPaint.setColor(getResources().getColor(R.color.docked_divider_handle, null));
mPaint.setAntiAlias(true);
- mWidth = getResources().getDimensionPixelSize(R.dimen.split_divider_handle_width);
- mHeight = getResources().getDimensionPixelSize(R.dimen.split_divider_handle_height);
+ updateDimens();
+ }
+
+ private void updateDimens() {
+ mWidth = getResources().getDimensionPixelSize(mIsLeftRightSplit
+ ? R.dimen.split_divider_handle_height
+ : R.dimen.split_divider_handle_width);
+ mHeight = getResources().getDimensionPixelSize(mIsLeftRightSplit
+ ? R.dimen.split_divider_handle_width
+ : R.dimen.split_divider_handle_height);
mCurrentWidth = mWidth;
mCurrentHeight = mHeight;
mTouchingWidth = mWidth > mHeight ? mWidth / 2 : mWidth;
@@ -94,6 +103,11 @@
mHoveringHeight = mHeight > mWidth ? ((int) (mHeight * 1.5f)) : mHeight;
}
+ void setIsLeftRightSplit(boolean isLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
+ updateDimens();
+ }
+
/** Sets touching state for this handle view. */
public void setTouching(boolean touching, boolean animate) {
if (touching == mTouching) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
index 364bb65..834c15d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerRoundedCorner.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.common.split;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.RoundedCorner.POSITION_BOTTOM_LEFT;
import static android.view.RoundedCorner.POSITION_BOTTOM_RIGHT;
import static android.view.RoundedCorner.POSITION_TOP_LEFT;
@@ -47,6 +46,7 @@
private InvertedRoundedCornerDrawInfo mTopRightCorner;
private InvertedRoundedCornerDrawInfo mBottomLeftCorner;
private InvertedRoundedCornerDrawInfo mBottomRightCorner;
+ private boolean mIsLeftRightSplit;
public DividerRoundedCorner(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
@@ -98,8 +98,8 @@
return false;
}
- private boolean isLandscape() {
- return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
+ void setIsLeftRightSplit(boolean isLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
}
/**
@@ -134,7 +134,7 @@
}
private void calculateStartPos(Point outPos) {
- if (isLandscape()) {
+ if (mIsLeftRightSplit) {
// Place left corner at the right side of the divider bar.
outPos.x = isLeftCorner()
? getWidth() / 2 + mDividerWidth / 2
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
index 0b0c693..0f0fbd9c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
@@ -16,7 +16,6 @@
package com.android.wm.shell.common.split;
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.PointerIcon.TYPE_HORIZONTAL_DOUBLE_ARROW;
import static android.view.PointerIcon.TYPE_VERTICAL_DOUBLE_ARROW;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
@@ -27,6 +26,8 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.provider.DeviceConfig;
@@ -65,12 +66,15 @@
public static final long TOUCH_ANIMATION_DURATION = 150;
public static final long TOUCH_RELEASE_ANIMATION_DURATION = 200;
+ private final Paint mPaint = new Paint();
+ private final Rect mBackgroundRect = new Rect();
private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
private SplitLayout mSplitLayout;
private SplitWindowManager mSplitWindowManager;
private SurfaceControlViewHost mViewHost;
private DividerHandleView mHandle;
+ private DividerRoundedCorner mCorners;
private View mBackground;
private int mTouchElevation;
@@ -81,6 +85,8 @@
private boolean mInteractive;
private boolean mSetTouchRegion = true;
private int mLastDraggingPosition;
+ private int mHandleRegionWidth;
+ private int mHandleRegionHeight;
/**
* Tracks divider bar visible bounds in screen-based coordination. Used to calculate with
@@ -123,7 +129,7 @@
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
final DividerSnapAlgorithm snapAlgorithm = mSplitLayout.mDividerSnapAlgorithm;
- if (isLandscape()) {
+ if (mSplitLayout.isLeftRightSplit()) {
info.addAction(new AccessibilityAction(R.id.action_move_tl_full,
mContext.getString(R.string.accessibility_action_divider_left_full)));
if (snapAlgorithm.isFirstSplitTargetAvailable()) {
@@ -215,6 +221,17 @@
mViewHost = viewHost;
layout.getDividerBounds(mDividerBounds);
onInsetsChanged(insetsState, false /* animate */);
+
+ final boolean isLeftRightSplit = mSplitLayout.isLeftRightSplit();
+ mHandle.setIsLeftRightSplit(isLeftRightSplit);
+ mCorners.setIsLeftRightSplit(isLeftRightSplit);
+
+ mHandleRegionWidth = getResources().getDimensionPixelSize(isLeftRightSplit
+ ? R.dimen.split_divider_handle_region_height
+ : R.dimen.split_divider_handle_region_width);
+ mHandleRegionHeight = getResources().getDimensionPixelSize(isLeftRightSplit
+ ? R.dimen.split_divider_handle_region_width
+ : R.dimen.split_divider_handle_region_height);
}
void onInsetsChanged(InsetsState insetsState, boolean animate) {
@@ -255,30 +272,47 @@
super.onFinishInflate();
mDividerBar = findViewById(R.id.divider_bar);
mHandle = findViewById(R.id.docked_divider_handle);
- mBackground = findViewById(R.id.docked_divider_background);
+ mCorners = findViewById(R.id.docked_divider_rounded_corner);
mTouchElevation = getResources().getDimensionPixelSize(
R.dimen.docked_stack_divider_lift_elevation);
mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener());
mInteractive = true;
setOnTouchListener(this);
mHandle.setAccessibilityDelegate(mHandleDelegate);
+ setWillNotDraw(false);
+ mPaint.setColor(getResources().getColor(R.color.split_divider_background, null));
+ mPaint.setAntiAlias(true);
+ mPaint.setStyle(Paint.Style.FILL);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (mSetTouchRegion) {
- mTempRect.set(mHandle.getLeft(), mHandle.getTop(), mHandle.getRight(),
- mHandle.getBottom());
+ int startX = (mDividerBounds.width() - mHandleRegionWidth) / 2;
+ int startY = (mDividerBounds.height() - mHandleRegionHeight) / 2;
+ mTempRect.set(startX, startY, startX + mHandleRegionWidth,
+ startY + mHandleRegionHeight);
mSplitWindowManager.setTouchRegion(mTempRect);
mSetTouchRegion = false;
}
+
+ if (changed) {
+ boolean isHorizontalSplit = mSplitLayout.isLeftRightSplit();
+ int dividerSize = getResources().getDimensionPixelSize(R.dimen.split_divider_bar_width);
+ left = isHorizontalSplit ? (getWidth() - dividerSize) / 2 : 0;
+ top = isHorizontalSplit ? 0 : (getHeight() - dividerSize) / 2;
+ right = isHorizontalSplit ? left + dividerSize : getWidth();
+ bottom = isHorizontalSplit ? getHeight() : top + dividerSize;
+ mBackgroundRect.set(left, top, right, bottom);
+ }
}
@Override
public PointerIcon onResolvePointerIcon(MotionEvent event, int pointerIndex) {
return PointerIcon.getSystemIcon(getContext(),
- isLandscape() ? TYPE_HORIZONTAL_DOUBLE_ARROW : TYPE_VERTICAL_DOUBLE_ARROW);
+ mSplitLayout.isLeftRightSplit() ? TYPE_HORIZONTAL_DOUBLE_ARROW
+ : TYPE_VERTICAL_DOUBLE_ARROW);
}
@Override
@@ -295,8 +329,8 @@
// moving divider bar and calculating dragging velocity.
event.setLocation(event.getRawX(), event.getRawY());
final int action = event.getAction() & MotionEvent.ACTION_MASK;
- final boolean isLandscape = isLandscape();
- final int touchPos = (int) (isLandscape ? event.getX() : event.getY());
+ final boolean isLeftRightSplit = mSplitLayout.isLeftRightSplit();
+ final int touchPos = (int) (isLeftRightSplit ? event.getX() : event.getY());
switch (action) {
case MotionEvent.ACTION_DOWN:
mVelocityTracker = VelocityTracker.obtain();
@@ -328,7 +362,7 @@
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1000 /* units */);
- final float velocity = isLandscape
+ final float velocity = isLeftRightSplit
? mVelocityTracker.getXVelocity()
: mVelocityTracker.getYVelocity();
final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
@@ -410,6 +444,11 @@
.start();
}
+ @Override
+ protected void onDraw(@NonNull Canvas canvas) {
+ canvas.drawRect(mBackgroundRect, mPaint);
+ }
+
@VisibleForTesting
void releaseHovering() {
mHandle.setHovering(false, true);
@@ -446,10 +485,6 @@
mHandle.setVisibility(!mInteractive && hideHandle ? View.INVISIBLE : View.VISIBLE);
}
- private boolean isLandscape() {
- return getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE;
- }
-
private class DoubleTapListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index 63cdb4f..b699533 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -79,7 +79,7 @@
* divide position changes.
*/
public final class SplitLayout implements DisplayInsetsController.OnInsetsChangedListener {
-
+ private static final String TAG = "SplitLayout";
public static final int PARALLAX_NONE = 0;
public static final int PARALLAX_DISMISSING = 1;
public static final int PARALLAX_ALIGN_CENTER = 2;
@@ -121,12 +121,15 @@
private int mDividerPosition;
private boolean mInitialized = false;
private boolean mFreezeDividerWindow = false;
+ private boolean mIsLargeScreen = false;
private int mOrientation;
private int mRotation;
private int mDensity;
private int mUiMode;
private final boolean mDimNonImeSide;
+ private final boolean mAllowLeftRightSplitInPortrait;
+ private boolean mIsLeftRightSplit;
private ValueAnimator mDividerFlingAnimator;
public SplitLayout(String windowName, Context context, Configuration configuration,
@@ -138,6 +141,7 @@
mOrientation = configuration.orientation;
mRotation = configuration.windowConfiguration.getRotation();
mDensity = configuration.densityDpi;
+ mIsLargeScreen = configuration.smallestScreenWidthDp >= 600;
mSplitLayoutHandler = splitLayoutHandler;
mDisplayController = displayController;
mDisplayImeController = displayImeController;
@@ -147,14 +151,17 @@
mImePositionProcessor = new ImePositionProcessor(mContext.getDisplayId());
mSurfaceEffectPolicy = new ResizingEffectPolicy(parallaxType);
+ final Resources res = mContext.getResources();
+ mDimNonImeSide = res.getBoolean(R.bool.config_dimNonImeAttachedSide);
+ mAllowLeftRightSplitInPortrait = SplitScreenUtils.allowLeftRightSplitInPortrait(res);
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ configuration);
+
updateDividerConfig(mContext);
mRootBounds.set(configuration.windowConfiguration.getBounds());
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
resetDividerPosition();
-
- mDimNonImeSide = mContext.getResources().getBoolean(R.bool.config_dimNonImeAttachedSide);
-
updateInvisibleRect();
}
@@ -284,17 +291,17 @@
* Returns the divider position as a fraction from 0 to 1.
*/
public float getDividerPositionAsFraction() {
- return Math.min(1f, Math.max(0f, isLandscape()
+ return Math.min(1f, Math.max(0f, mIsLeftRightSplit
? (float) ((mBounds1.right + mBounds2.left) / 2f) / mBounds2.right
: (float) ((mBounds1.bottom + mBounds2.top) / 2f) / mBounds2.bottom));
}
private void updateInvisibleRect() {
mInvisibleBounds.set(mRootBounds.left, mRootBounds.top,
- isLandscape() ? mRootBounds.right / 2 : mRootBounds.right,
- isLandscape() ? mRootBounds.bottom : mRootBounds.bottom / 2);
- mInvisibleBounds.offset(isLandscape() ? mRootBounds.right : 0,
- isLandscape() ? 0 : mRootBounds.bottom);
+ mIsLeftRightSplit ? mRootBounds.right / 2 : mRootBounds.right,
+ mIsLeftRightSplit ? mRootBounds.bottom : mRootBounds.bottom / 2);
+ mInvisibleBounds.offset(mIsLeftRightSplit ? mRootBounds.right : 0,
+ mIsLeftRightSplit ? 0 : mRootBounds.bottom);
}
/** Applies new configuration, returns {@code false} if there's no effect to the layout. */
@@ -309,6 +316,7 @@
final int orientation = configuration.orientation;
final int density = configuration.densityDpi;
final int uiMode = configuration.uiMode;
+ final boolean wasLeftRightSplit = mIsLeftRightSplit;
if (mOrientation == orientation
&& mRotation == rotation
@@ -326,9 +334,12 @@
mRotation = rotation;
mDensity = density;
mUiMode = uiMode;
+ mIsLargeScreen = configuration.smallestScreenWidthDp >= 600;
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ configuration);
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
updateDividerConfig(mContext);
- initDividerPosition(mTempRect);
+ initDividerPosition(mTempRect, wasLeftRightSplit);
updateInvisibleRect();
return true;
@@ -347,18 +358,27 @@
}
// We only need new bounds here, other configuration should be update later.
+ final boolean wasLeftRightSplit = SplitScreenUtils.isLeftRightSplit(
+ mAllowLeftRightSplitInPortrait, mIsLargeScreen,
+ mRootBounds.width() >= mRootBounds.height());
mTempRect.set(mRootBounds);
mRootBounds.set(tmpRect);
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ mIsLargeScreen, mRootBounds.width() >= mRootBounds.height());
mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds);
- initDividerPosition(mTempRect);
+ initDividerPosition(mTempRect, wasLeftRightSplit);
}
- private void initDividerPosition(Rect oldBounds) {
+ /**
+ * Updates the divider position to the position in the current orientation and bounds using the
+ * snap fraction calculated based on the previous orientation and bounds.
+ */
+ private void initDividerPosition(Rect oldBounds, boolean wasLeftRightSplit) {
final float snapRatio = (float) mDividerPosition
- / (float) (isLandscape(oldBounds) ? oldBounds.width() : oldBounds.height());
+ / (float) (wasLeftRightSplit ? oldBounds.width() : oldBounds.height());
// Estimate position by previous ratio.
final float length =
- (float) (isLandscape() ? mRootBounds.width() : mRootBounds.height());
+ (float) (mIsLeftRightSplit ? mRootBounds.width() : mRootBounds.height());
final int estimatePosition = (int) (length * snapRatio);
// Init divider position by estimated position using current bounds snap algorithm.
mDividerPosition = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(
@@ -376,8 +396,7 @@
dividerBounds.set(mRootBounds);
bounds1.set(mRootBounds);
bounds2.set(mRootBounds);
- final boolean isLandscape = isLandscape(mRootBounds);
- if (isLandscape) {
+ if (mIsLeftRightSplit) {
position += mRootBounds.left;
dividerBounds.left = position - mDividerInsets;
dividerBounds.right = dividerBounds.left + mDividerWindowWidth;
@@ -393,7 +412,7 @@
DockedDividerUtils.sanitizeStackBounds(bounds1, true /** topLeft */);
DockedDividerUtils.sanitizeStackBounds(bounds2, false /** topLeft */);
if (setEffectBounds) {
- mSurfaceEffectPolicy.applyDividerPosition(position, isLandscape);
+ mSurfaceEffectPolicy.applyDividerPosition(position, mIsLeftRightSplit);
}
}
@@ -563,13 +582,12 @@
}
private DividerSnapAlgorithm getSnapAlgorithm(Context context, Rect rootBounds) {
- final boolean isLandscape = isLandscape(rootBounds);
final Rect insets = getDisplayStableInsets(context);
// Make split axis insets value same as the larger one to avoid bounds1 and bounds2
// have difference for avoiding size-compat mode when switching unresizable apps in
// landscape while they are letterboxed.
- if (!isLandscape) {
+ if (!mIsLeftRightSplit) {
final int largerInsets = Math.max(insets.top, insets.bottom);
insets.set(insets.left, largerInsets, insets.right, largerInsets);
}
@@ -579,9 +597,9 @@
rootBounds.width(),
rootBounds.height(),
mDividerSize,
- !isLandscape,
+ !mIsLeftRightSplit,
insets,
- isLandscape ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
+ mIsLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
}
/** Fling divider from current position to end or start position then exit */
@@ -643,13 +661,12 @@
/** Switch both surface position with animation. */
public void splitSwitching(SurfaceControl.Transaction t, SurfaceControl leash1,
SurfaceControl leash2, Consumer<Rect> finishCallback) {
- final boolean isLandscape = isLandscape();
final Rect insets = getDisplayStableInsets(mContext);
- insets.set(isLandscape ? insets.left : 0, isLandscape ? 0 : insets.top,
- isLandscape ? insets.right : 0, isLandscape ? 0 : insets.bottom);
+ insets.set(mIsLeftRightSplit ? insets.left : 0, mIsLeftRightSplit ? 0 : insets.top,
+ mIsLeftRightSplit ? insets.right : 0, mIsLeftRightSplit ? 0 : insets.bottom);
final int dividerPos = mDividerSnapAlgorithm.calculateNonDismissingSnapTarget(
- isLandscape ? mBounds2.width() : mBounds2.height()).position;
+ mIsLeftRightSplit ? mBounds2.width() : mBounds2.height()).position;
final Rect distBounds1 = new Rect();
final Rect distBounds2 = new Rect();
final Rect distDividerBounds = new Rect();
@@ -740,15 +757,12 @@
.toRect();
}
- private static boolean isLandscape(Rect bounds) {
- return bounds.width() > bounds.height();
- }
-
/**
- * Return if this layout is landscape.
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
*/
- public boolean isLandscape() {
- return isLandscape(mRootBounds);
+ public boolean isLeftRightSplit() {
+ return mIsLeftRightSplit;
}
/** Apply recorded surface layout to the {@link SurfaceControl.Transaction}. */
@@ -850,9 +864,13 @@
/** Dumps the current split bounds recorded in this layout. */
public void dump(@NonNull PrintWriter pw, String prefix) {
- pw.println(prefix + "bounds1=" + mBounds1.toShortString());
- pw.println(prefix + "dividerBounds=" + mDividerBounds.toShortString());
- pw.println(prefix + "bounds2=" + mBounds2.toShortString());
+ final String innerPrefix = prefix + "\t";
+ pw.println(prefix + TAG + ":");
+ pw.println(innerPrefix + "mAllowLeftRightSplitInPortrait=" + mAllowLeftRightSplitInPortrait);
+ pw.println(innerPrefix + "mIsLeftRightSplit=" + mIsLeftRightSplit);
+ pw.println(innerPrefix + "bounds1=" + mBounds1.toShortString());
+ pw.println(innerPrefix + "dividerBounds=" + mDividerBounds.toShortString());
+ pw.println(innerPrefix + "bounds2=" + mBounds2.toShortString());
}
/** Handles layout change event. */
@@ -937,32 +955,32 @@
* Applies a parallax to the task to hint dismissing progress.
*
* @param position the split position to apply dismissing parallax effect
- * @param isLandscape indicates whether it's splitting horizontally or vertically
+ * @param isLeftRightSplit indicates whether it's splitting horizontally or vertically
*/
- void applyDividerPosition(int position, boolean isLandscape) {
+ void applyDividerPosition(int position, boolean isLeftRightSplit) {
mDismissingSide = DOCKED_INVALID;
mParallaxOffset.set(0, 0);
mDismissingDimValue = 0;
int totalDismissingDistance = 0;
if (position < mDividerSnapAlgorithm.getFirstSplitTarget().position) {
- mDismissingSide = isLandscape ? DOCKED_LEFT : DOCKED_TOP;
+ mDismissingSide = isLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP;
totalDismissingDistance = mDividerSnapAlgorithm.getDismissStartTarget().position
- mDividerSnapAlgorithm.getFirstSplitTarget().position;
} else if (position > mDividerSnapAlgorithm.getLastSplitTarget().position) {
- mDismissingSide = isLandscape ? DOCKED_RIGHT : DOCKED_BOTTOM;
+ mDismissingSide = isLeftRightSplit ? DOCKED_RIGHT : DOCKED_BOTTOM;
totalDismissingDistance = mDividerSnapAlgorithm.getLastSplitTarget().position
- mDividerSnapAlgorithm.getDismissEndTarget().position;
}
- final boolean topLeftShrink = isLandscape
+ final boolean topLeftShrink = isLeftRightSplit
? position < mWinBounds1.right : position < mWinBounds1.bottom;
if (topLeftShrink) {
- mShrinkSide = isLandscape ? DOCKED_LEFT : DOCKED_TOP;
+ mShrinkSide = isLeftRightSplit ? DOCKED_LEFT : DOCKED_TOP;
mContentBounds.set(mWinBounds1);
mSurfaceBounds.set(mBounds1);
} else {
- mShrinkSide = isLandscape ? DOCKED_RIGHT : DOCKED_BOTTOM;
+ mShrinkSide = isLeftRightSplit ? DOCKED_RIGHT : DOCKED_BOTTOM;
mContentBounds.set(mWinBounds2);
mSurfaceBounds.set(mBounds2);
}
@@ -973,7 +991,7 @@
mDismissingDimValue = DIM_INTERPOLATOR.getInterpolation(fraction);
if (mParallaxType == PARALLAX_DISMISSING) {
fraction = calculateParallaxDismissingFraction(fraction, mDismissingSide);
- if (isLandscape) {
+ if (isLeftRightSplit) {
mParallaxOffset.x = (int) (fraction * totalDismissingDistance);
} else {
mParallaxOffset.y = (int) (fraction * totalDismissingDistance);
@@ -982,7 +1000,7 @@
}
if (mParallaxType == PARALLAX_ALIGN_CENTER) {
- if (isLandscape) {
+ if (isLeftRightSplit) {
mParallaxOffset.x =
(mSurfaceBounds.width() - mContentBounds.width()) / 2;
} else {
@@ -1129,7 +1147,7 @@
// Calculate target bounds offset for IME
mLastYOffset = mYOffsetForIme;
final boolean needOffset = imeTargetPosition == SPLIT_POSITION_BOTTOM_OR_RIGHT
- && !isFloating && !isLandscape(mRootBounds) && mImeShown;
+ && !isFloating && !mIsLeftRightSplit && mImeShown;
mTargetYOffset = needOffset ? getTargetYOffset() : 0;
if (mTargetYOffset != mLastYOffset) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
index d7ea1c0..0693543 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java
@@ -16,6 +16,8 @@
package com.android.wm.shell.common.split;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
+
import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES;
import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
@@ -25,9 +27,14 @@
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.PendingIntent;
+import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Rect;
import com.android.internal.util.ArrayUtils;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
/** Helper utility class for split screen components to use. */
@@ -94,4 +101,38 @@
public static String splitFailureMessage(String caller, String reason) {
return "(" + caller + ") Splitscreen aborted: " + reason;
}
+
+ /**
+ * Returns whether left/right split is allowed in portrait.
+ */
+ public static boolean allowLeftRightSplitInPortrait(Resources res) {
+ return Flags.enableLeftRightSplitInPortrait() && res.getBoolean(
+ com.android.internal.R.bool.config_leftRightSplitInPortrait);
+ }
+
+ /**
+ * Returns whether left/right split is supported in the given configuration.
+ */
+ public static boolean isLeftRightSplit(boolean allowLeftRightSplitInPortrait,
+ Configuration config) {
+ // Compare the max bounds sizes as on near-square devices, the insets may result in a
+ // configuration in the other orientation
+ final boolean isLargeScreen = config.smallestScreenWidthDp >= 600;
+ final Rect maxBounds = config.windowConfiguration.getMaxBounds();
+ final boolean isLandscape = maxBounds.width() >= maxBounds.height();
+ return isLeftRightSplit(allowLeftRightSplitInPortrait, isLargeScreen, isLandscape);
+ }
+
+ /**
+ * Returns whether left/right split is supported in the given configuration state. This method
+ * is useful for cases where we need to calculate this given last saved state.
+ */
+ public static boolean isLeftRightSplit(boolean allowLeftRightSplitInPortrait,
+ boolean isLargeScreen, boolean isLandscape) {
+ if (allowLeftRightSplitInPortrait && isLargeScreen) {
+ return !isLandscape;
+ } else {
+ return isLandscape;
+ }
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
index b158f88..3c6bc17 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java
@@ -324,13 +324,16 @@
@WMSingleton
@Provides
- static SystemPerformanceHinter provideSystemPerformanceHinter(Context context,
+ static Optional<SystemPerformanceHinter> provideSystemPerformanceHinter(Context context,
ShellInit shellInit,
ShellCommandHandler shellCommandHandler,
RootTaskDisplayAreaOrganizer rootTdaOrganizer) {
+ if (!com.android.window.flags.Flags.explicitRefreshRateHints()) {
+ return Optional.empty();
+ }
final PerfHintController perfHintController =
new PerfHintController(context, shellInit, shellCommandHandler, rootTdaOrganizer);
- return perfHintController.getHinter();
+ return Optional.of(perfHintController.getHinter());
}
//
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
index 0bf8ec3..fdfb6f3 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
@@ -94,6 +94,7 @@
private ShellExecutor mMainExecutor;
private ArrayList<DragAndDropListener> mListeners = new ArrayList<>();
+ // Map of displayId -> per-display info
private final SparseArray<PerDisplay> mDisplayDropTargets = new SparseArray<>();
/**
@@ -362,7 +363,7 @@
*/
private boolean isReadyToHandleDrag() {
for (int i = 0; i < mDisplayDropTargets.size(); i++) {
- if (mDisplayDropTargets.valueAt(i).mHasDrawn) {
+ if (mDisplayDropTargets.valueAt(i).hasDrawn) {
return true;
}
}
@@ -398,8 +399,13 @@
* Dumps information about this controller.
*/
public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
pw.println(prefix + TAG);
- pw.println(prefix + " listeners=" + mListeners.size());
+ pw.println(innerPrefix + "listeners=" + mListeners.size());
+ pw.println(innerPrefix + "Per display:");
+ for (int i = 0; i < mDisplayDropTargets.size(); i++) {
+ mDisplayDropTargets.valueAt(i).dump(pw, innerPrefix);
+ }
}
/**
@@ -440,7 +446,7 @@
final FrameLayout rootView;
final DragLayout dragLayout;
// Tracks whether the window has fully drawn since it was last made visible
- boolean mHasDrawn;
+ boolean hasDrawn;
boolean isHandlingDrag;
// A count of the number of active drags in progress to ensure that we only hide the window
@@ -464,17 +470,29 @@
rootView.setVisibility(visibility);
if (visibility == View.VISIBLE) {
rootView.requestApplyInsets();
- if (!mHasDrawn && rootView.getViewRootImpl() != null) {
+ if (!hasDrawn && rootView.getViewRootImpl() != null) {
rootView.getViewRootImpl().registerRtFrameCallback(this);
}
} else {
- mHasDrawn = false;
+ hasDrawn = false;
}
}
@Override
public void onFrameDraw(long frame) {
- mHasDrawn = true;
+ hasDrawn = true;
+ }
+
+ /**
+ * Dumps information about this display's shell drop target.
+ */
+ public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
+ pw.println(innerPrefix + "displayId=" + displayId);
+ pw.println(innerPrefix + "hasDrawn=" + hasDrawn);
+ pw.println(innerPrefix + "isHandlingDrag=" + isHandlingDrag);
+ pw.println(innerPrefix + "activeDragCount=" + activeDragCount);
+ dragLayout.dump(pw, innerPrefix);
}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
index e70768b..162ce19 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropPolicy.java
@@ -138,7 +138,7 @@
final Rect displayRegion = new Rect(l, t, l + iw, t + ih);
final Rect fullscreenDrawRegion = new Rect(displayRegion);
final Rect fullscreenHitRegion = new Rect(displayRegion);
- final boolean inLandscape = mSession.displayLayout.isLandscape();
+ final boolean isLeftRightSplit = mSplitScreen != null && mSplitScreen.isLeftRightSplit();
final boolean inSplitScreen = mSplitScreen != null && mSplitScreen.isSplitScreenVisible();
final float dividerWidth = mContext.getResources().getDimensionPixelSize(
R.dimen.split_divider_bar_width);
@@ -155,7 +155,7 @@
topOrLeftBounds.intersect(displayRegion);
bottomOrRightBounds.intersect(displayRegion);
- if (inLandscape) {
+ if (isLeftRightSplit) {
final Rect leftHitRegion = new Rect();
final Rect rightHitRegion = new Rect();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
index 205a455..445ba89 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java
@@ -20,6 +20,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.content.pm.ActivityInfo.CONFIG_ASSETS_PATHS;
import static android.content.pm.ActivityInfo.CONFIG_UI_MODE;
+import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT;
@@ -47,14 +48,18 @@
import android.view.WindowInsets.Type;
import android.widget.LinearLayout;
+import androidx.annotation.NonNull;
+
import com.android.internal.logging.InstanceId;
import com.android.internal.protolog.common.ProtoLog;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.R;
import com.android.wm.shell.animation.Interpolators;
+import com.android.wm.shell.common.split.SplitScreenUtils;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreenController;
+import java.io.PrintWriter;
import java.util.ArrayList;
/**
@@ -74,6 +79,11 @@
private final StatusBarManager mStatusBarManager;
private final Configuration mLastConfiguration = new Configuration();
+ // Whether this device supports left/right split in portrait
+ private final boolean mAllowLeftRightSplitInPortrait;
+ // Whether the device is currently in left/right split mode
+ private boolean mIsLeftRightSplit;
+
private DragAndDropPolicy.Target mCurrentTarget = null;
private DropZoneView mDropZoneView1;
private DropZoneView mDropZoneView2;
@@ -106,17 +116,18 @@
setLayoutDirection(LAYOUT_DIRECTION_LTR);
mDropZoneView1 = new DropZoneView(context);
mDropZoneView2 = new DropZoneView(context);
- addView(mDropZoneView1, new LinearLayout.LayoutParams(MATCH_PARENT,
- MATCH_PARENT));
- addView(mDropZoneView2, new LinearLayout.LayoutParams(MATCH_PARENT,
- MATCH_PARENT));
+ addView(mDropZoneView1, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
+ addView(mDropZoneView2, new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));
((LayoutParams) mDropZoneView1.getLayoutParams()).weight = 1;
((LayoutParams) mDropZoneView2.getLayoutParams()).weight = 1;
- int orientation = getResources().getConfiguration().orientation;
- setOrientation(orientation == Configuration.ORIENTATION_LANDSCAPE
- ? LinearLayout.HORIZONTAL
- : LinearLayout.VERTICAL);
- updateContainerMargins(getResources().getConfiguration().orientation);
+ // We don't use the configuration orientation here to determine landscape because
+ // near-square devices may report the same orietation with insets taken into account
+ mAllowLeftRightSplitInPortrait = SplitScreenUtils.allowLeftRightSplitInPortrait(
+ context.getResources());
+ mIsLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ getResources().getConfiguration());
+ setOrientation(mIsLeftRightSplit ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
+ updateContainerMargins(mIsLeftRightSplit);
}
@Override
@@ -124,11 +135,12 @@
mInsets = insets.getInsets(Type.tappableElement() | Type.displayCutout());
recomputeDropTargets();
- final int orientation = getResources().getConfiguration().orientation;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ boolean isLeftRightSplit = mSplitScreenController != null
+ && mSplitScreenController.isLeftRightSplit();
+ if (isLeftRightSplit) {
mDropZoneView1.setBottomInset(mInsets.bottom);
mDropZoneView2.setBottomInset(mInsets.bottom);
- } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+ } else {
mDropZoneView1.setBottomInset(0);
mDropZoneView2.setBottomInset(mInsets.bottom);
}
@@ -136,14 +148,12 @@
}
public void onConfigChanged(Configuration newConfig) {
- if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
- && getOrientation() != HORIZONTAL) {
- setOrientation(LinearLayout.HORIZONTAL);
- updateContainerMargins(newConfig.orientation);
- } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT
- && getOrientation() != VERTICAL) {
- setOrientation(LinearLayout.VERTICAL);
- updateContainerMargins(newConfig.orientation);
+ boolean isLeftRightSplit = SplitScreenUtils.isLeftRightSplit(mAllowLeftRightSplitInPortrait,
+ newConfig);
+ if (isLeftRightSplit != mIsLeftRightSplit) {
+ mIsLeftRightSplit = isLeftRightSplit;
+ setOrientation(mIsLeftRightSplit ? LinearLayout.HORIZONTAL : LinearLayout.VERTICAL);
+ updateContainerMargins(mIsLeftRightSplit);
}
final int diff = newConfig.diff(mLastConfiguration);
@@ -162,14 +172,14 @@
mDropZoneView2.setContainerMargin(0, 0, 0, 0);
}
- private void updateContainerMargins(int orientation) {
+ private void updateContainerMargins(boolean isLeftRightSplit) {
final float halfMargin = mDisplayMargin / 2f;
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ if (isLeftRightSplit) {
mDropZoneView1.setContainerMargin(
mDisplayMargin, mDisplayMargin, halfMargin, mDisplayMargin);
mDropZoneView2.setContainerMargin(
halfMargin, mDisplayMargin, mDisplayMargin, mDisplayMargin);
- } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
+ } else {
mDropZoneView1.setContainerMargin(
mDisplayMargin, mDisplayMargin, mDisplayMargin, halfMargin);
mDropZoneView2.setContainerMargin(
@@ -257,23 +267,21 @@
* @param bounds2 bounds to apply to the second dropzone view, null if split in half.
*/
private void updateDropZoneSizes(Rect bounds1, Rect bounds2) {
- final int orientation = getResources().getConfiguration().orientation;
- final boolean isPortrait = orientation == Configuration.ORIENTATION_PORTRAIT;
final int halfDivider = mDividerSize / 2;
final LinearLayout.LayoutParams dropZoneView1 =
(LayoutParams) mDropZoneView1.getLayoutParams();
final LinearLayout.LayoutParams dropZoneView2 =
(LayoutParams) mDropZoneView2.getLayoutParams();
- if (isPortrait) {
- dropZoneView1.width = MATCH_PARENT;
- dropZoneView2.width = MATCH_PARENT;
- dropZoneView1.height = bounds1 != null ? bounds1.height() + halfDivider : MATCH_PARENT;
- dropZoneView2.height = bounds2 != null ? bounds2.height() + halfDivider : MATCH_PARENT;
- } else {
+ if (mIsLeftRightSplit) {
dropZoneView1.width = bounds1 != null ? bounds1.width() + halfDivider : MATCH_PARENT;
dropZoneView2.width = bounds2 != null ? bounds2.width() + halfDivider : MATCH_PARENT;
dropZoneView1.height = MATCH_PARENT;
dropZoneView2.height = MATCH_PARENT;
+ } else {
+ dropZoneView1.width = MATCH_PARENT;
+ dropZoneView2.width = MATCH_PARENT;
+ dropZoneView1.height = bounds1 != null ? bounds1.height() + halfDivider : MATCH_PARENT;
+ dropZoneView2.height = bounds2 != null ? bounds2.height() + halfDivider : MATCH_PARENT;
}
dropZoneView1.weight = bounds1 != null ? 0 : 1;
dropZoneView2.weight = bounds2 != null ? 0 : 1;
@@ -371,7 +379,7 @@
// Reset the state if we previously force-ignore the bottom margin
mDropZoneView1.setForceIgnoreBottomMargin(false);
mDropZoneView2.setForceIgnoreBottomMargin(false);
- updateContainerMargins(getResources().getConfiguration().orientation);
+ updateContainerMargins(mIsLeftRightSplit);
mCurrentTarget = null;
}
@@ -481,4 +489,19 @@
final int taskBgColor = taskInfo.taskDescription.getBackgroundColor();
return Color.valueOf(taskBgColor == -1 ? Color.WHITE : taskBgColor).toArgb();
}
+
+ /**
+ * Dumps information about this drag layout.
+ */
+ public void dump(@NonNull PrintWriter pw, String prefix) {
+ final String innerPrefix = prefix + " ";
+ pw.println(prefix + "DragLayout:");
+ pw.println(innerPrefix + "mIsLeftRightSplitInPortrait=" + mAllowLeftRightSplitInPortrait);
+ pw.println(innerPrefix + "mIsLeftRightSplit=" + mIsLeftRightSplit);
+ pw.println(innerPrefix + "mDisplayMargin=" + mDisplayMargin);
+ pw.println(innerPrefix + "mDividerSize=" + mDividerSize);
+ pw.println(innerPrefix + "mIsShowing=" + mIsShowing);
+ pw.println(innerPrefix + "mHasDropped=" + mHasDropped);
+ pw.println(innerPrefix + "mCurrentTarget=" + mCurrentTarget);
+ }
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
index 478b6a9..353d702 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragSession.java
@@ -18,31 +18,17 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
-import static android.content.ClipDescription.EXTRA_PENDING_INTENT;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT;
-import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK;
-import static android.content.Intent.EXTRA_USER;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
-import android.app.PendingIntent;
import android.app.WindowConfiguration;
import android.content.ClipData;
-import android.content.ClipDescription;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.net.Uri;
-import android.os.UserHandle;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
import com.android.wm.shell.common.DisplayLayout;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
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 b4067d0..c1164fc 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
@@ -123,7 +123,7 @@
private static final int EXTRA_CONTENT_OVERLAY_FADE_OUT_DELAY_MS =
SystemProperties.getInt(
- "persist.wm.debug.extra_content_overlay_fade_out_delay_ms", 0);
+ "persist.wm.debug.extra_content_overlay_fade_out_delay_ms", 400);
private final Context mContext;
private final SyncTransactionQueue mSyncTransactionQueue;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
index 63afd3e..79c2076 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentsTransitionHandler.java
@@ -590,7 +590,7 @@
cancel("transit_sleep");
return;
}
- if (mKeyguardLocked) {
+ if (mKeyguardLocked || (info.getFlags() & TRANSIT_FLAG_KEYGUARD_LOCKED) != 0) {
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
"[%d] RecentsController.merge: keyguard is locked", mInstanceId);
// We will not accept new changes if we are swiping over the keyguard.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
index 664d4491..37b24e5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java
@@ -366,6 +366,14 @@
return mStageCoordinator.getStageOfTask(taskId);
}
+ /**
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
+ */
+ public boolean isLeftRightSplit() {
+ return mStageCoordinator.isLeftRightSplit();
+ }
+
/** Check split is foreground and task is under split or not by taskId. */
public boolean isTaskInSplitScreenForeground(int taskId) {
return isTaskInSplitScreen(taskId) && isSplitScreenVisible();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
index 7a4834c..be685b5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java
@@ -1301,7 +1301,7 @@
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Switch split position: %s", reason);
mLogger.logSwap(getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
void setSideStagePosition(@SplitPosition int sideStagePosition,
@@ -1659,7 +1659,7 @@
mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(),
getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
}
@@ -1749,10 +1749,10 @@
}
if (stage == STAGE_TYPE_MAIN) {
mLogger.logMainStageAppChange(getMainStagePosition(), mMainStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
} else {
mLogger.logSideStageAppChange(getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
if (present) {
updateRecentTasksSplitPair();
@@ -2113,7 +2113,7 @@
mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(),
getMainStagePosition(), mMainStage.getTopChildTaskUid(),
getSideStagePosition(), mSideStage.getTopChildTaskUid(),
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
}
}
@@ -2205,8 +2205,12 @@
mLogger.logResize(mSplitLayout.getDividerPositionAsFraction());
}
- private boolean isLandscape() {
- return mSplitLayout.isLandscape();
+ /**
+ * @return {@code true} if we should create a left-right split, {@code false} if we should
+ * create a top-bottom split.
+ */
+ boolean isLeftRightSplit() {
+ return mSplitLayout != null && mSplitLayout.isLeftRightSplit();
}
/**
@@ -3177,6 +3181,7 @@
pw.println(innerPrefix + "mDividerVisible=" + mDividerVisible);
pw.println(innerPrefix + "isSplitActive=" + isSplitActive());
pw.println(innerPrefix + "isSplitVisible=" + isSplitScreenVisible());
+ pw.println(innerPrefix + "isLeftRightSplit=" + mSplitLayout.isLeftRightSplit());
pw.println(innerPrefix + "MainStage");
pw.println(childPrefix + "stagePosition=" + splitPositionToString(getMainStagePosition()));
pw.println(childPrefix + "isActive=" + mMainStage.isActive());
@@ -3188,10 +3193,7 @@
mSideStage.dump(pw, childPrefix);
pw.println(innerPrefix + "SideStageListener");
mSideStageListener.dump(pw, childPrefix);
- if (mMainStage.isActive()) {
- pw.println(innerPrefix + "SplitLayout");
- mSplitLayout.dump(pw, childPrefix);
- }
+ mSplitLayout.dump(pw, childPrefix);
if (!mPausingTasks.isEmpty()) {
pw.println(childPrefix + "mPausingTasks=" + mPausingTasks);
}
@@ -3243,7 +3245,7 @@
mLogger.logExit(exitReason,
SPLIT_POSITION_UNDEFINED, 0 /* mainStageUid */,
SPLIT_POSITION_UNDEFINED, 0 /* sideStageUid */,
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
/**
@@ -3256,7 +3258,7 @@
toMainStage ? mMainStage.getTopChildTaskUid() : 0 /* mainStageUid */,
!toMainStage ? getSideStagePosition() : SPLIT_POSITION_UNDEFINED,
!toMainStage ? mSideStage.getTopChildTaskUid() : 0 /* sideStageUid */,
- mSplitLayout.isLandscape());
+ mSplitLayout.isLeftRightSplit());
}
class StageListenerImpl implements StageTaskListener.StageListenerCallbacks {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
index bf11c8b..3a1ea0e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java
@@ -87,7 +87,7 @@
mDisplayController.getDisplayLayout(mWindowDecoration.mDisplay.getDisplayId())
.getStableBounds(mStableBounds);
}
- return mRepositionTaskBounds;
+ return new Rect(mRepositionTaskBounds);
}
@Override
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
index 79fec09..4b55a0c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java
@@ -107,7 +107,7 @@
mDisplayController.getDisplayLayout(mDesktopWindowDecoration.mDisplay.getDisplayId())
.getStableBounds(mStableBounds);
}
- return mRepositionTaskBounds;
+ return new Rect(mRepositionTaskBounds);
}
@Override
diff --git a/libs/WindowManager/Shell/tests/flicker/Android.bp b/libs/WindowManager/Shell/tests/flicker/Android.bp
index 366f7b1..4abaf5b 100644
--- a/libs/WindowManager/Shell/tests/flicker/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/Android.bp
@@ -52,7 +52,7 @@
}
java_defaults {
- name: "WMShellFlickerTestsDefaultWithoutTemplate",
+ name: "WMShellFlickerTestsDefault",
platform_apis: true,
certificate: "platform",
optimize: {
@@ -75,16 +75,9 @@
],
data: [
":FlickerTestApp",
- "trace_config/*",
],
}
-java_defaults {
- name: "WMShellFlickerTestsDefault",
- defaults: ["WMShellFlickerTestsDefaultWithoutTemplate"],
- test_config_template: "AndroidTestTemplate.xml",
-}
-
java_library {
name: "WMShellFlickerTestsBase",
defaults: ["WMShellFlickerTestsDefault"],
diff --git a/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml b/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml
deleted file mode 100644
index b00d88e..0000000
--- a/libs/WindowManager/Shell/tests/flicker/AndroidTestTemplate.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?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.
- -->
-<configuration description="Runs WindowManager Shell Flicker Tests {MODULE}">
- <option name="test-tag" value="FlickerTests"/>
- <!-- Needed for storing the perfetto trace files in the sdcard/test_results-->
- <option name="isolated-storage" value="false"/>
-
- <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
- <!-- keeps the screen on during tests -->
- <option name="screen-always-on" value="on"/>
- <!-- prevents the phone from restarting -->
- <option name="force-skip-system-props" value="true"/>
- <!-- set WM tracing verbose level to all -->
- <option name="run-command" value="cmd window tracing level all"/>
- <!-- set WM tracing to frame (avoid incomplete states) -->
- <option name="run-command" value="cmd window tracing frame"/>
- <!-- disable betterbug as it's log collection dialogues cause flakes in e2e tests -->
- <option name="run-command" value="pm disable com.google.android.internal.betterbug"/>
- <!-- ensure lock screen mode is swipe -->
- <option name="run-command" value="locksettings set-disabled false"/>
- <!-- restart launcher to activate TAPL -->
- <option name="run-command"
- value="setprop ro.test_harness 1 ; am force-stop com.google.android.apps.nexuslauncher"/>
- <!-- Increase trace size: 20mb for WM and 80mb for SF -->
- <option name="run-command" value="cmd window tracing size 20480"/>
- <option name="run-command" value="su root service call SurfaceFlinger 1029 i32 81920"/>
- <!-- b/307664397 - Ensure camera has the correct permissions and doesn't show a dialog -->
- <option name="run-command"
- value="pm grant com.google.android.GoogleCamera android.permission.ACCESS_FINE_LOCATION"/>
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="test-user-token" value="%TEST_USER%"/>
- <option name="run-command" value="rm -rf /data/user/%TEST_USER%/files/*"/>
- <option name="run-command" value="settings put secure show_ime_with_hard_keyboard 1"/>
- <option name="run-command" value="settings put system show_touches 1"/>
- <option name="run-command" value="settings put system pointer_location 1"/>
- <option name="teardown-command"
- value="settings delete secure show_ime_with_hard_keyboard"/>
- <option name="teardown-command" value="settings delete system show_touches"/>
- <option name="teardown-command" value="settings delete system pointer_location"/>
- <option name="teardown-command"
- value="cmd overlay enable com.android.internal.systemui.navbar.gestural"/>
- </target_preparer>
- <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
- <option name="cleanup-apks" value="true"/>
- <option name="test-file-name" value="{MODULE}.apk"/>
- <option name="test-file-name" value="FlickerTestApp.apk"/>
- </target_preparer>
- <!-- Enable mocking GPS location by the test app -->
- <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
- <option name="run-command"
- value="appops set com.android.wm.shell.flicker.pip.apps android:mock_location allow"/>
- <option name="teardown-command"
- value="appops set com.android.wm.shell.flicker.pip.apps android:mock_location deny"/>
- </target_preparer>
-
- <!-- Needed for pushing the trace config file -->
- <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
- <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
- <option name="push-file"
- key="trace_config.textproto"
- value="/data/misc/perfetto-traces/trace_config.textproto"
- />
- <!--Install the content provider automatically when we push some file in sdcard folder.-->
- <!--Needed to avoid the installation during the test suite.-->
- <option name="push-file" key="trace_config.textproto" value="/sdcard/sample.textproto"/>
- </target_preparer>
- <test class="com.android.tradefed.testtype.AndroidJUnitTest">
- <option name="package" value="{PACKAGE}"/>
- <option name="shell-timeout" value="6600s"/>
- <option name="test-timeout" value="6000s"/>
- <option name="hidden-api-checks" value="false"/>
- <option name="device-listeners" value="android.device.collectors.PerfettoListener"/>
- <!-- PerfettoListener related arguments -->
- <option name="instrumentation-arg" key="perfetto_config_text_proto" value="true"/>
- <option name="instrumentation-arg"
- key="perfetto_config_file"
- value="trace_config.textproto"
- />
- <option name="instrumentation-arg" key="per_run" value="true"/>
- </test>
- <!-- Needed for pulling the collected trace config on to the host -->
- <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
- <option name="pull-pattern-keys" value="perfetto_file_path"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.bubbles/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.pip/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.splitscreen/files"/>
- <option name="directory-keys"
- value="/data/user/0/com.android.wm.shell.flicker.service/files"/>
- <option name="collect-on-run-ended-only" value="true"/>
- <option name="clean-up" value="true"/>
- </metrics_collector>
-</configuration>
diff --git a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
index bae701f..e151ab2 100644
--- a/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/appcompat/Android.bp
@@ -36,6 +36,8 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker",
instrumentation_target_package: "com.android.wm.shell.flicker",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [":WMShellFlickerTestsAppCompat-src"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp b/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
index c4e9a84..f0b4f1f 100644
--- a/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/bubble/Android.bp
@@ -29,6 +29,8 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.bubbles",
instrumentation_target_package: "com.android.wm.shell.flicker.bubbles",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: ["src/**/*.kt"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
index b9b56c2..e61f762 100644
--- a/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/pip/Android.bp
@@ -62,11 +62,13 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip1-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -75,11 +77,13 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip2-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -88,6 +92,7 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip",
instrumentation_target_package: "com.android.wm.shell.flicker.pip",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPip3-src",
":WMShellFlickerTestsPipCommon-src",
@@ -98,6 +103,7 @@
":WMShellFlickerTestsPipApps-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -106,19 +112,22 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.pip.apps",
instrumentation_target_package: "com.android.wm.shell.flicker.pip.apps",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPipApps-src",
":WMShellFlickerTestsPipCommon-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
name: "WMShellFlickerTestsPipAppsCSuite",
- defaults: ["WMShellFlickerTestsDefaultWithoutTemplate"],
+ defaults: ["WMShellFlickerTestsDefault"],
additional_manifests: ["AndroidManifest.xml"],
package_name: "com.android.wm.shell.flicker.pip.apps",
instrumentation_target_package: "com.android.wm.shell.flicker.pip.apps",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsPipApps-src",
":WMShellFlickerTestsPipCommon-src",
@@ -128,6 +137,7 @@
"device-tests",
"csuite",
],
+ data: ["trace_config/*"],
}
csuite_test {
diff --git a/libs/WindowManager/Shell/tests/flicker/service/Android.bp b/libs/WindowManager/Shell/tests/flicker/service/Android.bp
index 9b8cd94..4f1a68a 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/service/Android.bp
@@ -52,8 +52,10 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.service",
instrumentation_target_package: "com.android.wm.shell.flicker.service",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: ["src/**/*.kt"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -62,6 +64,8 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.service",
instrumentation_target_package: "com.android.wm.shell.flicker.service",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [":WMShellFlickerServicePlatinumTests-src"],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
index 80ab24d..824e454 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/CopyContentInSplit.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -64,4 +66,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
index cc982d1..c52ada3b 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromNotification.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.flicker.rules.ChangeDisplayOrientationRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -75,4 +77,8 @@
secondaryApp.exit(wmHelper)
sendNotificationApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
index fa12bb8..8134fdd 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromShortcut.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.flicker.rules.ChangeDisplayOrientationRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -82,4 +84,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
index 2592fd4..3417744 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenByDragFromTaskbar.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -28,6 +29,7 @@
import org.junit.After
import org.junit.Assume
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -70,4 +72,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
index 983653b..f1a011c 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/EnterSplitScreenFromOverview.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -70,4 +72,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
index 068171d..c9b1c91 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchAppByDoubleTapDivider.kt
@@ -20,6 +20,7 @@
import android.graphics.Point
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.helpers.WindowUtils
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
@@ -29,6 +30,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -149,4 +151,8 @@
val LARGE_SCREEN_DP_THRESHOLD = 600
return sizeDp.x >= LARGE_SCREEN_DP_THRESHOLD && sizeDp.y >= LARGE_SCREEN_DP_THRESHOLD
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
index 64b75c5..72f2db3 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromAnotherApp.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -67,4 +69,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
index 1795010..511de4f 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromHome.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -66,4 +68,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
index 7065846..558d2bf 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBackToSplitFromRecent.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -68,4 +70,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
index 251cb50..ecd68295 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/SwitchBetweenSplitPairs.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -69,4 +71,8 @@
thirdApp.exit(wmHelper)
fourthApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
index a9933bbe..f50d5c7 100644
--- a/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
+++ b/libs/WindowManager/Shell/tests/flicker/service/src/com/android/wm/shell/flicker/service/splitscreen/scenarios/UnlockKeyguardToSplitScreen.kt
@@ -19,6 +19,7 @@
import android.app.Instrumentation
import android.tools.common.NavBar
import android.tools.common.Rotation
+import android.tools.device.AndroidLoggerSetupRule
import android.tools.device.traces.parsers.WindowManagerStateHelper
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
@@ -27,6 +28,7 @@
import com.android.wm.shell.flicker.utils.SplitScreenUtils
import org.junit.After
import org.junit.Before
+import org.junit.ClassRule
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -66,4 +68,8 @@
primaryApp.exit(wmHelper)
secondaryApp.exit(wmHelper)
}
+
+ companion object {
+ @ClassRule @JvmField val setupLoggerRule = AndroidLoggerSetupRule()
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp b/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
index 4629c53..f813b0d 100644
--- a/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
+++ b/libs/WindowManager/Shell/tests/flicker/splitscreen/Android.bp
@@ -54,11 +54,13 @@
manifest: "AndroidManifest.xml",
package_name: "com.android.wm.shell.flicker.splitscreen",
instrumentation_target_package: "com.android.wm.shell.flicker.splitscreen",
+ test_config_template: "AndroidTestTemplate.xml",
srcs: [
":WMShellFlickerTestsSplitScreenBase-src",
":WMShellFlickerTestsSplitScreenGroup1-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
android_test {
@@ -74,4 +76,5 @@
":WMShellFlickerTestsSplitScreenGroup1-src",
],
static_libs: ["WMShellFlickerTestsBase"],
+ data: ["trace_config/*"],
}
diff --git a/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto b/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto
deleted file mode 100644
index 406ada9..0000000
--- a/libs/WindowManager/Shell/tests/flicker/trace_config/trace_config.textproto
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright (C) 2023 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# proto-message: TraceConfig
-
-# Enable periodic flushing of the trace buffer into the output file.
-write_into_file: true
-
-# Writes the userspace buffer into the file every 1s.
-file_write_period_ms: 2500
-
-# See b/126487238 - we need to guarantee ordering of events.
-flush_period_ms: 30000
-
-# The trace buffers needs to be big enough to hold |file_write_period_ms| of
-# trace data. The trace buffer sizing depends on the number of trace categories
-# enabled and the device activity.
-
-# RSS events
-buffers: {
- size_kb: 63488
- fill_policy: RING_BUFFER
-}
-
-data_sources {
- config {
- name: "linux.process_stats"
- target_buffer: 0
- # polled per-process memory counters and process/thread names.
- # If you don't want the polled counters, remove the "process_stats_config"
- # section, but keep the data source itself as it still provides on-demand
- # thread/process naming for ftrace data below.
- process_stats_config {
- scan_all_processes_on_start: true
- }
- }
-}
-
-data_sources: {
- config {
- name: "linux.ftrace"
- ftrace_config {
- ftrace_events: "ftrace/print"
- ftrace_events: "task/task_newtask"
- ftrace_events: "task/task_rename"
- atrace_categories: "ss"
- atrace_categories: "wm"
- atrace_categories: "am"
- atrace_categories: "aidl"
- atrace_categories: "input"
- atrace_categories: "binder_driver"
- atrace_categories: "sched_process_exit"
- atrace_apps: "com.android.server.wm.flicker.testapp"
- atrace_apps: "com.android.systemui"
- atrace_apps: "com.android.wm.shell.flicker"
- atrace_apps: "com.android.wm.shell.flicker.other"
- atrace_apps: "com.android.wm.shell.flicker.bubbles"
- atrace_apps: "com.android.wm.shell.flicker.pip"
- atrace_apps: "com.android.wm.shell.flicker.splitscreen"
- atrace_apps: "com.google.android.apps.nexuslauncher"
- }
- }
-}
-
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
index 835ebe2..e5ae6e5 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubblePositionerTest.java
@@ -16,10 +16,15 @@
package com.android.wm.shell.bubbles;
+import static com.android.wm.shell.bubbles.BubblePositioner.MAX_HEIGHT;
+
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
+import static org.mockito.Mockito.mock;
+
import android.content.Intent;
+import android.content.pm.ShortcutInfo;
import android.graphics.Insets;
import android.graphics.PointF;
import android.graphics.Rect;
@@ -226,7 +231,7 @@
}
@Test
- public void testExpandedViewHeight_onLargeTablet() {
+ public void testGetExpandedViewHeight_max() {
Insets insets = Insets.of(10, 20, 5, 15);
Rect screenBounds = new Rect(0, 0, 1800, 2600);
@@ -240,10 +245,91 @@
Intent intent = new Intent(Intent.ACTION_VIEW).setPackage(mContext.getPackageName());
Bubble bubble = Bubble.createAppBubble(intent, new UserHandle(1), null, directExecutor());
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(MAX_HEIGHT);
+ }
+
+ @Test
+ public void testGetExpandedViewHeight_customHeight_valid() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
+ final int minHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_expanded_default_height);
+ Bubble bubble = new Bubble("key",
+ mock(ShortcutInfo.class),
+ minHeight + 100 /* desiredHeight */,
+ 0 /* desiredHeightResId */,
+ "title",
+ 0 /* taskId */,
+ null /* locus */,
+ true /* isDismissable */,
+ directExecutor(),
+ mock(Bubbles.BubbleMetadataFlagListener.class));
+
+ // Ensure the height is the same as the desired value
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(
+ bubble.getDesiredHeight(mContext));
+ }
+
+
+ @Test
+ public void testGetExpandedViewHeight_customHeight_tooSmall() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
+ Bubble bubble = new Bubble("key",
+ mock(ShortcutInfo.class),
+ 10 /* desiredHeight */,
+ 0 /* desiredHeightResId */,
+ "title",
+ 0 /* taskId */,
+ null /* locus */,
+ true /* isDismissable */,
+ directExecutor(),
+ mock(Bubbles.BubbleMetadataFlagListener.class));
+
+ // Ensure the height is the same as the minimum value
+ final int minHeight = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_expanded_default_height);
+ assertThat(mPositioner.getExpandedViewHeight(bubble)).isEqualTo(minHeight);
+ }
+
+ @Test
+ public void testGetMaxExpandedViewHeight_onLargeTablet() {
+ Insets insets = Insets.of(10, 20, 5, 15);
+ Rect screenBounds = new Rect(0, 0, 1800, 2600);
+
+ DeviceConfig deviceConfig = new ConfigBuilder()
+ .setLargeScreen()
+ .setInsets(insets)
+ .setScreenBounds(screenBounds)
+ .build();
+ mPositioner.update(deviceConfig);
+
int manageButtonHeight =
mContext.getResources().getDimensionPixelSize(R.dimen.bubble_manage_button_height);
- float expectedHeight = 1800 - 2 * 20 - manageButtonHeight;
- assertThat(mPositioner.getExpandedViewHeight(bubble)).isWithin(0.1f).of(expectedHeight);
+ int pointerWidth = mContext.getResources().getDimensionPixelSize(
+ R.dimen.bubble_pointer_width);
+ int expandedViewPadding = mContext.getResources().getDimensionPixelSize(R
+ .dimen.bubble_expanded_view_padding);
+ float expectedHeight = 1800 - 2 * 20 - manageButtonHeight - pointerWidth
+ - expandedViewPadding * 2;
+ assertThat(((float) mPositioner.getMaxExpandedViewHeight(false /* isOverflow */)))
+ .isWithin(0.1f).of(expectedHeight);
}
/**
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
index 527dc01..1b347e0 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropPolicyTest.java
@@ -204,6 +204,7 @@
@Test
public void testDragAppOverFullscreenHome_expectOnlyFullscreenTarget() {
+ doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mHomeTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mLandscapeDisplayLayout, mActivityClipData);
@@ -219,6 +220,7 @@
@Test
public void testDragAppOverFullscreenApp_expectSplitScreenTargets() {
+ doReturn(true).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mLandscapeDisplayLayout, mActivityClipData);
@@ -239,6 +241,7 @@
@Test
public void testDragAppOverFullscreenAppPhone_expectVerticalSplitScreenTargets() {
+ doReturn(false).when(mSplitScreenStarter).isLeftRightSplit();
setRunningTask(mFullscreenAppTask);
DragSession dragSession = new DragSession(mContext, mActivityTaskManager,
mPortraitDisplayLayout, mActivityClipData);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java
new file mode 100644
index 0000000..30847d3
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenUtilsTests.java
@@ -0,0 +1,75 @@
+/*
+ * 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.splitscreen;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.res.Configuration;
+import android.graphics.Rect;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.wm.shell.ShellTestCase;
+import com.android.wm.shell.common.split.SplitScreenUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+/** Tests for {@link com.android.wm.shell.common.split.SplitScreenUtils} */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class SplitScreenUtilsTests extends ShellTestCase {
+
+ @Test
+ public void testIsLeftRightSplit() {
+ Configuration portraitTablet = new Configuration();
+ portraitTablet.smallestScreenWidthDp = 720;
+ portraitTablet.windowConfiguration.setMaxBounds(new Rect(0, 0, 500, 1000));
+ Configuration landscapeTablet = new Configuration();
+ landscapeTablet.smallestScreenWidthDp = 720;
+ landscapeTablet.windowConfiguration.setMaxBounds(new Rect(0, 0, 1000, 500));
+ Configuration portraitPhone = new Configuration();
+ portraitPhone.smallestScreenWidthDp = 420;
+ portraitPhone.windowConfiguration.setMaxBounds(new Rect(0, 0, 500, 1000));
+ Configuration landscapePhone = new Configuration();
+ landscapePhone.smallestScreenWidthDp = 420;
+ landscapePhone.windowConfiguration.setMaxBounds(new Rect(0, 0, 1000, 500));
+
+ // Allow L/R split in portrait = false
+ assertTrue(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ landscapeTablet));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ landscapePhone));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ portraitTablet));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(false /* allowLeftRightSplitInPortrait */,
+ portraitPhone));
+
+ // Allow L/R split in portrait = true, only affects large screens
+ assertFalse(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ landscapeTablet));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ landscapePhone));
+ assertTrue(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ portraitTablet));
+ assertFalse(SplitScreenUtils.isLeftRightSplit(true /* allowLeftRightSplitInPortrait */,
+ portraitPhone));
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
index fff65f3..d819261 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java
@@ -140,7 +140,7 @@
when(mSplitLayout.getBounds1()).thenReturn(mBounds1);
when(mSplitLayout.getBounds2()).thenReturn(mBounds2);
when(mSplitLayout.getRootBounds()).thenReturn(mRootBounds);
- when(mSplitLayout.isLandscape()).thenReturn(false);
+ when(mSplitLayout.isLeftRightSplit()).thenReturn(false);
when(mSplitLayout.applyTaskChanges(any(), any(), any())).thenReturn(true);
when(mSplitLayout.getDividerLeash()).thenReturn(mDividerLeash);
diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp
index 47a7f35..2f28363 100644
--- a/libs/androidfw/Android.bp
+++ b/libs/androidfw/Android.bp
@@ -63,15 +63,21 @@
"AssetsProvider.cpp",
"AttributeResolution.cpp",
"BigBuffer.cpp",
+ "BigBufferStream.cpp",
"ChunkIterator.cpp",
"ConfigDescription.cpp",
+ "FileStream.cpp",
"Idmap.cpp",
"LoadedArsc.cpp",
"Locale.cpp",
"LocaleData.cpp",
"misc.cpp",
+ "NinePatch.cpp",
"ObbFile.cpp",
"PosixUtils.cpp",
+ "Png.cpp",
+ "PngChunkFilter.cpp",
+ "PngCrunch.cpp",
"ResourceTimer.cpp",
"ResourceTypes.cpp",
"ResourceUtils.cpp",
@@ -84,7 +90,10 @@
],
export_include_dirs: ["include"],
export_shared_lib_headers: ["libz"],
- static_libs: ["libincfs-utils"],
+ static_libs: [
+ "libincfs-utils",
+ "libpng",
+ ],
whole_static_libs: [
"libandroidfw_pathutils",
"libincfs-utils",
@@ -198,9 +207,11 @@
"tests/ConfigDescription_test.cpp",
"tests/ConfigLocale_test.cpp",
"tests/DynamicRefTable_test.cpp",
+ "tests/FileStream_test.cpp",
"tests/Idmap_test.cpp",
"tests/LoadedArsc_test.cpp",
"tests/Locale_test.cpp",
+ "tests/NinePatch_test.cpp",
"tests/ResourceTimer_test.cpp",
"tests/ResourceUtils_test.cpp",
"tests/ResTable_test.cpp",
diff --git a/tools/aapt2/io/BigBufferStream.cpp b/libs/androidfw/BigBufferStream.cpp
similarity index 69%
rename from tools/aapt2/io/BigBufferStream.cpp
rename to libs/androidfw/BigBufferStream.cpp
index 9704caa..f18199c 100644
--- a/tools/aapt2/io/BigBufferStream.cpp
+++ b/libs/androidfw/BigBufferStream.cpp
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-#include "io/BigBufferStream.h"
+#include "androidfw/BigBufferStream.h"
-namespace aapt {
-namespace io {
+#include <algorithm>
+
+namespace android {
//
// BigBufferInputStream
@@ -76,6 +77,34 @@
return buffer_->size();
}
+bool BigBufferInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ if (byte_count == 0) {
+ return true;
+ }
+ if (offset < 0) {
+ return false;
+ }
+ if (offset > std::numeric_limits<off64_t>::max() - byte_count) {
+ return false;
+ }
+ if (offset + byte_count > buffer_->size()) {
+ return false;
+ }
+ auto p = reinterpret_cast<uint8_t*>(data);
+ for (auto iter = buffer_->begin(); iter != buffer_->end() && byte_count > 0; ++iter) {
+ if (offset < iter->size) {
+ size_t to_read = std::min(byte_count, (size_t)(iter->size - offset));
+ memcpy(p, iter->buffer.get() + offset, to_read);
+ byte_count -= to_read;
+ p += to_read;
+ offset = 0;
+ } else {
+ offset -= iter->size;
+ }
+ }
+ return byte_count == 0;
+}
+
//
// BigBufferOutputStream
//
@@ -97,5 +126,4 @@
return false;
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/io/FileStream.cpp b/libs/androidfw/FileStream.cpp
similarity index 95%
rename from tools/aapt2/io/FileStream.cpp
rename to libs/androidfw/FileStream.cpp
index 27529bc..b86c9cb 100644
--- a/tools/aapt2/io/FileStream.cpp
+++ b/libs/androidfw/FileStream.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "io/FileStream.h"
+#include "androidfw/FileStream.h"
#include <errno.h> // for errno
#include <fcntl.h> // for O_RDONLY
@@ -34,8 +34,7 @@
using ::android::base::SystemErrorCodeToString;
using ::android::base::unique_fd;
-namespace aapt {
-namespace io {
+namespace android {
FileInputStream::FileInputStream(const std::string& path, size_t buffer_capacity)
: buffer_capacity_(buffer_capacity) {
@@ -108,6 +107,10 @@
return error_;
}
+bool FileInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ return base::ReadFullyAtOffset(fd_, data, byte_count, offset);
+}
+
FileOutputStream::FileOutputStream(const std::string& path, size_t buffer_capacity)
: buffer_capacity_(buffer_capacity) {
int mode = O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC | O_BINARY;
@@ -199,5 +202,4 @@
return error_;
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/NinePatch.cpp b/libs/androidfw/NinePatch.cpp
similarity index 80%
rename from tools/aapt2/compile/NinePatch.cpp
rename to libs/androidfw/NinePatch.cpp
index 4538ecc..1fdbebf 100644
--- a/tools/aapt2/compile/NinePatch.cpp
+++ b/libs/androidfw/NinePatch.cpp
@@ -14,20 +14,17 @@
* limitations under the License.
*/
-#include "compile/Image.h"
-
#include <sstream>
#include <string>
#include <vector>
+#include "androidfw/Image.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/StringPiece.h"
-#include "util/Util.h"
-
using android::StringPiece;
-namespace aapt {
+namespace android {
// Colors in the format 0xAARRGGBB (the way 9-patch expects it).
constexpr static const uint32_t kColorOpaqueWhite = 0xffffffffu;
@@ -90,10 +87,8 @@
// };
//
template <typename ImageLine>
-static bool FillRanges(const ImageLine* image_line,
- const ColorValidator* color_validator,
- std::vector<Range>* primary_ranges,
- std::vector<Range>* secondary_ranges,
+static bool FillRanges(const ImageLine* image_line, const ColorValidator* color_validator,
+ std::vector<Range>* primary_ranges, std::vector<Range>* secondary_ranges,
std::string* out_err) {
const int32_t length = image_line->GetLength();
@@ -133,11 +128,13 @@
*/
class HorizontalImageLine {
public:
- explicit HorizontalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t length)
- : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {}
+ explicit HorizontalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t length)
+ : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
return NinePatch::PackRGBA(rows_[yoffset_] + (idx + xoffset_) * 4);
@@ -156,11 +153,13 @@
*/
class VerticalImageLine {
public:
- explicit VerticalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t length)
- : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {}
+ explicit VerticalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t length)
+ : rows_(rows), xoffset_(xoffset), yoffset_(yoffset), length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
return NinePatch::PackRGBA(rows_[yoffset_ + idx] + (xoffset_ * 4));
@@ -175,20 +174,22 @@
class DiagonalImageLine {
public:
- explicit DiagonalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset,
- int32_t xstep, int32_t ystep, int32_t length)
+ explicit DiagonalImageLine(uint8_t** rows, int32_t xoffset, int32_t yoffset, int32_t xstep,
+ int32_t ystep, int32_t length)
: rows_(rows),
xoffset_(xoffset),
yoffset_(yoffset),
xstep_(xstep),
ystep_(ystep),
- length_(length) {}
+ length_(length) {
+ }
- inline int32_t GetLength() const { return length_; }
+ inline int32_t GetLength() const {
+ return length_;
+ }
inline uint32_t GetColor(int32_t idx) const {
- return NinePatch::PackRGBA(rows_[yoffset_ + (idx * ystep_)] +
- ((idx + xoffset_) * xstep_) * 4);
+ return NinePatch::PackRGBA(rows_[yoffset_ + (idx * ystep_)] + ((idx + xoffset_) * xstep_) * 4);
}
private:
@@ -243,8 +244,7 @@
if (layout_bounds.size() > 2) {
std::stringstream err_stream;
- err_stream << "too many layout bounds sections on " << edge_name
- << " border";
+ err_stream << "too many layout bounds sections on " << edge_name << " border";
*out_err = err_stream.str();
return false;
}
@@ -258,8 +258,7 @@
// end at length.
if (range.start != 0 && range.end != length) {
std::stringstream err_stream;
- err_stream << "layout bounds on " << edge_name
- << " border must start at edge";
+ err_stream << "layout bounds on " << edge_name << " border must start at edge";
*out_err = err_stream.str();
return false;
}
@@ -269,8 +268,7 @@
const Range& range = layout_bounds.back();
if (range.end != length) {
std::stringstream err_stream;
- err_stream << "layout bounds on " << edge_name
- << " border must start at edge";
+ err_stream << "layout bounds on " << edge_name << " border must start at edge";
*out_err = err_stream.str();
return false;
}
@@ -280,8 +278,7 @@
return true;
}
-static int32_t CalculateSegmentCount(const std::vector<Range>& stretch_regions,
- int32_t length) {
+static int32_t CalculateSegmentCount(const std::vector<Range>& stretch_regions, int32_t length) {
if (stretch_regions.size() == 0) {
return 0;
}
@@ -299,8 +296,7 @@
static uint32_t GetRegionColor(uint8_t** rows, const Bounds& region) {
// Sample the first pixel to compare against.
- const uint32_t expected_color =
- NinePatch::PackRGBA(rows[region.top] + region.left * 4);
+ const uint32_t expected_color = NinePatch::PackRGBA(rows[region.top] + region.left * 4);
for (int32_t y = region.top; y < region.bottom; y++) {
const uint8_t* row = rows[y];
for (int32_t x = region.left; x < region.right; x++) {
@@ -336,10 +332,11 @@
// the indices must be offset by 1.
//
// width and height also include the 9-patch 1px border.
-static void CalculateRegionColors(
- uint8_t** rows, const std::vector<Range>& horizontal_stretch_regions,
- const std::vector<Range>& vertical_stretch_regions, const int32_t width,
- const int32_t height, std::vector<uint32_t>* out_colors) {
+static void CalculateRegionColors(uint8_t** rows,
+ const std::vector<Range>& horizontal_stretch_regions,
+ const std::vector<Range>& vertical_stretch_regions,
+ const int32_t width, const int32_t height,
+ std::vector<uint32_t>* out_colors) {
int32_t next_top = 0;
Bounds bounds;
auto row_iter = vertical_stretch_regions.begin();
@@ -401,8 +398,7 @@
// alpha value begins
// (on both sides).
template <typename ImageLine>
-static void FindOutlineInsets(const ImageLine* image_line, int32_t* out_start,
- int32_t* out_end) {
+static void FindOutlineInsets(const ImageLine* image_line, int32_t* out_start, int32_t* out_end) {
*out_start = 0;
*out_end = 0;
@@ -455,10 +451,8 @@
return (pixel[3] << 24) | (pixel[0] << 16) | (pixel[1] << 8) | pixel[2];
}
-std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows,
- const int32_t width,
- const int32_t height,
- std::string* out_err) {
+std::unique_ptr<NinePatch> NinePatch::Create(uint8_t** rows, const int32_t width,
+ const int32_t height, std::string* out_err) {
if (width < 3 || height < 3) {
*out_err = "image must be at least 3x3 (1x1 image with 1 pixel border)";
return {};
@@ -472,12 +466,11 @@
std::unique_ptr<ColorValidator> color_validator;
if (rows[0][3] == 0) {
- color_validator = util::make_unique<TransparentNeutralColorValidator>();
+ color_validator = std::make_unique<TransparentNeutralColorValidator>();
} else if (PackRGBA(rows[0]) == kColorOpaqueWhite) {
- color_validator = util::make_unique<WhiteNeutralColorValidator>();
+ color_validator = std::make_unique<WhiteNeutralColorValidator>();
} else {
- *out_err =
- "top-left corner pixel must be either opaque white or transparent";
+ *out_err = "top-left corner pixel must be either opaque white or transparent";
return {};
}
@@ -485,9 +478,8 @@
auto nine_patch = std::unique_ptr<NinePatch>(new NinePatch());
HorizontalImageLine top_row(rows, 0, 0, width);
- if (!FillRanges(&top_row, color_validator.get(),
- &nine_patch->horizontal_stretch_regions, &unexpected_ranges,
- out_err)) {
+ if (!FillRanges(&top_row, color_validator.get(), &nine_patch->horizontal_stretch_regions,
+ &unexpected_ranges, out_err)) {
return {};
}
@@ -501,9 +493,8 @@
}
VerticalImageLine left_col(rows, 0, 0, height);
- if (!FillRanges(&left_col, color_validator.get(),
- &nine_patch->vertical_stretch_regions, &unexpected_ranges,
- out_err)) {
+ if (!FillRanges(&left_col, color_validator.get(), &nine_patch->vertical_stretch_regions,
+ &unexpected_ranges, out_err)) {
return {};
}
@@ -522,32 +513,28 @@
}
if (!PopulateBounds(horizontal_padding, horizontal_layout_bounds,
- nine_patch->horizontal_stretch_regions, width - 2,
- &nine_patch->padding.left, &nine_patch->padding.right,
- &nine_patch->layout_bounds.left,
+ nine_patch->horizontal_stretch_regions, width - 2, &nine_patch->padding.left,
+ &nine_patch->padding.right, &nine_patch->layout_bounds.left,
&nine_patch->layout_bounds.right, "bottom", out_err)) {
return {};
}
VerticalImageLine right_col(rows, width - 1, 0, height);
- if (!FillRanges(&right_col, color_validator.get(), &vertical_padding,
- &vertical_layout_bounds, out_err)) {
+ if (!FillRanges(&right_col, color_validator.get(), &vertical_padding, &vertical_layout_bounds,
+ out_err)) {
return {};
}
if (!PopulateBounds(vertical_padding, vertical_layout_bounds,
- nine_patch->vertical_stretch_regions, height - 2,
- &nine_patch->padding.top, &nine_patch->padding.bottom,
- &nine_patch->layout_bounds.top,
+ nine_patch->vertical_stretch_regions, height - 2, &nine_patch->padding.top,
+ &nine_patch->padding.bottom, &nine_patch->layout_bounds.top,
&nine_patch->layout_bounds.bottom, "right", out_err)) {
return {};
}
// Fill the region colors of the 9-patch.
- const int32_t num_rows =
- CalculateSegmentCount(nine_patch->horizontal_stretch_regions, width - 2);
- const int32_t num_cols =
- CalculateSegmentCount(nine_patch->vertical_stretch_regions, height - 2);
+ const int32_t num_rows = CalculateSegmentCount(nine_patch->horizontal_stretch_regions, width - 2);
+ const int32_t num_cols = CalculateSegmentCount(nine_patch->vertical_stretch_regions, height - 2);
if ((int64_t)num_rows * (int64_t)num_cols > 0x7f) {
*out_err = "too many regions in 9-patch";
return {};
@@ -555,40 +542,35 @@
nine_patch->region_colors.reserve(num_rows * num_cols);
CalculateRegionColors(rows, nine_patch->horizontal_stretch_regions,
- nine_patch->vertical_stretch_regions, width - 2,
- height - 2, &nine_patch->region_colors);
+ nine_patch->vertical_stretch_regions, width - 2, height - 2,
+ &nine_patch->region_colors);
// Compute the outline based on opacity.
// Find left and right extent of 9-patch content on center row.
HorizontalImageLine mid_row(rows, 1, height / 2, width - 2);
- FindOutlineInsets(&mid_row, &nine_patch->outline.left,
- &nine_patch->outline.right);
+ FindOutlineInsets(&mid_row, &nine_patch->outline.left, &nine_patch->outline.right);
// Find top and bottom extent of 9-patch content on center column.
VerticalImageLine mid_col(rows, width / 2, 1, height - 2);
- FindOutlineInsets(&mid_col, &nine_patch->outline.top,
- &nine_patch->outline.bottom);
+ FindOutlineInsets(&mid_col, &nine_patch->outline.top, &nine_patch->outline.bottom);
- const int32_t outline_width =
- (width - 2) - nine_patch->outline.left - nine_patch->outline.right;
+ const int32_t outline_width = (width - 2) - nine_patch->outline.left - nine_patch->outline.right;
const int32_t outline_height =
(height - 2) - nine_patch->outline.top - nine_patch->outline.bottom;
// Find the largest alpha value within the outline area.
- HorizontalImageLine outline_mid_row(
- rows, 1 + nine_patch->outline.left,
- 1 + nine_patch->outline.top + (outline_height / 2), outline_width);
- VerticalImageLine outline_mid_col(
- rows, 1 + nine_patch->outline.left + (outline_width / 2),
- 1 + nine_patch->outline.top, outline_height);
+ HorizontalImageLine outline_mid_row(rows, 1 + nine_patch->outline.left,
+ 1 + nine_patch->outline.top + (outline_height / 2),
+ outline_width);
+ VerticalImageLine outline_mid_col(rows, 1 + nine_patch->outline.left + (outline_width / 2),
+ 1 + nine_patch->outline.top, outline_height);
nine_patch->outline_alpha =
std::max(FindMaxAlpha(&outline_mid_row), FindMaxAlpha(&outline_mid_col));
// Assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center.
- DiagonalImageLine diagonal(rows, 1 + nine_patch->outline.left,
- 1 + nine_patch->outline.top, 1, 1,
+ DiagonalImageLine diagonal(rows, 1 + nine_patch->outline.left, 1 + nine_patch->outline.top, 1, 1,
std::min(outline_width, outline_height));
int32_t top_left, bottom_right;
FindOutlineInsets(&diagonal, &top_left, &bottom_right);
@@ -614,10 +596,9 @@
data.paddingBottom = padding.bottom;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[data.serializedSize()]);
- android::Res_png_9patch::serialize(
- data, (const int32_t*)horizontal_stretch_regions.data(),
- (const int32_t*)vertical_stretch_regions.data(), region_colors.data(),
- buffer.get());
+ android::Res_png_9patch::serialize(data, (const int32_t*)horizontal_stretch_regions.data(),
+ (const int32_t*)vertical_stretch_regions.data(),
+ region_colors.data(), buffer.get());
// Convert to file endianness.
reinterpret_cast<android::Res_png_9patch*>(buffer.get())->deviceToFile();
@@ -625,8 +606,7 @@
return buffer;
}
-std::unique_ptr<uint8_t[]> NinePatch::SerializeLayoutBounds(
- size_t* out_len) const {
+std::unique_ptr<uint8_t[]> NinePatch::SerializeLayoutBounds(size_t* out_len) const {
size_t chunk_len = sizeof(uint32_t) * 4;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunk_len]);
uint8_t* cursor = buffer.get();
@@ -647,8 +627,7 @@
return buffer;
}
-std::unique_ptr<uint8_t[]> NinePatch::SerializeRoundedRectOutline(
- size_t* out_len) const {
+std::unique_ptr<uint8_t[]> NinePatch::SerializeRoundedRectOutline(size_t* out_len) const {
size_t chunk_len = sizeof(uint32_t) * 6;
auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[chunk_len]);
uint8_t* cursor = buffer.get();
@@ -679,20 +658,25 @@
}
::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds) {
- return out << "l=" << bounds.left << " t=" << bounds.top
- << " r=" << bounds.right << " b=" << bounds.bottom;
+ return out << "l=" << bounds.left << " t=" << bounds.top << " r=" << bounds.right
+ << " b=" << bounds.bottom;
+}
+
+template <typename T>
+std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
+ for (int i = 0; i < v.size(); ++i) {
+ os << v[i];
+ if (i != v.size() - 1) os << " ";
+ }
+ return os;
}
::std::ostream& operator<<(::std::ostream& out, const NinePatch& nine_patch) {
- return out << "horizontalStretch:"
- << util::Joiner(nine_patch.horizontal_stretch_regions, " ")
- << " verticalStretch:"
- << util::Joiner(nine_patch.vertical_stretch_regions, " ")
- << " padding: " << nine_patch.padding
- << ", bounds: " << nine_patch.layout_bounds
- << ", outline: " << nine_patch.outline
- << " rad=" << nine_patch.outline_radius
+ return out << "horizontalStretch:" << nine_patch.horizontal_stretch_regions
+ << " verticalStretch:" << nine_patch.vertical_stretch_regions
+ << " padding: " << nine_patch.padding << ", bounds: " << nine_patch.layout_bounds
+ << ", outline: " << nine_patch.outline << " rad=" << nine_patch.outline_radius
<< " alpha=" << nine_patch.outline_alpha;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/Png.cpp b/libs/androidfw/Png.cpp
similarity index 77%
rename from tools/aapt2/compile/Png.cpp
rename to libs/androidfw/Png.cpp
index 76db815..fb45cd9 100644
--- a/tools/aapt2/compile/Png.cpp
+++ b/libs/androidfw/Png.cpp
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-#include "Png.h"
+#include "androidfw/Png.h"
#include <png.h>
#include <zlib.h>
@@ -24,13 +24,12 @@
#include <string>
#include <vector>
+#include "android-base/strings.h"
#include "androidfw/BigBuffer.h"
#include "androidfw/ResourceTypes.h"
#include "androidfw/Source.h"
-#include "trace/TraceBuffer.h"
-#include "util/Util.h"
-namespace aapt {
+namespace android {
constexpr bool kDebug = false;
@@ -47,9 +46,8 @@
}
void* serialize9Patch() {
- void* serialized = android::Res_png_9patch::serialize(info9Patch, xDivs,
- yDivs, colors.data());
- reinterpret_cast<android::Res_png_9patch*>(serialized)->deviceToFile();
+ void* serialized = Res_png_9patch::serialize(info9Patch, xDivs, yDivs, colors.data());
+ reinterpret_cast<Res_png_9patch*>(serialized)->deviceToFile();
return serialized;
}
@@ -58,7 +56,7 @@
std::vector<png_bytep> rows;
bool is9Patch = false;
- android::Res_png_9patch info9Patch;
+ Res_png_9patch info9Patch;
int32_t* xDivs = nullptr;
int32_t* yDivs = nullptr;
std::vector<uint32_t> colors;
@@ -79,34 +77,30 @@
uint8_t outlineAlpha;
};
-static void readDataFromStream(png_structp readPtr, png_bytep data,
- png_size_t length) {
- std::istream* input =
- reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
+static void readDataFromStream(png_structp readPtr, png_bytep data, png_size_t length) {
+ std::istream* input = reinterpret_cast<std::istream*>(png_get_io_ptr(readPtr));
if (!input->read(reinterpret_cast<char*>(data), length)) {
png_error(readPtr, strerror(errno));
}
}
-static void writeDataToStream(png_structp writePtr, png_bytep data,
- png_size_t length) {
- android::BigBuffer* outBuffer = reinterpret_cast<android::BigBuffer*>(png_get_io_ptr(writePtr));
+static void writeDataToStream(png_structp writePtr, png_bytep data, png_size_t length) {
+ BigBuffer* outBuffer = reinterpret_cast<BigBuffer*>(png_get_io_ptr(writePtr));
png_bytep buf = outBuffer->NextBlock<png_byte>(length);
memcpy(buf, data, length);
}
-static void flushDataToStream(png_structp /*writePtr*/) {}
-
-static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
- android::IDiagnostics* diag =
- reinterpret_cast<android::IDiagnostics*>(png_get_error_ptr(readPtr));
- diag->Warn(android::DiagMessage() << warningMessage);
+static void flushDataToStream(png_structp /*writePtr*/) {
}
-static bool readPng(android::IDiagnostics* diag, png_structp readPtr, png_infop infoPtr,
- PngInfo* outInfo) {
+static void logWarning(png_structp readPtr, png_const_charp warningMessage) {
+ IDiagnostics* diag = reinterpret_cast<IDiagnostics*>(png_get_error_ptr(readPtr));
+ diag->Warn(DiagMessage() << warningMessage);
+}
+
+static bool readPng(IDiagnostics* diag, png_structp readPtr, png_infop infoPtr, PngInfo* outInfo) {
if (setjmp(png_jmpbuf(readPtr))) {
- diag->Error(android::DiagMessage() << "failed reading png");
+ diag->Error(DiagMessage() << "failed reading png");
return false;
}
@@ -114,8 +108,8 @@
png_read_info(readPtr, infoPtr);
int colorType, bitDepth, interlaceType, compressionType;
- png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth,
- &colorType, &interlaceType, &compressionType, nullptr);
+ png_get_IHDR(readPtr, infoPtr, &outInfo->width, &outInfo->height, &bitDepth, &colorType,
+ &interlaceType, &compressionType, nullptr);
if (colorType == PNG_COLOR_TYPE_PALETTE) {
png_set_palette_to_rgb(readPtr);
@@ -137,8 +131,7 @@
png_set_add_alpha(readPtr, 0xFF, PNG_FILLER_AFTER);
}
- if (colorType == PNG_COLOR_TYPE_GRAY ||
- colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(readPtr);
}
@@ -156,12 +149,11 @@
return true;
}
-static void checkNinePatchSerialization(android::Res_png_9patch* inPatch,
- void* data) {
+static void checkNinePatchSerialization(Res_png_9patch* inPatch, void* data) {
size_t patchSize = inPatch->serializedSize();
void* newData = malloc(patchSize);
memcpy(newData, data, patchSize);
- android::Res_png_9patch* outPatch = inPatch->deserialize(newData);
+ Res_png_9patch* outPatch = inPatch->deserialize(newData);
outPatch->fileToDevice();
// deserialization is done in place, so outPatch == newData
assert(outPatch == newData);
@@ -244,10 +236,9 @@
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define ABS(a) ((a) < 0 ? -(a) : (a))
-static void analyze_image(android::IDiagnostics* diag, const PngInfo& imageInfo,
- int grayscaleTolerance, png_colorp rgbPalette, png_bytep alphaPalette,
- int* paletteEntries, bool* hasTransparency, int* colorType,
- png_bytepp outRows) {
+static void analyze_image(IDiagnostics* diag, const PngInfo& imageInfo, int grayscaleTolerance,
+ png_colorp rgbPalette, png_bytep alphaPalette, int* paletteEntries,
+ bool* hasTransparency, int* colorType, png_bytepp outRows) {
int w = imageInfo.width;
int h = imageInfo.height;
int i, j, rr, gg, bb, aa, idx;
@@ -284,8 +275,8 @@
maxGrayDeviation = MAX(ABS(bb - rr), maxGrayDeviation);
if (maxGrayDeviation > odev) {
if (kDebug) {
- printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n",
- maxGrayDeviation, i, j, rr, gg, bb, aa);
+ printf("New max dev. = %d at pixel (%d, %d) = (%d %d %d %d)\n", maxGrayDeviation, i, j,
+ rr, gg, bb, aa);
}
}
@@ -293,8 +284,7 @@
if (isGrayscale) {
if (rr != gg || rr != bb) {
if (kDebug) {
- printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j,
- rr, gg, bb, aa);
+ printf("Found a non-gray pixel at %d, %d = (%d %d %d %d)\n", i, j, rr, gg, bb, aa);
}
isGrayscale = false;
}
@@ -304,8 +294,7 @@
if (isOpaque) {
if (aa != 0xff) {
if (kDebug) {
- printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j,
- rr, gg, bb, aa);
+ printf("Found a non-opaque pixel at %d, %d = (%d %d %d %d)\n", i, j, rr, gg, bb, aa);
}
isOpaque = false;
}
@@ -349,10 +338,9 @@
printf("isGrayscale = %s\n", isGrayscale ? "true" : "false");
printf("isOpaque = %s\n", isOpaque ? "true" : "false");
printf("isPalette = %s\n", isPalette ? "true" : "false");
- printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize,
- 2 * w * h, bpp * w * h);
- printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation,
- grayscaleTolerance);
+ printf("Size w/ palette = %d, gray+alpha = %d, rgb(a) = %d\n", paletteSize, 2 * w * h,
+ bpp * w * h);
+ printf("Max gray deviation = %d, tolerance = %d\n", maxGrayDeviation, grayscaleTolerance);
}
// Choose the best color type for the image.
@@ -381,8 +369,8 @@
*colorType = PNG_COLOR_TYPE_PALETTE;
} else {
if (maxGrayDeviation <= grayscaleTolerance) {
- diag->Note(android::DiagMessage()
- << "forcing image to gray (max deviation = " << maxGrayDeviation << ")");
+ diag->Note(DiagMessage() << "forcing image to gray (max deviation = " << maxGrayDeviation
+ << ")");
*colorType = isOpaque ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_GRAY_ALPHA;
} else {
*colorType = isOpaque ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA;
@@ -404,8 +392,7 @@
rgbPalette[idx].blue = (png_byte)((col >> 8) & 0xff);
alphaPalette[idx] = (png_byte)(col & 0xff);
}
- } else if (*colorType == PNG_COLOR_TYPE_GRAY ||
- *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ } else if (*colorType == PNG_COLOR_TYPE_GRAY || *colorType == PNG_COLOR_TYPE_GRAY_ALPHA) {
// If the image is gray or gray + alpha, compact the pixels into outRows
for (j = 0; j < h; j++) {
const png_byte* row = imageInfo.rows[j];
@@ -429,10 +416,10 @@
}
}
-static bool writePng(android::IDiagnostics* diag, png_structp writePtr, png_infop infoPtr,
- PngInfo* info, int grayScaleTolerance) {
+static bool writePng(IDiagnostics* diag, png_structp writePtr, png_infop infoPtr, PngInfo* info,
+ int grayScaleTolerance) {
if (setjmp(png_jmpbuf(writePtr))) {
- diag->Error(android::DiagMessage() << "failed to write png");
+ diag->Error(DiagMessage() << "failed to write png");
return false;
}
@@ -444,8 +431,7 @@
unknowns[1].data = nullptr;
unknowns[2].data = nullptr;
- png_bytepp outRows =
- (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
+ png_bytepp outRows = (png_bytepp)malloc((int)info->height * sizeof(png_bytep));
if (outRows == (png_bytepp)0) {
printf("Can't allocate output buffer!\n");
exit(1);
@@ -461,8 +447,7 @@
png_set_compression_level(writePtr, Z_BEST_COMPRESSION);
if (kDebug) {
- diag->Note(android::DiagMessage()
- << "writing image: w = " << info->width << ", h = " << info->height);
+ diag->Note(DiagMessage() << "writing image: w = " << info->width << ", h = " << info->height);
}
png_color rgbPalette[256];
@@ -470,48 +455,45 @@
bool hasTransparency;
int paletteEntries;
- analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette,
- &paletteEntries, &hasTransparency, &colorType, outRows);
+ analyze_image(diag, *info, grayScaleTolerance, rgbPalette, alphaPalette, &paletteEntries,
+ &hasTransparency, &colorType, outRows);
// If the image is a 9-patch, we need to preserve it as a ARGB file to make
// sure the pixels will not be pre-dithered/clamped until we decide they are
- if (info->is9Patch &&
- (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
- colorType == PNG_COLOR_TYPE_PALETTE)) {
+ if (info->is9Patch && (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_GRAY ||
+ colorType == PNG_COLOR_TYPE_PALETTE)) {
colorType = PNG_COLOR_TYPE_RGB_ALPHA;
}
if (kDebug) {
switch (colorType) {
case PNG_COLOR_TYPE_PALETTE:
- diag->Note(android::DiagMessage() << "has " << paletteEntries << " colors"
- << (hasTransparency ? " (with alpha)" : "")
- << ", using PNG_COLOR_TYPE_PALLETTE");
+ diag->Note(DiagMessage() << "has " << paletteEntries << " colors"
+ << (hasTransparency ? " (with alpha)" : "")
+ << ", using PNG_COLOR_TYPE_PALLETTE");
break;
case PNG_COLOR_TYPE_GRAY:
- diag->Note(android::DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
+ diag->Note(DiagMessage() << "is opaque gray, using PNG_COLOR_TYPE_GRAY");
break;
case PNG_COLOR_TYPE_GRAY_ALPHA:
- diag->Note(android::DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
+ diag->Note(DiagMessage() << "is gray + alpha, using PNG_COLOR_TYPE_GRAY_ALPHA");
break;
case PNG_COLOR_TYPE_RGB:
- diag->Note(android::DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
+ diag->Note(DiagMessage() << "is opaque RGB, using PNG_COLOR_TYPE_RGB");
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
- diag->Note(android::DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
+ diag->Note(DiagMessage() << "is RGB + alpha, using PNG_COLOR_TYPE_RGB_ALPHA");
break;
}
}
- png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType,
- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ png_set_IHDR(writePtr, infoPtr, info->width, info->height, 8, colorType, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
if (colorType == PNG_COLOR_TYPE_PALETTE) {
png_set_PLTE(writePtr, infoPtr, rgbPalette, paletteEntries);
if (hasTransparency) {
- png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries,
- (png_color_16p)0);
+ png_set_tRNS(writePtr, infoPtr, alphaPalette, paletteEntries, (png_color_16p)0);
}
png_set_filter(writePtr, 0, PNG_NO_FILTERS);
} else {
@@ -526,13 +508,12 @@
// Chunks ordered thusly because older platforms depend on the base 9 patch
// data being last
- png_bytep chunkNames = info->haveLayoutBounds
- ? (png_bytep) "npOl\0npLb\0npTc\0"
- : (png_bytep) "npOl\0npTc";
+ png_bytep chunkNames =
+ info->haveLayoutBounds ? (png_bytep) "npOl\0npLb\0npTc\0" : (png_bytep) "npOl\0npTc";
// base 9 patch data
if (kDebug) {
- diag->Note(android::DiagMessage() << "adding 9-patch info..");
+ diag->Note(DiagMessage() << "adding 9-patch info..");
}
memcpy((char*)unknowns[pIndex].name, "npTc", 5);
unknowns[pIndex].data = (png_byte*)info->serialize9Patch();
@@ -563,8 +544,7 @@
for (int i = 0; i < chunkCount; i++) {
unknowns[i].location = PNG_HAVE_PLTE;
}
- png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames,
- chunkCount);
+ png_set_keep_unknown_chunks(writePtr, PNG_HANDLE_CHUNK_ALWAYS, chunkNames, chunkCount);
png_set_unknown_chunks(writePtr, infoPtr, unknowns, chunkCount);
#if PNG_LIBPNG_VER < 10600
@@ -579,8 +559,7 @@
png_write_info(writePtr, infoPtr);
png_bytepp rows;
- if (colorType == PNG_COLOR_TYPE_RGB ||
- colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
+ if (colorType == PNG_COLOR_TYPE_RGB || colorType == PNG_COLOR_TYPE_RGB_ALPHA) {
if (colorType == PNG_COLOR_TYPE_RGB) {
png_set_filler(writePtr, 0, PNG_FILLER_AFTER);
}
@@ -605,14 +584,13 @@
free(unknowns[1].data);
free(unknowns[2].data);
- png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType,
- &interlaceType, &compressionType, nullptr);
+ png_get_IHDR(writePtr, infoPtr, &width, &height, &bitDepth, &colorType, &interlaceType,
+ &compressionType, nullptr);
if (kDebug) {
- diag->Note(android::DiagMessage()
- << "image written: w = " << width << ", h = " << height << ", d = " << bitDepth
- << ", colors = " << colorType << ", inter = " << interlaceType
- << ", comp = " << compressionType);
+ diag->Note(DiagMessage() << "image written: w = " << width << ", h = " << height
+ << ", d = " << bitDepth << ", colors = " << colorType
+ << ", inter = " << interlaceType << ", comp = " << compressionType);
}
return true;
}
@@ -673,9 +651,8 @@
enum class TickState { kStart, kInside1, kOutside1 };
-static bool getHorizontalTicks(png_bytep row, int width, bool transparent,
- bool required, int32_t* outLeft,
- int32_t* outRight, const char** outError,
+static bool getHorizontalTicks(png_bytep row, int width, bool transparent, bool required,
+ int32_t* outLeft, int32_t* outRight, const char** outError,
uint8_t* outDivs, bool multipleAllowed) {
*outLeft = *outRight = -1;
TickState state = TickState::kStart;
@@ -683,8 +660,7 @@
for (int i = 1; i < width - 1; i++) {
if (tickType(row + i * 4, transparent, outError) == TickType::kTick) {
- if (state == TickState::kStart ||
- (state == TickState::kOutside1 && multipleAllowed)) {
+ if (state == TickState::kStart || (state == TickState::kOutside1 && multipleAllowed)) {
*outLeft = i - 1;
*outRight = width - 2;
found = true;
@@ -719,18 +695,16 @@
return true;
}
-static bool getVerticalTicks(png_bytepp rows, int offset, int height,
- bool transparent, bool required, int32_t* outTop,
- int32_t* outBottom, const char** outError,
- uint8_t* outDivs, bool multipleAllowed) {
+static bool getVerticalTicks(png_bytepp rows, int offset, int height, bool transparent,
+ bool required, int32_t* outTop, int32_t* outBottom,
+ const char** outError, uint8_t* outDivs, bool multipleAllowed) {
*outTop = *outBottom = -1;
TickState state = TickState::kStart;
bool found = false;
for (int i = 1; i < height - 1; i++) {
if (tickType(rows[i] + offset, transparent, outError) == TickType::kTick) {
- if (state == TickState::kStart ||
- (state == TickState::kOutside1 && multipleAllowed)) {
+ if (state == TickState::kStart || (state == TickState::kOutside1 && multipleAllowed)) {
*outTop = i - 1;
*outBottom = height - 2;
found = true;
@@ -765,10 +739,8 @@
return true;
}
-static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width,
- bool transparent,
- bool /* required */,
- int32_t* outLeft, int32_t* outRight,
+static bool getHorizontalLayoutBoundsTicks(png_bytep row, int width, bool transparent,
+ bool /* required */, int32_t* outLeft, int32_t* outRight,
const char** outError) {
*outLeft = *outRight = 0;
@@ -779,23 +751,20 @@
while (i < width - 1) {
(*outLeft)++;
i++;
- if (tickType(row + i * 4, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
}
// Look for right tick
- if (tickType(row + (width - 2) * 4, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(row + (width - 2) * 4, transparent, outError) == TickType::kLayoutBounds) {
// Ending with a layout padding tick
int i = width - 2;
while (i > 1) {
(*outRight)++;
i--;
- if (tickType(row + i * 4, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(row + i * 4, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
@@ -803,38 +772,32 @@
return true;
}
-static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset,
- int height, bool transparent,
- bool /* required */, int32_t* outTop,
- int32_t* outBottom,
+static bool getVerticalLayoutBoundsTicks(png_bytepp rows, int offset, int height, bool transparent,
+ bool /* required */, int32_t* outTop, int32_t* outBottom,
const char** outError) {
*outTop = *outBottom = 0;
// Look for top tick
- if (tickType(rows[1] + offset, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(rows[1] + offset, transparent, outError) == TickType::kLayoutBounds) {
// Starting with a layout padding tick
int i = 1;
while (i < height - 1) {
(*outTop)++;
i++;
- if (tickType(rows[i] + offset, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
}
// Look for bottom tick
- if (tickType(rows[height - 2] + offset, transparent, outError) ==
- TickType::kLayoutBounds) {
+ if (tickType(rows[height - 2] + offset, transparent, outError) == TickType::kLayoutBounds) {
// Ending with a layout padding tick
int i = height - 2;
while (i > 1) {
(*outBottom)++;
i--;
- if (tickType(rows[i] + offset, transparent, outError) !=
- TickType::kLayoutBounds) {
+ if (tickType(rows[i] + offset, transparent, outError) != TickType::kLayoutBounds) {
break;
}
}
@@ -842,13 +805,12 @@
return true;
}
-static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX,
- int endY, int dX, int dY, int* outInset) {
+static void findMaxOpacity(png_bytepp rows, int startX, int startY, int endX, int endY, int dX,
+ int dY, int* outInset) {
uint8_t maxOpacity = 0;
int inset = 0;
*outInset = 0;
- for (int x = startX, y = startY; x != endX && y != endY;
- x += dX, y += dY, inset++) {
+ for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
png_byte* color = rows[y] + x * 4;
uint8_t opacity = color[3];
if (opacity > maxOpacity) {
@@ -868,8 +830,7 @@
return maxAlpha;
}
-static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY,
- int endY) {
+static uint8_t maxAlphaOverCol(png_bytepp rows, int offsetX, int startY, int endY) {
uint8_t maxAlpha = 0;
for (int y = startY; y < endY; y++) {
uint8_t alpha = (rows[y] + offsetX * 4)[3];
@@ -886,10 +847,8 @@
// find left and right extent of nine patch content on center row
if (image->width > 4) {
- findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0,
- &image->outlineInsetsLeft);
- findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0,
- &image->outlineInsetsRight);
+ findMaxOpacity(image->rows.data(), 1, midY, midX, -1, 1, 0, &image->outlineInsetsLeft);
+ findMaxOpacity(image->rows.data(), endX, midY, midX, -1, -1, 0, &image->outlineInsetsRight);
} else {
image->outlineInsetsLeft = 0;
image->outlineInsetsRight = 0;
@@ -897,10 +856,8 @@
// find top and bottom extent of nine patch content on center column
if (image->height > 4) {
- findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1,
- &image->outlineInsetsTop);
- findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1,
- &image->outlineInsetsBottom);
+ findMaxOpacity(image->rows.data(), midX, 1, -1, midY, 0, 1, &image->outlineInsetsTop);
+ findMaxOpacity(image->rows.data(), midX, endY, -1, midY, 0, -1, &image->outlineInsetsBottom);
} else {
image->outlineInsetsTop = 0;
image->outlineInsetsBottom = 0;
@@ -915,13 +872,13 @@
// assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center
- image->outlineAlpha = std::max(
- maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
- maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
+ image->outlineAlpha =
+ std::max(maxAlphaOverRow(image->rows[innerMidY], innerStartX, innerEndX),
+ maxAlphaOverCol(image->rows.data(), innerMidX, innerStartY, innerStartY));
int diagonalInset = 0;
- findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX,
- innerMidY, 1, 1, &diagonalInset);
+ findMaxOpacity(image->rows.data(), innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
+ &diagonalInset);
/* Determine source radius based upon inset:
* sqrt(r^2 + r^2) = sqrt(i^2 + i^2) + r
@@ -932,19 +889,17 @@
image->outlineRadius = 3.4142f * diagonalInset;
if (kDebug) {
- printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
- image->outlineInsetsLeft, image->outlineInsetsTop,
- image->outlineInsetsRight, image->outlineInsetsBottom,
+ printf("outline insets %d %d %d %d, rad %f, alpha %x\n", image->outlineInsetsLeft,
+ image->outlineInsetsTop, image->outlineInsetsRight, image->outlineInsetsBottom,
image->outlineRadius, image->outlineAlpha);
}
}
-static uint32_t getColor(png_bytepp rows, int left, int top, int right,
- int bottom) {
+static uint32_t getColor(png_bytepp rows, int left, int top, int right, int bottom) {
png_bytep color = rows[top] + left * 4;
if (left > right || top > bottom) {
- return android::Res_png_9patch::TRANSPARENT_COLOR;
+ return Res_png_9patch::TRANSPARENT_COLOR;
}
while (top <= bottom) {
@@ -952,18 +907,17 @@
png_bytep p = rows[top] + i * 4;
if (color[3] == 0) {
if (p[3] != 0) {
- return android::Res_png_9patch::NO_COLOR;
+ return Res_png_9patch::NO_COLOR;
}
- } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] ||
- p[3] != color[3]) {
- return android::Res_png_9patch::NO_COLOR;
+ } else if (p[0] != color[0] || p[1] != color[1] || p[2] != color[2] || p[3] != color[3]) {
+ return Res_png_9patch::NO_COLOR;
}
}
top++;
}
if (color[3] == 0) {
- return android::Res_png_9patch::TRANSPARENT_COLOR;
+ return Res_png_9patch::TRANSPARENT_COLOR;
}
return (color[3] << 24) | (color[0] << 16) | (color[1] << 8) | color[2];
}
@@ -1014,23 +968,22 @@
}
// Validate frame...
- if (!transparent &&
- (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
+ if (!transparent && (p[0] != 0xFF || p[1] != 0xFF || p[2] != 0xFF || p[3] != 0xFF)) {
errorMsg = "Must have one-pixel frame that is either transparent or white";
goto getout;
}
// Find left and right of sizing areas...
- if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1],
- &errorMsg, &numXDivs, true)) {
+ if (!getHorizontalTicks(p, W, transparent, true, &xDivs[0], &xDivs[1], &errorMsg, &numXDivs,
+ true)) {
errorPixel = xDivs[0];
errorEdge = "top";
goto getout;
}
// Find top and bottom of sizing areas...
- if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0],
- &yDivs[1], &errorMsg, &numYDivs, true)) {
+ if (!getVerticalTicks(image->rows.data(), 0, H, transparent, true, &yDivs[0], &yDivs[1],
+ &errorMsg, &numYDivs, true)) {
errorPixel = yDivs[0];
errorEdge = "left";
goto getout;
@@ -1041,10 +994,8 @@
image->info9Patch.numYDivs = numYDivs;
// Find left and right of padding area...
- if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false,
- &image->info9Patch.paddingLeft,
- &image->info9Patch.paddingRight, &errorMsg, nullptr,
- false)) {
+ if (!getHorizontalTicks(image->rows[H - 1], W, transparent, false, &image->info9Patch.paddingLeft,
+ &image->info9Patch.paddingRight, &errorMsg, nullptr, false)) {
errorPixel = image->info9Patch.paddingLeft;
errorEdge = "bottom";
goto getout;
@@ -1052,9 +1003,8 @@
// Find top and bottom of padding area...
if (!getVerticalTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
- &image->info9Patch.paddingTop,
- &image->info9Patch.paddingBottom, &errorMsg, nullptr,
- false)) {
+ &image->info9Patch.paddingTop, &image->info9Patch.paddingBottom, &errorMsg,
+ nullptr, false)) {
errorPixel = image->info9Patch.paddingTop;
errorEdge = "right";
goto getout;
@@ -1062,22 +1012,18 @@
// Find left and right of layout padding...
getHorizontalLayoutBoundsTicks(image->rows[H - 1], W, transparent, false,
- &image->layoutBoundsLeft,
- &image->layoutBoundsRight, &errorMsg);
+ &image->layoutBoundsLeft, &image->layoutBoundsRight, &errorMsg);
- getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent,
- false, &image->layoutBoundsTop,
- &image->layoutBoundsBottom, &errorMsg);
+ getVerticalLayoutBoundsTicks(image->rows.data(), (W - 1) * 4, H, transparent, false,
+ &image->layoutBoundsTop, &image->layoutBoundsBottom, &errorMsg);
- image->haveLayoutBounds =
- image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
- image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
+ image->haveLayoutBounds = image->layoutBoundsLeft != 0 || image->layoutBoundsRight != 0 ||
+ image->layoutBoundsTop != 0 || image->layoutBoundsBottom != 0;
if (image->haveLayoutBounds) {
if (kDebug) {
- printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft,
- image->layoutBoundsTop, image->layoutBoundsRight,
- image->layoutBoundsBottom);
+ printf("layoutBounds=%d %d %d %d\n", image->layoutBoundsLeft, image->layoutBoundsTop,
+ image->layoutBoundsRight, image->layoutBoundsBottom);
}
}
@@ -1189,7 +1135,7 @@
c = getColor(image->rows.data(), left, top, right - 1, bottom - 1);
image->colors[colorIndex++] = c;
if (kDebug) {
- if (c != android::Res_png_9patch::NO_COLOR) {
+ if (c != Res_png_9patch::NO_COLOR) {
hasColor = true;
}
}
@@ -1214,8 +1160,7 @@
if (errorEdge) {
err << "." << std::endl;
if (errorPixel >= 0) {
- err << "Found at pixel #" << errorPixel << " along " << errorEdge
- << " edge";
+ err << "Found at pixel #" << errorPixel << " along " << errorEdge << " edge";
} else {
err << "Found along " << errorEdge << " edge";
}
@@ -1226,20 +1171,19 @@
return true;
}
-bool Png::process(const android::Source& source, std::istream* input, android::BigBuffer* outBuffer,
+bool Png::process(const Source& source, std::istream* input, BigBuffer* outBuffer,
const PngOptions& options) {
- TRACE_CALL();
png_byte signature[kPngSignatureSize];
// Read the PNG signature first.
if (!input->read(reinterpret_cast<char*>(signature), kPngSignatureSize)) {
- mDiag->Error(android::DiagMessage() << strerror(errno));
+ mDiag->Error(DiagMessage() << strerror(errno));
return false;
}
// If the PNG signature doesn't match, bail early.
if (png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
- mDiag->Error(android::DiagMessage() << "not a valid png file");
+ mDiag->Error(DiagMessage() << "not a valid png file");
return false;
}
@@ -1252,18 +1196,17 @@
readPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
if (!readPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate read ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate read ptr");
goto bail;
}
infoPtr = png_create_info_struct(readPtr);
if (!infoPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate info ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate info ptr");
goto bail;
}
- png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr,
- logWarning);
+ png_set_error_fn(readPtr, reinterpret_cast<png_voidp>(mDiag), nullptr, logWarning);
// Set the read function to read from std::istream.
png_set_read_fn(readPtr, (png_voidp)input, readDataFromStream);
@@ -1272,35 +1215,32 @@
goto bail;
}
- if (util::EndsWith(source.path, ".9.png")) {
+ if (android::base::EndsWith(source.path, ".9.png")) {
std::string errorMsg;
if (!do9Patch(&pngInfo, &errorMsg)) {
- mDiag->Error(android::DiagMessage() << errorMsg);
+ mDiag->Error(DiagMessage() << errorMsg);
goto bail;
}
}
- writePtr =
- png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
+ writePtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, nullptr, nullptr);
if (!writePtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate write ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate write ptr");
goto bail;
}
writeInfoPtr = png_create_info_struct(writePtr);
if (!writeInfoPtr) {
- mDiag->Error(android::DiagMessage() << "failed to allocate write info ptr");
+ mDiag->Error(DiagMessage() << "failed to allocate write info ptr");
goto bail;
}
png_set_error_fn(writePtr, nullptr, nullptr, logWarning);
// Set the write function to write to std::ostream.
- png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream,
- flushDataToStream);
+ png_set_write_fn(writePtr, (png_voidp)outBuffer, writeDataToStream, flushDataToStream);
- if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo,
- options.grayscale_tolerance)) {
+ if (!writePng(mDiag, writePtr, writeInfoPtr, &pngInfo, options.grayscale_tolerance)) {
goto bail;
}
@@ -1316,4 +1256,4 @@
return result;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/PngChunkFilter.cpp b/libs/androidfw/PngChunkFilter.cpp
similarity index 95%
rename from tools/aapt2/compile/PngChunkFilter.cpp
rename to libs/androidfw/PngChunkFilter.cpp
index 2e55d0c..331b948 100644
--- a/tools/aapt2/compile/PngChunkFilter.cpp
+++ b/libs/androidfw/PngChunkFilter.cpp
@@ -14,25 +14,22 @@
* limitations under the License.
*/
-#include "compile/Png.h"
-
#include "android-base/stringprintf.h"
+#include "android-base/strings.h"
+#include "androidfw/Png.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
-
-using ::android::StringPiece;
using ::android::base::StringPrintf;
-namespace aapt {
+namespace android {
static constexpr const char* kPngSignature = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a";
// Useful helper function that encodes individual bytes into a uint32
// at compile time.
constexpr uint32_t u32(uint8_t a, uint8_t b, uint8_t c, uint8_t d) {
- return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) |
- ((uint32_t)d);
+ return (((uint32_t)a) << 24) | (((uint32_t)b) << 16) | (((uint32_t)c) << 8) | ((uint32_t)d);
}
// Allow list of PNG chunk types that we want to keep in the resulting PNG.
@@ -71,7 +68,7 @@
}
PngChunkFilter::PngChunkFilter(StringPiece data) : data_(data) {
- if (util::StartsWith(data_, kPngSignature)) {
+ if (android::base::StartsWith(data_, kPngSignature)) {
window_start_ = 0;
window_end_ = kPngSignatureSize;
} else {
@@ -176,5 +173,4 @@
window_end_ = kPngSignatureSize;
return true;
}
-
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/PngCrunch.cpp b/libs/androidfw/PngCrunch.cpp
similarity index 87%
rename from tools/aapt2/compile/PngCrunch.cpp
rename to libs/androidfw/PngCrunch.cpp
index 4ef87ba..cf3c0ee 100644
--- a/tools/aapt2/compile/PngCrunch.cpp
+++ b/libs/androidfw/PngCrunch.cpp
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-#include "compile/Png.h"
-
#include <png.h>
#include <zlib.h>
@@ -26,16 +24,16 @@
#include "android-base/errors.h"
#include "android-base/logging.h"
#include "android-base/macros.h"
+#include "androidfw/Png.h"
-#include "trace/TraceBuffer.h"
-
-namespace aapt {
+namespace android {
// Custom deleter that destroys libpng read and info structs.
class PngReadStructDeleter {
public:
PngReadStructDeleter(png_structp read_ptr, png_infop info_ptr)
- : read_ptr_(read_ptr), info_ptr_(info_ptr) {}
+ : read_ptr_(read_ptr), info_ptr_(info_ptr) {
+ }
~PngReadStructDeleter() {
png_destroy_read_struct(&read_ptr_, &info_ptr_, nullptr);
@@ -52,7 +50,8 @@
class PngWriteStructDeleter {
public:
PngWriteStructDeleter(png_structp write_ptr, png_infop info_ptr)
- : write_ptr_(write_ptr), info_ptr_(info_ptr) {}
+ : write_ptr_(write_ptr), info_ptr_(info_ptr) {
+ }
~PngWriteStructDeleter() {
png_destroy_write_struct(&write_ptr_, &info_ptr_);
@@ -83,7 +82,7 @@
}
static void ReadDataFromStream(png_structp png_ptr, png_bytep buffer, png_size_t len) {
- io::InputStream* in = (io::InputStream*)png_get_io_ptr(png_ptr);
+ InputStream* in = (InputStream*)png_get_io_ptr(png_ptr);
const void* in_buffer;
size_t in_len;
@@ -108,7 +107,7 @@
}
static void WriteDataToStream(png_structp png_ptr, png_bytep buffer, png_size_t len) {
- io::OutputStream* out = (io::OutputStream*)png_get_io_ptr(png_ptr);
+ OutputStream* out = (OutputStream*)png_get_io_ptr(png_ptr);
void* out_buffer;
size_t out_len;
@@ -143,28 +142,22 @@
}
}
-std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& source,
- io::InputStream* in) {
- TRACE_CALL();
- // Create a diagnostics that has the source information encoded.
- android::SourcePathDiagnostics source_diag(source, context->GetDiagnostics());
-
+std::unique_ptr<Image> ReadPng(InputStream* in, IDiagnostics* diag) {
// Read the first 8 bytes of the file looking for the PNG signature.
// Bail early if it does not match.
const png_byte* signature;
size_t buffer_size;
if (!in->Next((const void**)&signature, &buffer_size)) {
if (in->HadError()) {
- source_diag.Error(android::DiagMessage()
- << "failed to read PNG signature: " << in->GetError());
+ diag->Error(android::DiagMessage() << "failed to read PNG signature: " << in->GetError());
} else {
- source_diag.Error(android::DiagMessage() << "not enough data for PNG signature");
+ diag->Error(android::DiagMessage() << "not enough data for PNG signature");
}
return {};
}
if (buffer_size < kPngSignatureSize || png_sig_cmp(signature, 0, kPngSignatureSize) != 0) {
- source_diag.Error(android::DiagMessage() << "file signature does not match PNG signature");
+ diag->Error(android::DiagMessage() << "file signature does not match PNG signature");
return {};
}
@@ -176,14 +169,14 @@
// version of libpng.
png_structp read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (read_ptr == nullptr) {
- source_diag.Error(android::DiagMessage() << "failed to create libpng read png_struct");
+ diag->Error(android::DiagMessage() << "failed to create libpng read png_struct");
return {};
}
// Create and initialize the memory for image header and data.
png_infop info_ptr = png_create_info_struct(read_ptr);
if (info_ptr == nullptr) {
- source_diag.Error(android::DiagMessage() << "failed to create libpng read png_info");
+ diag->Error(android::DiagMessage() << "failed to create libpng read png_info");
png_destroy_read_struct(&read_ptr, nullptr, nullptr);
return {};
}
@@ -199,7 +192,7 @@
}
// Handle warnings ourselves via IDiagnostics.
- png_set_error_fn(read_ptr, (png_voidp)&source_diag, LogError, LogWarning);
+ png_set_error_fn(read_ptr, (png_voidp)&diag, LogError, LogWarning);
// Set up the read functions which read from our custom data sources.
png_set_read_fn(read_ptr, (png_voidp)in, ReadDataFromStream);
@@ -213,8 +206,8 @@
// Extract image meta-data from the various chunk headers.
uint32_t width, height;
int bit_depth, color_type, interlace_method, compression_method, filter_method;
- png_get_IHDR(read_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
- &interlace_method, &compression_method, &filter_method);
+ png_get_IHDR(read_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_method,
+ &compression_method, &filter_method);
// When the image is read, expand it so that it is in RGBA 8888 format
// so that image handling is uniform.
@@ -239,8 +232,7 @@
png_set_add_alpha(read_ptr, 0xFF, PNG_FILLER_AFTER);
}
- if (color_type == PNG_COLOR_TYPE_GRAY ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
png_set_gray_to_rgb(read_ptr);
}
@@ -256,12 +248,12 @@
// something
// that can always be represented by 9-patch.
if (width > std::numeric_limits<int32_t>::max() || height > std::numeric_limits<int32_t>::max()) {
- source_diag.Error(android::DiagMessage()
- << "PNG image dimensions are too large: " << width << "x" << height);
+ diag->Error(android::DiagMessage()
+ << "PNG image dimensions are too large: " << width << "x" << height);
return {};
}
- std::unique_ptr<Image> output_image = util::make_unique<Image>();
+ std::unique_ptr<Image> output_image = std::make_unique<Image>();
output_image->width = static_cast<int32_t>(width);
output_image->height = static_cast<int32_t>(height);
@@ -272,7 +264,7 @@
output_image->data = std::unique_ptr<uint8_t[]>(new uint8_t[height * row_bytes]);
// Create an array of rows that index into the data block.
- output_image->rows = std::unique_ptr<uint8_t* []>(new uint8_t*[height]);
+ output_image->rows = std::unique_ptr<uint8_t*[]>(new uint8_t*[height]);
for (uint32_t h = 0; h < height; h++) {
output_image->rows[h] = output_image->data.get() + (h * row_bytes);
}
@@ -332,8 +324,7 @@
// This grayscale has alpha and can fit within a palette.
// See if it is worth fitting into a palette.
const size_t palette_threshold = palette_chunk_size + alpha_chunk_size +
- palette_data_chunk_size +
- kPaletteOverheadConstant;
+ palette_data_chunk_size + kPaletteOverheadConstant;
if (grayscale_alpha_data_chunk_size > palette_threshold) {
return PNG_COLOR_TYPE_PALETTE;
}
@@ -343,16 +334,14 @@
if (color_palette_size <= 256 && !has_nine_patch) {
// This image can fit inside a palette. Let's see if it is worth it.
- size_t total_size_with_palette =
- palette_data_chunk_size + palette_chunk_size;
+ size_t total_size_with_palette = palette_data_chunk_size + palette_chunk_size;
size_t total_size_without_palette = color_data_chunk_size;
if (alpha_palette_size > 0) {
total_size_with_palette += alpha_palette_size;
total_size_without_palette = color_alpha_data_chunk_size;
}
- if (total_size_without_palette >
- total_size_with_palette + kPaletteOverheadConstant) {
+ if (total_size_without_palette > total_size_with_palette + kPaletteOverheadConstant) {
return PNG_COLOR_TYPE_PALETTE;
}
}
@@ -482,26 +471,22 @@
png_set_unknown_chunks(write_ptr, write_info_ptr, unknown_chunks, index);
}
-bool WritePng(IAaptContext* context, const Image* image,
- const NinePatch* nine_patch, io::OutputStream* out,
- const PngOptions& options) {
- TRACE_CALL();
+bool WritePng(const Image* image, const NinePatch* nine_patch, OutputStream* out,
+ const PngOptions& options, IDiagnostics* diag, bool verbose) {
// Create and initialize the write png_struct with the default error and
// warning handlers.
// The header version is also passed in to ensure that this was built against the same
// version of libpng.
png_structp write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if (write_ptr == nullptr) {
- context->GetDiagnostics()->Error(android::DiagMessage()
- << "failed to create libpng write png_struct");
+ diag->Error(android::DiagMessage() << "failed to create libpng write png_struct");
return false;
}
// Allocate memory to store image header data.
png_infop write_info_ptr = png_create_info_struct(write_ptr);
if (write_info_ptr == nullptr) {
- context->GetDiagnostics()->Error(android::DiagMessage()
- << "failed to create libpng write png_info");
+ diag->Error(android::DiagMessage() << "failed to create libpng write png_info");
png_destroy_write_struct(&write_ptr, nullptr);
return false;
}
@@ -516,7 +501,7 @@
}
// Handle warnings with our IDiagnostics.
- png_set_error_fn(write_ptr, (png_voidp)context->GetDiagnostics(), LogError, LogWarning);
+ png_set_error_fn(write_ptr, (png_voidp)&diag, LogError, LogWarning);
// Set up the write functions which write to our custom data sources.
png_set_write_fn(write_ptr, (png_voidp)out, WriteDataToStream, nullptr);
@@ -578,22 +563,21 @@
}
}
- if (context->IsVerbose()) {
+ if (verbose) {
android::DiagMessage msg;
- msg << " paletteSize=" << color_palette.size()
- << " alphaPaletteSize=" << alpha_palette.size()
+ msg << " paletteSize=" << color_palette.size() << " alphaPaletteSize=" << alpha_palette.size()
<< " maxGrayDeviation=" << max_gray_deviation
<< " grayScale=" << (grayscale ? "true" : "false");
- context->GetDiagnostics()->Note(msg);
+ diag->Note(msg);
}
const bool convertible_to_grayscale = max_gray_deviation <= options.grayscale_tolerance;
- const int new_color_type = PickColorType(
- image->width, image->height, grayscale, convertible_to_grayscale,
- nine_patch != nullptr, color_palette.size(), alpha_palette.size());
+ const int new_color_type =
+ PickColorType(image->width, image->height, grayscale, convertible_to_grayscale,
+ nine_patch != nullptr, color_palette.size(), alpha_palette.size());
- if (context->IsVerbose()) {
+ if (verbose) {
android::DiagMessage msg;
msg << "encoding PNG ";
if (nine_patch) {
@@ -619,12 +603,11 @@
msg << "unknown type " << new_color_type;
break;
}
- context->GetDiagnostics()->Note(msg);
+ diag->Note(msg);
}
- png_set_IHDR(write_ptr, write_info_ptr, image->width, image->height, 8,
- new_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
- PNG_FILTER_TYPE_DEFAULT);
+ png_set_IHDR(write_ptr, write_info_ptr, image->width, image->height, 8, new_color_type,
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
if (new_color_type & PNG_COLOR_MASK_PALETTE) {
// Assigns indices to the palette, and writes the encoded palette to the
@@ -666,11 +649,9 @@
}
png_write_row(write_ptr, out_row.get());
}
- } else if (new_color_type == PNG_COLOR_TYPE_GRAY ||
- new_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
+ } else if (new_color_type == PNG_COLOR_TYPE_GRAY || new_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
const size_t bpp = new_color_type == PNG_COLOR_TYPE_GRAY ? 1 : 2;
- auto out_row =
- std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
+ auto out_row = std::unique_ptr<png_byte[]>(new png_byte[image->width * bpp]);
for (int32_t y = 0; y < image->height; y++) {
png_const_bytep in_row = image->rows[y];
@@ -691,8 +672,7 @@
// The image is convertible to grayscale, use linear-luminance of
// sRGB colorspace:
// https://en.wikipedia.org/wiki/Grayscale#Colorimetric_.28luminance-preserving.29_conversion_to_grayscale
- out_row[x * bpp] =
- (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
+ out_row[x * bpp] = (png_byte)(rr * 0.2126f + gg * 0.7152f + bb * 0.0722f);
}
if (bpp == 2) {
@@ -747,4 +727,4 @@
return true;
}
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/io/BigBufferStream.h b/libs/androidfw/include/androidfw/BigBufferStream.h
similarity index 74%
rename from tools/aapt2/io/BigBufferStream.h
rename to libs/androidfw/include/androidfw/BigBufferStream.h
index 63a5e57..e55fe0d 100644
--- a/tools/aapt2/io/BigBufferStream.h
+++ b/libs/androidfw/include/androidfw/BigBufferStream.h
@@ -14,18 +14,16 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_BIGBUFFERSTREAM_H
-#define AAPT_IO_BIGBUFFERSTREAM_H
+#pragma once
-#include "androidfw/BigBuffer.h"
-#include "io/Io.h"
+#include "BigBuffer.h"
+#include "Streams.h"
-namespace aapt {
-namespace io {
+namespace android {
class BigBufferInputStream : public KnownSizeInputStream {
public:
- inline explicit BigBufferInputStream(const android::BigBuffer* buffer)
+ inline explicit BigBufferInputStream(const BigBuffer* buffer)
: buffer_(buffer), iter_(buffer->begin()) {
}
virtual ~BigBufferInputStream() = default;
@@ -44,18 +42,20 @@
size_t TotalSize() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(BigBufferInputStream);
- const android::BigBuffer* buffer_;
- android::BigBuffer::const_iterator iter_;
+ const BigBuffer* buffer_;
+ BigBuffer::const_iterator iter_;
size_t offset_ = 0;
size_t bytes_read_ = 0;
};
class BigBufferOutputStream : public OutputStream {
public:
- inline explicit BigBufferOutputStream(android::BigBuffer* buffer) : buffer_(buffer) {
+ inline explicit BigBufferOutputStream(BigBuffer* buffer) : buffer_(buffer) {
}
virtual ~BigBufferOutputStream() = default;
@@ -70,10 +70,7 @@
private:
DISALLOW_COPY_AND_ASSIGN(BigBufferOutputStream);
- android::BigBuffer* buffer_;
+ BigBuffer* buffer_;
};
-} // namespace io
-} // namespace aapt
-
-#endif // AAPT_IO_BIGBUFFERSTREAM_H
+} // namespace android
\ No newline at end of file
diff --git a/tools/aapt2/io/FileStream.h b/libs/androidfw/include/androidfw/FileStream.h
similarity index 93%
rename from tools/aapt2/io/FileStream.h
rename to libs/androidfw/include/androidfw/FileStream.h
index 62d910f..fb84a91 100644
--- a/tools/aapt2/io/FileStream.h
+++ b/libs/androidfw/include/androidfw/FileStream.h
@@ -14,19 +14,16 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_FILESTREAM_H
-#define AAPT_IO_FILESTREAM_H
-
-#include "io/Io.h"
+#pragma once
#include <memory>
#include <string>
+#include "Streams.h"
#include "android-base/macros.h"
#include "android-base/unique_fd.h"
-namespace aapt {
-namespace io {
+namespace android {
constexpr size_t kDefaultBufferCapacity = 4096u;
@@ -48,6 +45,8 @@
std::string GetError() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(FileInputStream);
@@ -101,7 +100,4 @@
size_t total_byte_count_ = 0u;
};
-} // namespace io
-} // namespace aapt
-
-#endif // AAPT_IO_FILESTREAM_H
+} // namespace android
\ No newline at end of file
diff --git a/tools/aapt2/compile/Image.h b/libs/androidfw/include/androidfw/Image.h
similarity index 92%
rename from tools/aapt2/compile/Image.h
rename to libs/androidfw/include/androidfw/Image.h
index db0b945..c18c34c 100644
--- a/tools/aapt2/compile/Image.h
+++ b/libs/androidfw/include/androidfw/Image.h
@@ -14,8 +14,7 @@
* limitations under the License.
*/
-#ifndef AAPT_COMPILE_IMAGE_H
-#define AAPT_COMPILE_IMAGE_H
+#pragma once
#include <cstdint>
#include <memory>
@@ -24,7 +23,7 @@
#include "android-base/macros.h"
-namespace aapt {
+namespace android {
/**
* An in-memory image, loaded from disk, with pixels in RGBA_8888 format.
@@ -37,7 +36,7 @@
* A `height` sized array of pointers, where each element points to a
* `width` sized row of RGBA_8888 pixels.
*/
- std::unique_ptr<uint8_t* []> rows;
+ std::unique_ptr<uint8_t*[]> rows;
/**
* The width of the image in RGBA_8888 pixels. This is int32_t because of
@@ -72,7 +71,8 @@
int32_t end = 0;
explicit Range() = default;
- inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {}
+ inline explicit Range(int32_t s, int32_t e) : start(s), end(e) {
+ }
};
inline bool operator==(const Range& left, const Range& right) {
@@ -93,7 +93,8 @@
explicit Bounds() = default;
inline explicit Bounds(int32_t l, int32_t t, int32_t r, int32_t b)
- : left(l), top(t), right(r), bottom(b) {}
+ : left(l), top(t), right(r), bottom(b) {
+ }
bool nonZero() const;
};
@@ -103,8 +104,8 @@
}
inline bool operator==(const Bounds& left, const Bounds& right) {
- return left.left == right.left && left.top == right.top &&
- left.right == right.right && left.bottom == right.bottom;
+ return left.left == right.left && left.top == right.top && left.right == right.right &&
+ left.bottom == right.bottom;
}
/**
@@ -115,8 +116,7 @@
class NinePatch {
public:
static std::unique_ptr<NinePatch> Create(uint8_t** rows, const int32_t width,
- const int32_t height,
- std::string* err_out);
+ const int32_t height, std::string* err_out);
/**
* Packs the RGBA_8888 data pointed to by pixel into a uint32_t
@@ -204,6 +204,4 @@
::std::ostream& operator<<(::std::ostream& out, const Bounds& bounds);
::std::ostream& operator<<(::std::ostream& out, const NinePatch& nine_patch);
-} // namespace aapt
-
-#endif /* AAPT_COMPILE_IMAGE_H */
+} // namespace android
\ No newline at end of file
diff --git a/tools/aapt2/compile/Png.h b/libs/androidfw/include/androidfw/Png.h
similarity index 62%
rename from tools/aapt2/compile/Png.h
rename to libs/androidfw/include/androidfw/Png.h
index a8b7dd1..2ece43e 100644
--- a/tools/aapt2/compile/Png.h
+++ b/libs/androidfw/include/androidfw/Png.h
@@ -14,22 +14,18 @@
* limitations under the License.
*/
-#ifndef AAPT_PNG_H
-#define AAPT_PNG_H
+#pragma once
-#include <iostream>
#include <string>
+#include "BigBuffer.h"
+#include "IDiagnostics.h"
+#include "Image.h"
+#include "Source.h"
+#include "Streams.h"
#include "android-base/macros.h"
-#include "androidfw/BigBuffer.h"
-#include "androidfw/IDiagnostics.h"
-#include "androidfw/Source.h"
-#include "compile/Image.h"
-#include "io/Io.h"
-#include "process/IResourceTableConsumer.h"
-namespace aapt {
-
+namespace android {
// Size in bytes of the PNG signature.
constexpr size_t kPngSignatureSize = 8u;
@@ -42,32 +38,36 @@
*/
class Png {
public:
- explicit Png(android::IDiagnostics* diag) : mDiag(diag) {
+ explicit Png(IDiagnostics* diag) : mDiag(diag) {
}
- bool process(const android::Source& source, std::istream* input, android::BigBuffer* outBuffer,
+ bool process(const Source& source, std::istream* input, BigBuffer* outBuffer,
const PngOptions& options);
private:
DISALLOW_COPY_AND_ASSIGN(Png);
- android::IDiagnostics* mDiag;
+ IDiagnostics* mDiag;
};
/**
* An InputStream that filters out unimportant PNG chunks.
*/
-class PngChunkFilter : public io::InputStream {
+class PngChunkFilter : public InputStream {
public:
- explicit PngChunkFilter(android::StringPiece data);
+ explicit PngChunkFilter(StringPiece data);
virtual ~PngChunkFilter() = default;
bool Next(const void** buffer, size_t* len) override;
void BackUp(size_t count) override;
- bool CanRewind() const override { return true; }
+ bool CanRewind() const override {
+ return true;
+ }
bool Rewind() override;
- size_t ByteCount() const override { return window_start_; }
+ size_t ByteCount() const override {
+ return window_start_;
+ }
bool HadError() const override {
return !error_msg_.empty();
@@ -81,26 +81,20 @@
bool ConsumeWindow(const void** buffer, size_t* len);
- android::StringPiece data_;
+ StringPiece data_;
size_t window_start_ = 0;
size_t window_end_ = 0;
std::string error_msg_;
};
-
/**
* Reads a PNG from the InputStream into memory as an RGBA Image.
*/
-std::unique_ptr<Image> ReadPng(IAaptContext* context, const android::Source& source,
- io::InputStream* in);
+std::unique_ptr<Image> ReadPng(InputStream* in, IDiagnostics* diag);
/**
* Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream
* as a PNG.
*/
-bool WritePng(IAaptContext* context, const Image* image,
- const NinePatch* nine_patch, io::OutputStream* out,
- const PngOptions& options);
-
-} // namespace aapt
-
-#endif // AAPT_PNG_H
+bool WritePng(const Image* image, const NinePatch* nine_patch, OutputStream* out,
+ const PngOptions& options, IDiagnostics* diag, bool verbose);
+} // namespace android
\ No newline at end of file
diff --git a/tools/aapt2/io/Io.h b/libs/androidfw/include/androidfw/Streams.h
similarity index 86%
rename from tools/aapt2/io/Io.h
rename to libs/androidfw/include/androidfw/Streams.h
index e1df23a6..2daf0e2 100644
--- a/tools/aapt2/io/Io.h
+++ b/libs/androidfw/include/androidfw/Streams.h
@@ -14,13 +14,12 @@
* limitations under the License.
*/
-#ifndef AAPT_IO_IO_H
-#define AAPT_IO_IO_H
+#pragma once
#include <string>
+#include "android-base/off64_t.h"
-namespace aapt {
-namespace io {
+namespace android {
// InputStream interface that mimics protobuf's ZeroCopyInputStream,
// with added error handling methods to better report issues.
@@ -41,21 +40,34 @@
virtual void BackUp(size_t count) = 0;
// Returns true if this InputStream can rewind. If so, Rewind() can be called.
- virtual bool CanRewind() const { return false; };
+ virtual bool CanRewind() const {
+ return false;
+ };
// Rewinds the stream to the beginning so it can be read again.
// Returns true if the rewind succeeded.
// This does nothing if CanRewind() returns false.
- virtual bool Rewind() { return false; }
+ virtual bool Rewind() {
+ return false;
+ }
// Returns the number of bytes that have been read from the stream.
virtual size_t ByteCount() const = 0;
// Returns an error message if HadError() returned true.
- virtual std::string GetError() const { return {}; }
+ virtual std::string GetError() const {
+ return {};
+ }
// Returns true if an error occurred. Errors are permanent.
virtual bool HadError() const = 0;
+
+ virtual bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ (void)data;
+ (void)byte_count;
+ (void)offset;
+ return false;
+ }
};
// A sub-InputStream interface that knows the total size of its stream.
@@ -87,13 +99,12 @@
virtual size_t ByteCount() const = 0;
// Returns an error message if HadError() returned true.
- virtual std::string GetError() const { return {}; }
+ virtual std::string GetError() const {
+ return {};
+ }
// Returns true if an error occurred. Errors are permanent.
virtual bool HadError() const = 0;
};
-} // namespace io
-} // namespace aapt
-
-#endif /* AAPT_IO_IO_H */
+} // namespace android
\ No newline at end of file
diff --git a/tools/aapt2/io/FileStream_test.cpp b/libs/androidfw/tests/FileStream_test.cpp
similarity index 95%
rename from tools/aapt2/io/FileStream_test.cpp
rename to libs/androidfw/tests/FileStream_test.cpp
index cc9cd28..9785975 100644
--- a/tools/aapt2/io/FileStream_test.cpp
+++ b/libs/androidfw/tests/FileStream_test.cpp
@@ -14,20 +14,21 @@
* limitations under the License.
*/
-#include "io/FileStream.h"
+#include "androidfw/FileStream.h"
+#include "androidfw/StringPiece.h"
#include "android-base/file.h"
#include "android-base/macros.h"
-#include "test/Test.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
using ::android::StringPiece;
using ::testing::Eq;
using ::testing::NotNull;
using ::testing::StrEq;
-namespace aapt {
-namespace io {
+namespace android {
TEST(FileInputStreamTest, NextAndBackup) {
std::string input = "this is a cool string";
@@ -123,5 +124,4 @@
EXPECT_THAT(actual, StrEq(input));
}
-} // namespace io
-} // namespace aapt
+} // namespace android
diff --git a/tools/aapt2/compile/NinePatch_test.cpp b/libs/androidfw/tests/NinePatch_test.cpp
similarity index 69%
rename from tools/aapt2/compile/NinePatch_test.cpp
rename to libs/androidfw/tests/NinePatch_test.cpp
index f54bb2e..7ee8e9e 100644
--- a/tools/aapt2/compile/NinePatch_test.cpp
+++ b/libs/androidfw/tests/NinePatch_test.cpp
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-#include "compile/Image.h"
+#include "androidfw/Image.h"
+#include "androidfw/ResourceTypes.h"
+#include "gtest/gtest.h"
-#include "test/Test.h"
-
-namespace aapt {
+namespace android {
// Pixels are in RGBA_8888 packing.
@@ -33,16 +33,19 @@
#define TRANS "\x00\x00\x00\x00"
static uint8_t* k2x2[] = {
- (uint8_t*)WHITE WHITE, (uint8_t*)WHITE WHITE,
+ (uint8_t*)WHITE WHITE,
+ (uint8_t*)WHITE WHITE,
};
static uint8_t* kMixedNeutralColor3x3[] = {
- (uint8_t*)WHITE BLACK TRANS, (uint8_t*)TRANS RED TRANS,
+ (uint8_t*)WHITE BLACK TRANS,
+ (uint8_t*)TRANS RED TRANS,
(uint8_t*)WHITE WHITE WHITE,
};
static uint8_t* kTransparentNeutralColor3x3[] = {
- (uint8_t*)TRANS BLACK TRANS, (uint8_t*)BLACK RED BLACK,
+ (uint8_t*)TRANS BLACK TRANS,
+ (uint8_t*)BLACK RED BLACK,
(uint8_t*)TRANS BLACK TRANS,
};
@@ -66,55 +69,44 @@
};
static uint8_t* kPadding6x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE BLACK, (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE WHITE BLACK BLACK WHITE WHITE,
};
static uint8_t* kLayoutBoundsWrongEdge3x3[] = {
- (uint8_t*)WHITE RED WHITE, (uint8_t*)RED WHITE WHITE,
+ (uint8_t*)WHITE RED WHITE,
+ (uint8_t*)RED WHITE WHITE,
(uint8_t*)WHITE WHITE WHITE,
};
static uint8_t* kLayoutBoundsNotEdgeAligned5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE RED, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE WHITE RED WHITE WHITE,
};
static uint8_t* kLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
(uint8_t*)WHITE RED WHITE RED WHITE,
};
static uint8_t* kAsymmetricLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
(uint8_t*)WHITE RED WHITE WHITE WHITE,
};
static uint8_t* kPaddingAndLayoutBounds5x5[] = {
- (uint8_t*)WHITE WHITE WHITE WHITE WHITE,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
- (uint8_t*)WHITE WHITE WHITE WHITE BLACK,
- (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE, (uint8_t*)WHITE WHITE WHITE WHITE RED,
+ (uint8_t*)WHITE WHITE WHITE WHITE BLACK, (uint8_t*)WHITE WHITE WHITE WHITE RED,
(uint8_t*)WHITE RED BLACK RED WHITE,
};
static uint8_t* kColorfulImage5x5[] = {
- (uint8_t*)WHITE BLACK WHITE BLACK WHITE,
- (uint8_t*)BLACK RED BLUE GREEN WHITE,
- (uint8_t*)BLACK RED GREEN GREEN WHITE,
- (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
+ (uint8_t*)WHITE BLACK WHITE BLACK WHITE, (uint8_t*)BLACK RED BLUE GREEN WHITE,
+ (uint8_t*)BLACK RED GREEN GREEN WHITE, (uint8_t*)WHITE TRANS BLUE GREEN WHITE,
(uint8_t*)WHITE WHITE WHITE WHITE WHITE,
};
@@ -145,33 +137,21 @@
};
static uint8_t* kOutlineOffsetTranslucent12x10[] = {
- (uint8_t*)
- WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
- (uint8_t*)
- WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
- (uint8_t*)
- WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
+ (uint8_t*)WHITE WHITE WHITE BLACK BLACK BLACK BLACK BLACK BLACK BLACK BLACK WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS GR_20 GR_50 GR_70 GR_70 GR_50 GR_20 TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_50 GR_50 GR_50 GR_50 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS GR_20 GR_20 GR_20 GR_20 TRANS TRANS WHITE,
+ (uint8_t*)WHITE TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS TRANS WHITE,
+ (uint8_t*)WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE WHITE,
};
static uint8_t* kOutlineRadius5x5[] = {
- (uint8_t*)WHITE BLACK BLACK BLACK WHITE,
- (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
- (uint8_t*)BLACK GREEN GREEN GREEN WHITE,
- (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+ (uint8_t*)WHITE BLACK BLACK BLACK WHITE, (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
+ (uint8_t*)BLACK GREEN GREEN GREEN WHITE, (uint8_t*)BLACK TRANS GREEN TRANS WHITE,
(uint8_t*)WHITE WHITE WHITE WHITE WHITE,
};
@@ -195,14 +175,12 @@
TEST(NinePatchTest, TransparentNeutralColor) {
std::string err;
- EXPECT_NE(nullptr,
- NinePatch::Create(kTransparentNeutralColor3x3, 3, 3, &err));
+ EXPECT_NE(nullptr, NinePatch::Create(kTransparentNeutralColor3x3, 3, 3, &err));
}
TEST(NinePatchTest, SingleStretchRegion) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kSingleStretch7x6, 7, 6, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kSingleStretch7x6, 7, 6, &err);
ASSERT_NE(nullptr, nine_patch);
ASSERT_EQ(1u, nine_patch->horizontal_stretch_regions.size());
@@ -214,8 +192,7 @@
TEST(NinePatchTest, MultipleStretchRegions) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
ASSERT_NE(nullptr, nine_patch);
ASSERT_EQ(3u, nine_patch->horizontal_stretch_regions.size());
@@ -231,16 +208,14 @@
TEST(NinePatchTest, InferPaddingFromStretchRegions) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kMultipleStretch10x7, 10, 7, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 0, 1, 0), nine_patch->padding);
}
TEST(NinePatchTest, Padding) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kPadding6x5, 6, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kPadding6x5, 6, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->padding);
}
@@ -253,15 +228,13 @@
TEST(NinePatchTest, LayoutBoundsMustTouchEdges) {
std::string err;
- EXPECT_EQ(nullptr,
- NinePatch::Create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
+ EXPECT_EQ(nullptr, NinePatch::Create(kLayoutBoundsNotEdgeAligned5x5, 5, 5, &err));
EXPECT_FALSE(err.empty());
}
TEST(NinePatchTest, LayoutBounds) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kLayoutBounds5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kLayoutBounds5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->layout_bounds);
@@ -272,8 +245,7 @@
TEST(NinePatchTest, PaddingAndLayoutBounds) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kPaddingAndLayoutBounds5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->padding);
EXPECT_EQ(Bounds(1, 1, 1, 1), nine_patch->layout_bounds);
@@ -281,25 +253,20 @@
TEST(NinePatchTest, RegionColorsAreCorrect) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kColorfulImage5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kColorfulImage5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
std::vector<uint32_t> expected_colors = {
- NinePatch::PackRGBA((uint8_t*)RED),
- (uint32_t)android::Res_png_9patch::NO_COLOR,
- NinePatch::PackRGBA((uint8_t*)GREEN),
- (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
- NinePatch::PackRGBA((uint8_t*)BLUE),
- NinePatch::PackRGBA((uint8_t*)GREEN),
+ NinePatch::PackRGBA((uint8_t*)RED), (uint32_t)android::Res_png_9patch::NO_COLOR,
+ NinePatch::PackRGBA((uint8_t*)GREEN), (uint32_t)android::Res_png_9patch::TRANSPARENT_COLOR,
+ NinePatch::PackRGBA((uint8_t*)BLUE), NinePatch::PackRGBA((uint8_t*)GREEN),
};
EXPECT_EQ(expected_colors, nine_patch->region_colors);
}
TEST(NinePatchTest, OutlineFromOpaqueImage) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineOpaque10x10, 10, 10, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineOpaque10x10, 10, 10, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(2, 2, 2, 2), nine_patch->outline);
EXPECT_EQ(0x000000ffu, nine_patch->outline_alpha);
@@ -308,8 +275,7 @@
TEST(NinePatchTest, OutlineFromTranslucentImage) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineTranslucent10x10, 10, 10, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineTranslucent10x10, 10, 10, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(3, 3, 3, 3), nine_patch->outline);
EXPECT_EQ(0x000000b3u, nine_patch->outline_alpha);
@@ -337,8 +303,7 @@
TEST(NinePatchTest, OutlineRadius) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kOutlineRadius5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kOutlineRadius5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
EXPECT_EQ(Bounds(0, 0, 0, 0), nine_patch->outline);
EXPECT_EQ(3.4142f, nine_patch->outline_radius);
@@ -353,8 +318,7 @@
TEST(NinePatchTest, SerializePngEndianness) {
std::string err;
- std::unique_ptr<NinePatch> nine_patch =
- NinePatch::Create(kStretchAndPadding5x5, 5, 5, &err);
+ std::unique_ptr<NinePatch> nine_patch = NinePatch::Create(kStretchAndPadding5x5, 5, 5, &err);
ASSERT_NE(nullptr, nine_patch);
size_t len;
@@ -374,4 +338,4 @@
EXPECT_TRUE(BigEndianOne(cursor + 12));
}
-} // namespace aapt
+} // namespace android
diff --git a/libs/hwui/Mesh.cpp b/libs/hwui/Mesh.cpp
index e59bc95..37a7d74 100644
--- a/libs/hwui/Mesh.cpp
+++ b/libs/hwui/Mesh.cpp
@@ -90,8 +90,8 @@
FAIL_MESH_VALIDATE("%s mode requires at least %zu vertices but vertex count is %zu.",
modeToStr(meshMode), min_vcount_for_mode(meshMode), mVertexCount);
}
- SkASSERT(!fICount);
- SkASSERT(!fIOffset);
+ LOG_ALWAYS_FATAL_IF(mIndexCount != 0);
+ LOG_ALWAYS_FATAL_IF(mIndexOffset != 0);
}
if (!sm.ok()) {
diff --git a/libs/hwui/jni/YuvToJpegEncoder.cpp b/libs/hwui/jni/YuvToJpegEncoder.cpp
index c55066a..0275e4f 100644
--- a/libs/hwui/jni/YuvToJpegEncoder.cpp
+++ b/libs/hwui/jni/YuvToJpegEncoder.cpp
@@ -2,6 +2,7 @@
#include "SkStream.h"
#include "YuvToJpegEncoder.h"
#include <ui/PixelFormat.h>
+#include <utils/Errors.h>
#include <hardware/hardware.h>
#include "graphics_jni_helpers.h"
@@ -295,7 +296,7 @@
}
///////////////////////////////////////////////////////////////////////////////
-using namespace android::ultrahdr;
+using namespace ultrahdr;
ultrahdr_color_gamut P010Yuv420ToJpegREncoder::findColorGamut(JNIEnv* env, int aDataSpace) {
switch (aDataSpace & ADataSpace::STANDARD_MASK) {
diff --git a/libs/hwui/jni/YuvToJpegEncoder.h b/libs/hwui/jni/YuvToJpegEncoder.h
index a3a3224..629f1e6 100644
--- a/libs/hwui/jni/YuvToJpegEncoder.h
+++ b/libs/hwui/jni/YuvToJpegEncoder.h
@@ -108,7 +108,7 @@
* @param aDataSpace data space defined in data_space.h.
* @return color gamut for JPEG/R.
*/
- static android::ultrahdr::ultrahdr_color_gamut findColorGamut(JNIEnv* env, int aDataSpace);
+ static ultrahdr::ultrahdr_color_gamut findColorGamut(JNIEnv* env, int aDataSpace);
/** Map data space (defined in DataSpace.java and data_space.h) to the transfer function
* used in JPEG/R
@@ -117,8 +117,8 @@
* @param aDataSpace data space defined in data_space.h.
* @return color gamut for JPEG/R.
*/
- static android::ultrahdr::ultrahdr_transfer_function findHdrTransferFunction(
- JNIEnv* env, int aDataSpace);
+ static ultrahdr::ultrahdr_transfer_function findHdrTransferFunction(JNIEnv* env,
+ int aDataSpace);
};
#endif // _ANDROID_GRAPHICS_YUV_TO_JPEG_ENCODER_H_
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 12cb69d..d747489 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -105,7 +105,7 @@
ProfileType::None != Properties::getProfileType())) {
SkCanvas* profileCanvas = backBuffer->getCanvas();
SkAutoCanvasRestore saver(profileCanvas, true);
- profileCanvas->concat(mVkSurface->getCurrentPreTransform());
+ profileCanvas->concat(preTransform);
SkiaProfileRenderer profileRenderer(profileCanvas, frame.width(), frame.height());
profiler->draw(profileRenderer);
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index bf9419fe..4be282b 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -29,6 +29,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.IntArray;
import android.util.Log;
import android.util.SparseIntArray;
import android.util.proto.ProtoOutputStream;
@@ -330,7 +331,7 @@
* @hide
* Array of all usage types exposed in the SDK that applications can use.
*/
- public final static int[] SDK_USAGES = {
+ public static final IntArray SDK_USAGES = IntArray.wrap(new int[] {
USAGE_UNKNOWN,
USAGE_MEDIA,
USAGE_VOICE_COMMUNICATION,
@@ -347,14 +348,14 @@
USAGE_ASSISTANCE_SONIFICATION,
USAGE_GAME,
USAGE_ASSISTANT,
- };
+ });
/**
* @hide
*/
@TestApi
public static int[] getSdkUsages() {
- return SDK_USAGES;
+ return SDK_USAGES.toArray();
}
/**
@@ -567,6 +568,15 @@
private String mFormattedTags;
private Bundle mBundle; // lazy-initialized, may be null
+ /** Array of all content types exposed in the SDK that applications can use */
+ private static final IntArray CONTENT_TYPES = IntArray.wrap(new int[]{
+ CONTENT_TYPE_UNKNOWN,
+ CONTENT_TYPE_SPEECH,
+ CONTENT_TYPE_MUSIC,
+ CONTENT_TYPE_MOVIE,
+ CONTENT_TYPE_SONIFICATION,
+ });
+
private AudioAttributes() {
}
@@ -1669,6 +1679,27 @@
}
/**
+ * Query if the usage is a valid sdk usage
+ *
+ * @param usage one of {@link AttributeSdkUsage}
+ * @return {@code true} if the usage is valid for sdk or {@code false} otherwise
+ * @hide
+ */
+ public static boolean isSdkUsage(@AttributeSdkUsage int usage) {
+ return SDK_USAGES.contains(usage);
+ }
+
+ /**
+ * Query if the content type is a valid sdk content type
+ * @param contentType one of {@link AttributeContentType}
+ * @return {@code true} if the content type is valid for sdk or {@code false} otherwise
+ * @hide
+ */
+ public static boolean isSdkContentType(@AttributeContentType int contentType) {
+ return CONTENT_TYPES.contains(contentType);
+ }
+
+ /**
* Returns the stream type matching this {@code AudioAttributes} instance for volume control.
* Use this method to derive the stream type needed to configure the volume
* control slider in an {@link android.app.Activity} with
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 367b38a..9ffd644 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -318,11 +318,12 @@
/**
* @hide
- * Convert a Bluetooth codec to an audio format enum
+ * Convert an A2DP Bluetooth codec to an audio format enum
* @param btCodec the codec to convert.
* @return the audio format, or {@link #AUDIO_FORMAT_DEFAULT} if unknown
*/
- public static @AudioFormatNativeEnumForBtCodec int bluetoothCodecToAudioFormat(int btCodec) {
+ public static @AudioFormatNativeEnumForBtCodec int bluetoothA2dpCodecToAudioFormat(
+ int btCodec) {
switch (btCodec) {
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC:
return AudioSystem.AUDIO_FORMAT_SBC;
@@ -339,7 +340,25 @@
case BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS:
return AudioSystem.AUDIO_FORMAT_OPUS;
default:
- Log.e(TAG, "Unknown BT codec 0x" + Integer.toHexString(btCodec)
+ Log.e(TAG, "Unknown A2DP BT codec 0x" + Integer.toHexString(btCodec)
+ + " for conversion to audio format");
+ // TODO returning DEFAULT is the current behavior, should this return INVALID?
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ }
+
+ /**
+ * @hide
+ * Convert a LE Audio Bluetooth codec to an audio format enum
+ * @param btCodec the codec to convert.
+ * @return the audio format, or {@link #AUDIO_FORMAT_DEFAULT} if unknown
+ */
+ public static @AudioFormatNativeEnumForBtCodec int bluetoothLeCodecToAudioFormat(int btCodec) {
+ switch (btCodec) {
+ case BluetoothLeAudioCodecConfig.SOURCE_CODEC_TYPE_LC3:
+ return AudioSystem.AUDIO_FORMAT_LC3;
+ default:
+ Log.e(TAG, "Unknown LE Audio BT codec 0x" + Integer.toHexString(btCodec)
+ " for conversion to audio format");
// TODO returning DEFAULT is the current behavior, should this return INVALID?
return AudioSystem.AUDIO_FORMAT_DEFAULT;
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/media/java/android/media/FadeManagerConfiguration.aidl
similarity index 77%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to media/java/android/media/FadeManagerConfiguration.aidl
index f4feee1..ceb4ded 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/media/java/android/media/FadeManagerConfiguration.aidl
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package android.media;
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+/**
+ * Class to encapsulate fade configurations.
+ * @hide
+ */
+parcelable FadeManagerConfiguration;
diff --git a/media/java/android/media/FadeManagerConfiguration.java b/media/java/android/media/FadeManagerConfiguration.java
new file mode 100644
index 0000000..337d4b0
--- /dev/null
+++ b/media/java/android/media/FadeManagerConfiguration.java
@@ -0,0 +1,1684 @@
+/*
+ * 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;
+
+import static com.android.media.flags.Flags.FLAG_ENABLE_FADE_MANAGER_CONFIGURATION;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.ArrayMap;
+import android.util.IntArray;
+import android.util.SparseArray;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Class to encapsulate fade configurations.
+ *
+ * <p>Configurations are provided through:
+ * <ul>
+ * <li>Fadeable list: a positive list of fadeable type - usage</li>
+ * <li>Unfadeable lists: negative list of unfadeable types - content type, uid, audio attributes
+ * </li>
+ * <li>Volume shaper configs: fade in and fade out configs per usage or audio attributes
+ * </li>
+ * </ul>
+ *
+ * <p>Fade manager configuration can be created in one of the following ways:
+ * <ul>
+ * <li>Disabled fades:
+ * <pre class="prettyprint">
+ * new FadeManagerConfiguration.Builder()
+ * .setFadeState(FADE_STATE_DISABLED).build()
+ * </pre>
+ * Can be used to disable fading</li>
+ * <li>Default configurations including default fade duration:
+ * <pre class="prettyprint">
+ * new FadeManagerConfiguration.Builder()
+ * .setFadeState(FADE_STATE_ENABLED_DEFAULT).build()
+ * </pre>
+ * Can be used to enable default fading configurations</li>
+ * <li>Default configurations with custom fade duration:
+ * <pre class="prettyprint">
+ * new FadeManagerConfiguration.Builder(fade out duration, fade in duration)
+ * .setFadeState(FADE_STATE_ENABLED_DEFAULT).build()
+ * </pre>
+ * Can be used to enable default fadeability lists with configurable fade in and out duration
+ * </li>
+ * <li>Custom configurations and fade volume shapers:
+ * <pre class="prettyprint">
+ * new FadeManagerConfiguration.Builder(fade out duration, fade in duration)
+ * .setFadeState(FADE_STATE_ENABLED_DEFAULT)
+ * .setFadeableUsages(list of usages)
+ * .setUnfadeableContentTypes(list of content types)
+ * .setUnfadeableUids(list of uids)
+ * .setUnfadeableAudioAttributes(list of audio attributes)
+ * .setFadeOutVolumeShaperConfigForAudioAttributes(attributes, volume shaper config)
+ * .setFadeInDurationForUsaeg(usage, duration)
+ * ....
+ * .build() </pre>
+ * Achieves full customization of fadeability lists and configurations</li>
+ * <li>Also provides a copy constructor from another instance of fade manager configuration
+ * <pre class="prettyprint">
+ * new FadeManagerConfiguration.Builder(fadeManagerConfiguration)
+ * .addFadeableUsage(new usage)
+ * ....
+ * .build()</pre>
+ * Helps with recreating a new instance from another to simply change/add on top of the
+ * existing ones</li>
+ * </ul>
+ * TODO(b/304835727): Convert into system API so that it can be set through AudioPolicy
+ *
+ * @hide
+ */
+
+@FlaggedApi(FLAG_ENABLE_FADE_MANAGER_CONFIGURATION)
+public final class FadeManagerConfiguration implements Parcelable {
+
+ public static final String TAG = "FadeManagerConfiguration";
+
+ /**
+ * Defines the disabled fade state. No player will be faded in this state.
+ */
+ public static final int FADE_STATE_DISABLED = 0;
+
+ /**
+ * Defines the enabled fade state with default configurations
+ */
+ public static final int FADE_STATE_ENABLED_DEFAULT = 1;
+
+ /**
+ * Defines the enabled state with Automotive specific configurations
+ */
+ public static final int FADE_STATE_ENABLED_AUTO = 2;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = false, prefix = "FADE_STATE", value = {
+ FADE_STATE_DISABLED,
+ FADE_STATE_ENABLED_DEFAULT,
+ FADE_STATE_ENABLED_AUTO,
+ })
+ public @interface FadeStateEnum {}
+
+ /**
+ * Defines ID to be used in volume shaper for fading
+ */
+ public static final int VOLUME_SHAPER_SYSTEM_FADE_ID = 2;
+
+ /**
+ * Used to reset duration or return duration when not set
+ *
+ * @see Builder#setFadeOutDurationForUsage(int, long)
+ * @see Builder#setFadeInDurationForUsage(int, long)
+ * @see Builder#setFadeOutDurationForAudioAttributes(AudioAttributes, long)
+ * @see Builder#setFadeInDurationForAudioAttributes(AudioAttributes, long)
+ * @see #getFadeOutDurationForUsage(int)
+ * @see #getFadeInDurationForUsage(int)
+ * @see #getFadeOutDurationForAudioAttributes(AudioAttributes)
+ * @see #getFadeInDurationForAudioAttributes(AudioAttributes)
+ */
+ public static final long DURATION_NOT_SET = 0;
+ /** Map of Usage to Fade volume shaper configs wrapper */
+ private final SparseArray<FadeVolumeShaperConfigsWrapper> mUsageToFadeWrapperMap;
+ /** Map of AudioAttributes to Fade volume shaper configs wrapper */
+ private final ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper> mAttrToFadeWrapperMap;
+ /** list of fadeable usages */
+ private final @NonNull IntArray mFadeableUsages;
+ /** list of unfadeable content types */
+ private final @NonNull IntArray mUnfadeableContentTypes;
+ /** list of unfadeable player types */
+ private final @NonNull IntArray mUnfadeablePlayerTypes;
+ /** list of unfadeable uid(s) */
+ private final @NonNull IntArray mUnfadeableUids;
+ /** list of unfadeable AudioAttributes */
+ private final @NonNull List<AudioAttributes> mUnfadeableAudioAttributes;
+ /** fade state */
+ private final @FadeStateEnum int mFadeState;
+ /** fade out duration from builder - used for creating default fade out volume shaper */
+ private final long mFadeOutDurationMillis;
+ /** fade in duration from builder - used for creating default fade in volume shaper */
+ private final long mFadeInDurationMillis;
+ /** delay after which the offending players are faded back in */
+ private final long mFadeInDelayForOffendersMillis;
+
+ private FadeManagerConfiguration(int fadeState, long fadeOutDurationMillis,
+ long fadeInDurationMillis, long offendersFadeInDelayMillis,
+ @NonNull SparseArray<FadeVolumeShaperConfigsWrapper> usageToFadeWrapperMap,
+ @NonNull ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper> attrToFadeWrapperMap,
+ @NonNull IntArray fadeableUsages, @NonNull IntArray unfadeableContentTypes,
+ @NonNull IntArray unfadeablePlayerTypes, @NonNull IntArray unfadeableUids,
+ @NonNull List<AudioAttributes> unfadeableAudioAttributes) {
+ mFadeState = fadeState;
+ mFadeOutDurationMillis = fadeOutDurationMillis;
+ mFadeInDurationMillis = fadeInDurationMillis;
+ mFadeInDelayForOffendersMillis = offendersFadeInDelayMillis;
+ mUsageToFadeWrapperMap = Objects.requireNonNull(usageToFadeWrapperMap,
+ "Usage to fade wrapper map cannot be null");
+ mAttrToFadeWrapperMap = Objects.requireNonNull(attrToFadeWrapperMap,
+ "Attribute to fade wrapper map cannot be null");
+ mFadeableUsages = Objects.requireNonNull(fadeableUsages,
+ "List of fadeable usages cannot be null");
+ mUnfadeableContentTypes = Objects.requireNonNull(unfadeableContentTypes,
+ "List of unfadeable content types cannot be null");
+ mUnfadeablePlayerTypes = Objects.requireNonNull(unfadeablePlayerTypes,
+ "List of unfadeable player types cannot be null");
+ mUnfadeableUids = Objects.requireNonNull(unfadeableUids,
+ "List of unfadeable uids cannot be null");
+ mUnfadeableAudioAttributes = Objects.requireNonNull(unfadeableAudioAttributes,
+ "List of unfadeable audio attributes cannot be null");
+ }
+
+ /**
+ * Get the fade state
+ *
+ * @return one of the {@link FadeStateEnum} state
+ */
+ @FadeStateEnum
+ public int getFadeState() {
+ return mFadeState;
+ }
+
+ /**
+ * Get the list of usages that can be faded
+ *
+ * @return list of {@link android.media.AudioAttributes.AttributeUsage} that shall be faded
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @NonNull
+ public List<Integer> getFadeableUsages() {
+ ensureFadingIsEnabled();
+ return convertIntArrayToIntegerList(mFadeableUsages);
+ }
+
+ /**
+ * Get the list of {@link android.media.AudioPlaybackConfiguration.PlayerType player types}
+ * that cannot be faded
+ *
+ * @return list of {@link android.media.AudioPlaybackConfiguration.PlayerType}
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @NonNull
+ public List<Integer> getUnfadeablePlayerTypes() {
+ ensureFadingIsEnabled();
+ return convertIntArrayToIntegerList(mUnfadeablePlayerTypes);
+ }
+
+ /**
+ * Get the list of {@link android.media.AudioAttributes.AttributeContentType content types}
+ * that cannot be faded
+ *
+ * @return list of {@link android.media.AudioAttributes.AttributeContentType}
+ * @throws IllegalStateExceptionif if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @NonNull
+ public List<Integer> getUnfadeableContentTypes() {
+ ensureFadingIsEnabled();
+ return convertIntArrayToIntegerList(mUnfadeableContentTypes);
+ }
+
+ /**
+ * Get the list of uids that cannot be faded
+ *
+ * @return list of uids that shall not be faded
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @NonNull
+ public List<Integer> getUnfadeableUids() {
+ ensureFadingIsEnabled();
+ return convertIntArrayToIntegerList(mUnfadeableUids);
+ }
+
+ /**
+ * Get the list of {@link android.media.AudioAttributes} that cannot be faded
+ *
+ * @return list of {@link android.media.AudioAttributes} that shall not be faded
+ * @throws IllegalStateException if fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @NonNull
+ public List<AudioAttributes> getUnfadeableAudioAttributes() {
+ ensureFadingIsEnabled();
+ return mUnfadeableAudioAttributes;
+ }
+
+ /**
+ * Get the duration used to fade out players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return duration in milliseconds if set for the usage or {@link #DURATION_NOT_SET} otherwise
+ * @throws IllegalArgumentException if the usage is invalid
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ public long getFadeOutDurationForUsage(int usage) {
+ ensureFadingIsEnabled();
+ validateUsage(usage);
+ return getDurationForVolumeShaperConfig(getVolumeShaperConfigFromWrapper(
+ mUsageToFadeWrapperMap.get(usage), /* isFadeIn= */ false));
+ }
+
+ /**
+ * Get the duration used to fade in players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return duration in milliseconds if set for the usage or {@link #DURATION_NOT_SET} otherwise
+ * @throws IllegalArgumentException if the usage is invalid
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ public long getFadeInDurationForUsage(int usage) {
+ ensureFadingIsEnabled();
+ validateUsage(usage);
+ return getDurationForVolumeShaperConfig(getVolumeShaperConfigFromWrapper(
+ mUsageToFadeWrapperMap.get(usage), /* isFadeIn= */ true));
+ }
+
+ /**
+ * Get the {@link android.media.VolumeShaper.Configuration} used to fade out players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return {@link android.media.VolumeShaper.Configuration} if set for the usage or
+ * {@code null} otherwise
+ * @throws IllegalArgumentException if the usage is invalid
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeOutVolumeShaperConfigForUsage(int usage) {
+ ensureFadingIsEnabled();
+ validateUsage(usage);
+ return getVolumeShaperConfigFromWrapper(mUsageToFadeWrapperMap.get(usage),
+ /* isFadeIn= */ false);
+ }
+
+ /**
+ * Get the {@link android.media.VolumeShaper.Configuration} used to fade in players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage} of player
+ * @return {@link android.media.VolumeShaper.Configuration} if set for the usage or
+ * {@code null} otherwise
+ * @throws IllegalArgumentException if the usage is invalid
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeInVolumeShaperConfigForUsage(int usage) {
+ ensureFadingIsEnabled();
+ validateUsage(usage);
+ return getVolumeShaperConfigFromWrapper(mUsageToFadeWrapperMap.get(usage),
+ /* isFadeIn= */ true);
+ }
+
+ /**
+ * Get the duration used to fade out players with {@link android.media.AudioAttributes}
+ *
+ * @param audioAttributes {@link android.media.AudioAttributes}
+ * @return duration in milliseconds if set for the audio attributes or
+ * {@link #DURATION_NOT_SET} otherwise
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ public long getFadeOutDurationForAudioAttributes(@NonNull AudioAttributes audioAttributes) {
+ ensureFadingIsEnabled();
+ return getDurationForVolumeShaperConfig(getVolumeShaperConfigFromWrapper(
+ mAttrToFadeWrapperMap.get(audioAttributes), /* isFadeIn= */ false));
+ }
+
+ /**
+ * Get the duration used to fade-in players with {@link android.media.AudioAttributes}
+ *
+ * @param audioAttributes {@link android.media.AudioAttributes}
+ * @return duration in milliseconds if set for the audio attributes or
+ * {@link #DURATION_NOT_SET} otherwise
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ public long getFadeInDurationForAudioAttributes(@NonNull AudioAttributes audioAttributes) {
+ ensureFadingIsEnabled();
+ return getDurationForVolumeShaperConfig(getVolumeShaperConfigFromWrapper(
+ mAttrToFadeWrapperMap.get(audioAttributes), /* isFadeIn= */ true));
+ }
+
+ /**
+ * Get the {@link android.media.VolumeShaper.Configuration} used to fade out players with
+ * {@link android.media.AudioAttributes}
+ *
+ * @param audioAttributes {@link android.media.AudioAttributes}
+ * @return {@link android.media.VolumeShaper.Configuration} if set for the audio attribute or
+ * {@code null} otherwise
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeOutVolumeShaperConfigForAudioAttributes(
+ @NonNull AudioAttributes audioAttributes) {
+ Objects.requireNonNull(audioAttributes, "Audio attributes cannot be null");
+ ensureFadingIsEnabled();
+ return getVolumeShaperConfigFromWrapper(mAttrToFadeWrapperMap.get(audioAttributes),
+ /* isFadeIn= */ false);
+ }
+
+ /**
+ * Get the {@link android.media.VolumeShaper.Configuration} used to fade out players with
+ * {@link android.media.AudioAttributes}
+ *
+ * @param audioAttributes {@link android.media.AudioAttributes}
+ * @return {@link android.media.VolumeShaper.Configuration} used for fading in if set for the
+ * audio attribute or {@code null} otherwise
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @throws IllegalStateException if the fade state is set to {@link #FADE_STATE_DISABLED}
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeInVolumeShaperConfigForAudioAttributes(
+ @NonNull AudioAttributes audioAttributes) {
+ Objects.requireNonNull(audioAttributes, "Audio attributes cannot be null");
+ ensureFadingIsEnabled();
+ return getVolumeShaperConfigFromWrapper(mAttrToFadeWrapperMap.get(audioAttributes),
+ /* isFadeIn= */ true);
+ }
+
+ /**
+ * Get the list of {@link android.media.AudioAttributes} for whome the volume shaper
+ * configurations are defined
+ *
+ * @return list of {@link android.media.AudioAttributes} with valid volume shaper configs or
+ * empty list if none set.
+ */
+ @NonNull
+ public List<AudioAttributes> getAudioAttributesWithVolumeShaperConfigs() {
+ return getAudioAttributesInternal();
+ }
+
+ /**
+ * Get the delay after which the offending players are faded back in
+ *
+ * @return delay in milliseconds
+ */
+ public long getFadeInDelayForOffenders() {
+ return mFadeInDelayForOffendersMillis;
+ }
+
+ /**
+ * Query if fade is enabled
+ *
+ * @return {@code true} if fading is enabled, {@code false} otherwise
+ */
+ public boolean isFadeEnabled() {
+ return mFadeState != FADE_STATE_DISABLED;
+ }
+
+ /**
+ * Query if the usage is fadeable
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return {@code true} if usage is fadeable, {@code false} otherwise
+ */
+ public boolean isUsageFadeable(@AudioAttributes.AttributeUsage int usage) {
+ if (!isFadeEnabled()) {
+ return false;
+ }
+ return mFadeableUsages.contains(usage);
+ }
+
+ /**
+ * Query if the content type is unfadeable
+ *
+ * @param contentType the {@link android.media.AudioAttributes.AttributeContentType}
+ * @return {@code true} if content type is unfadeable or if fade state is set to
+ * {@link #FADE_STATE_DISABLED}, {@code false} otherwise
+ */
+ public boolean isContentTypeUnfadeable(@AudioAttributes.AttributeContentType int contentType) {
+ if (!isFadeEnabled()) {
+ return true;
+ }
+ return mUnfadeableContentTypes.contains(contentType);
+ }
+
+ /**
+ * Query if the player type is unfadeable
+ *
+ * @param playerType the {@link android.media.AudioPlaybackConfiguration} player type
+ * @return {@code true} if player type is unfadeable or if fade state is set to
+ * {@link #FADE_STATE_DISABLED}, {@code false} otherwise
+ */
+ public boolean isPlayerTypeUnfadeable(int playerType) {
+ if (!isFadeEnabled()) {
+ return true;
+ }
+ return mUnfadeablePlayerTypes.contains(playerType);
+ }
+
+ /**
+ * Query if the audio attributes is unfadeable
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes}
+ * @return {@code true} if audio attributes is unfadeable or if fade state is set to
+ * {@link #FADE_STATE_DISABLED}, {@code false} otherwise
+ * @throws NullPointerException if the audio attributes is {@code null}
+ */
+ public boolean isAudioAttributesUnfadeable(@NonNull AudioAttributes audioAttributes) {
+ Objects.requireNonNull(audioAttributes, "Audio attributes cannot be null");
+ if (!isFadeEnabled()) {
+ return true;
+ }
+ return mUnfadeableAudioAttributes.contains(audioAttributes);
+ }
+
+ /**
+ * Query if the uid is unfadeable
+ *
+ * @param uid the uid of application
+ * @return {@code true} if uid is unfadeable or if fade state is set to
+ * {@link #FADE_STATE_DISABLED}, {@code false} otherwise
+ */
+ public boolean isUidUnfadeable(int uid) {
+ if (!isFadeEnabled()) {
+ return true;
+ }
+ return mUnfadeableUids.contains(uid);
+ }
+
+ @Override
+ public String toString() {
+ return "FadeManagerConfiguration { fade state = " + fadeStateToString(mFadeState)
+ + ", fade out duration = " + mFadeOutDurationMillis
+ + ", fade in duration = " + mFadeInDurationMillis
+ + ", offenders fade in delay = " + mFadeInDelayForOffendersMillis
+ + ", fade volume shapers for audio attributes = " + mAttrToFadeWrapperMap
+ + ", fadeable usages = " + mFadeableUsages.toString()
+ + ", unfadeable content types = " + mUnfadeableContentTypes.toString()
+ + ", unfadeable player types = " + mUnfadeablePlayerTypes.toString()
+ + ", unfadeable uids = " + mUnfadeableUids.toString()
+ + ", unfadeable audio attributes = " + mUnfadeableAudioAttributes + "}";
+ }
+
+ /**
+ * Convert fade state into a human-readable string
+ *
+ * @param fadeState one of the fade state in {@link FadeStateEnum}
+ * @return human-readable string
+ */
+ @NonNull
+ public static String fadeStateToString(@FadeStateEnum int fadeState) {
+ switch (fadeState) {
+ case FADE_STATE_DISABLED:
+ return "FADE_STATE_DISABLED";
+ case FADE_STATE_ENABLED_DEFAULT:
+ return "FADE_STATE_ENABLED_DEFAULT";
+ case FADE_STATE_ENABLED_AUTO:
+ return "FADE_STATE_ENABLED_AUTO";
+ default:
+ return "unknown fade state: " + fadeState;
+ }
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (!(o instanceof FadeManagerConfiguration)) {
+ return false;
+ }
+
+ FadeManagerConfiguration rhs = (FadeManagerConfiguration) o;
+
+ return mUsageToFadeWrapperMap.contentEquals(rhs.mUsageToFadeWrapperMap)
+ && mAttrToFadeWrapperMap.equals(rhs.mAttrToFadeWrapperMap)
+ && Arrays.equals(mFadeableUsages.toArray(), rhs.mFadeableUsages.toArray())
+ && Arrays.equals(mUnfadeableContentTypes.toArray(),
+ rhs.mUnfadeableContentTypes.toArray())
+ && Arrays.equals(mUnfadeablePlayerTypes.toArray(),
+ rhs.mUnfadeablePlayerTypes.toArray())
+ && Arrays.equals(mUnfadeableUids.toArray(), rhs.mUnfadeableUids.toArray())
+ && mUnfadeableAudioAttributes.equals(rhs.mUnfadeableAudioAttributes)
+ && mFadeState == rhs.mFadeState
+ && mFadeOutDurationMillis == rhs.mFadeOutDurationMillis
+ && mFadeInDurationMillis == rhs.mFadeInDurationMillis
+ && mFadeInDelayForOffendersMillis == rhs.mFadeInDelayForOffendersMillis;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mUsageToFadeWrapperMap, mAttrToFadeWrapperMap, mFadeableUsages,
+ mUnfadeableContentTypes, mUnfadeablePlayerTypes, mUnfadeableAudioAttributes,
+ mUnfadeableUids, mFadeState, mFadeOutDurationMillis, mFadeInDurationMillis,
+ mFadeInDelayForOffendersMillis);
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ dest.writeInt(mFadeState);
+ dest.writeLong(mFadeOutDurationMillis);
+ dest.writeLong(mFadeInDurationMillis);
+ dest.writeLong(mFadeInDelayForOffendersMillis);
+ dest.writeTypedSparseArray(mUsageToFadeWrapperMap, flags);
+ dest.writeMap(mAttrToFadeWrapperMap);
+ dest.writeIntArray(mFadeableUsages.toArray());
+ dest.writeIntArray(mUnfadeableContentTypes.toArray());
+ dest.writeIntArray(mUnfadeablePlayerTypes.toArray());
+ dest.writeIntArray(mUnfadeableUids.toArray());
+ dest.writeTypedList(mUnfadeableAudioAttributes, flags);
+ }
+
+ /**
+ * Creates fade manage configuration from parcel
+ *
+ * @hide
+ */
+ @VisibleForTesting()
+ FadeManagerConfiguration(Parcel in) {
+ int fadeState = in.readInt();
+ long fadeOutDurationMillis = in.readLong();
+ long fadeInDurationMillis = in.readLong();
+ long fadeInDelayForOffenders = in.readLong();
+ SparseArray<FadeVolumeShaperConfigsWrapper> usageToWrapperMap =
+ in.createTypedSparseArray(FadeVolumeShaperConfigsWrapper.CREATOR);
+ ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper> attrToFadeWrapperMap =
+ new ArrayMap<>();
+ in.readMap(attrToFadeWrapperMap, getClass().getClassLoader(), AudioAttributes.class,
+ FadeVolumeShaperConfigsWrapper.class);
+ int[] fadeableUsages = in.createIntArray();
+ int[] unfadeableContentTypes = in.createIntArray();
+ int[] unfadeablePlayerTypes = in.createIntArray();
+ int[] unfadeableUids = in.createIntArray();
+ List<AudioAttributes> unfadeableAudioAttributes = new ArrayList<>();
+ in.readTypedList(unfadeableAudioAttributes, AudioAttributes.CREATOR);
+
+ this.mFadeState = fadeState;
+ this.mFadeOutDurationMillis = fadeOutDurationMillis;
+ this.mFadeInDurationMillis = fadeInDurationMillis;
+ this.mFadeInDelayForOffendersMillis = fadeInDelayForOffenders;
+ this.mUsageToFadeWrapperMap = usageToWrapperMap;
+ this.mAttrToFadeWrapperMap = attrToFadeWrapperMap;
+ this.mFadeableUsages = IntArray.wrap(fadeableUsages);
+ this.mUnfadeableContentTypes = IntArray.wrap(unfadeableContentTypes);
+ this.mUnfadeablePlayerTypes = IntArray.wrap(unfadeablePlayerTypes);
+ this.mUnfadeableUids = IntArray.wrap(unfadeableUids);
+ this.mUnfadeableAudioAttributes = unfadeableAudioAttributes;
+ }
+
+ @NonNull
+ public static final Creator<FadeManagerConfiguration> CREATOR = new Creator<>() {
+ @Override
+ @NonNull
+ public FadeManagerConfiguration createFromParcel(@NonNull Parcel in) {
+ return new FadeManagerConfiguration(in);
+ }
+
+ @Override
+ @NonNull
+ public FadeManagerConfiguration[] newArray(int size) {
+ return new FadeManagerConfiguration[size];
+ }
+ };
+
+ private long getDurationForVolumeShaperConfig(VolumeShaper.Configuration config) {
+ return config != null ? config.getDuration() : DURATION_NOT_SET;
+ }
+
+ private VolumeShaper.Configuration getVolumeShaperConfigFromWrapper(
+ FadeVolumeShaperConfigsWrapper wrapper, boolean isFadeIn) {
+ // if no volume shaper config is available, return null
+ if (wrapper == null) {
+ return null;
+ }
+ if (isFadeIn) {
+ return wrapper.getFadeInVolShaperConfig();
+ }
+ return wrapper.getFadeOutVolShaperConfig();
+ }
+
+ private List<AudioAttributes> getAudioAttributesInternal() {
+ List<AudioAttributes> attrs = new ArrayList<>(mAttrToFadeWrapperMap.size());
+ for (int index = 0; index < mAttrToFadeWrapperMap.size(); index++) {
+ attrs.add(mAttrToFadeWrapperMap.keyAt(index));
+ }
+ return attrs;
+ }
+
+ private static boolean isUsageValid(int usage) {
+ return AudioAttributes.isSdkUsage(usage) || AudioAttributes.isSystemUsage(usage);
+ }
+
+ private void ensureFadingIsEnabled() {
+ if (!isFadeEnabled()) {
+ throw new IllegalStateException("Method call not allowed when fade is disabled");
+ }
+ }
+
+ private static void validateUsage(int usage) {
+ Preconditions.checkArgument(isUsageValid(usage), "Invalid usage: %s", usage);
+ }
+
+ private static IntArray convertIntegerListToIntArray(List<Integer> integerList) {
+ if (integerList == null) {
+ return new IntArray();
+ }
+
+ IntArray intArray = new IntArray(integerList.size());
+ for (int index = 0; index < integerList.size(); index++) {
+ intArray.add(integerList.get(index));
+ }
+ return intArray;
+ }
+
+ private static List<Integer> convertIntArrayToIntegerList(IntArray intArray) {
+ if (intArray == null) {
+ return new ArrayList<>();
+ }
+
+ ArrayList<Integer> integerArrayList = new ArrayList<>(intArray.size());
+ for (int index = 0; index < intArray.size(); index++) {
+ integerArrayList.add(intArray.get(index));
+ }
+ return integerArrayList;
+ }
+
+ /**
+ * Builder class for {@link FadeManagerConfiguration} objects.
+ *
+ * <p><b>Notes:</b>
+ * <ul>
+ * <li>When fade state is set to enabled, the builder expects at least one valid usage to be
+ * set/added. Failure to do so will result in an exception during {@link #build()}</li>
+ * <li>Every usage added to the fadeable list should have corresponding volume shaper
+ * configs defined. This can be achieved by setting either the duration or volume shaper
+ * config through {@link #setFadeOutDurationForUsage(int, long)} or
+ * {@link #setFadeOutVolumeShaperConfigForUsage(int, VolumeShaper.Configuration)}</li>
+ * <li> It is recommended to set volume shaper configurations individually for fade out and
+ * fade in</li>
+ * <li>For any incomplete volume shaper configs a volume shaper configuration will be
+ * created using either the default fade durations or the ones provided as part of the
+ * {@link #Builder(long, long)}</li>
+ * <li>Additional volume shaper configs can also configured for a given usage
+ * with additional attributes like content-type in order to achieve finer fade controls.
+ * See:
+ * {@link #setFadeOutVolumeShaperConfigForAudioAttributes(AudioAttributes,
+ * VolumeShaper.Configuration)} and
+ * {@link #setFadeInVolumeShaperConfigForAudioAttributes(AudioAttributes,
+ * VolumeShaper.Configuration)} </li>
+ * </ul>
+ *
+ */
+ @SuppressWarnings("WeakerAccess")
+ public static final class Builder {
+ private static final int INVALID_INDEX = -1;
+ private static final long IS_BUILDER_USED_FIELD_SET = 1 << 0;
+ private static final long IS_FADEABLE_USAGES_FIELD_SET = 1 << 1;
+ private static final long IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET = 1 << 2;
+
+ /** duration of the fade out curve */
+ private static final long DEFAULT_FADE_OUT_DURATION_MS = 2_000;
+ /** duration of the fade in curve */
+ private static final long DEFAULT_FADE_IN_DURATION_MS = 1_000;
+
+ /**
+ * delay after which a faded out player will be faded back in. This will be heard by the
+ * user only in the case of unmuting players that didn't respect audio focus and didn't
+ * stop/pause when their app lost focus.
+ * This is the amount of time between the app being notified of the focus loss
+ * (when its muted by the fade out), and the time fade in (to unmute) starts
+ */
+ private static final long DEFAULT_DELAY_FADE_IN_OFFENDERS_MS = 2_000;
+
+
+ private static final IntArray DEFAULT_UNFADEABLE_PLAYER_TYPES = IntArray.wrap(new int[]{
+ AudioPlaybackConfiguration.PLAYER_TYPE_AAUDIO,
+ AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL
+ });
+
+ private static final IntArray DEFAULT_UNFADEABLE_CONTENT_TYPES = IntArray.wrap(new int[]{
+ AudioAttributes.CONTENT_TYPE_SPEECH
+ });
+
+ private static final IntArray DEFAULT_FADEABLE_USAGES = IntArray.wrap(new int[]{
+ AudioAttributes.USAGE_GAME,
+ AudioAttributes.USAGE_MEDIA
+ });
+
+ private int mFadeState = FADE_STATE_ENABLED_DEFAULT;
+ private long mFadeInDelayForOffendersMillis = DEFAULT_DELAY_FADE_IN_OFFENDERS_MS;
+ private long mFadeOutDurationMillis;
+ private long mFadeInDurationMillis;
+ private long mBuilderFieldsSet;
+ private SparseArray<FadeVolumeShaperConfigsWrapper> mUsageToFadeWrapperMap =
+ new SparseArray<>();
+ private ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper> mAttrToFadeWrapperMap =
+ new ArrayMap<>();
+ private IntArray mFadeableUsages = new IntArray();
+ private IntArray mUnfadeableContentTypes = new IntArray();
+ // Player types are not yet configurable
+ private IntArray mUnfadeablePlayerTypes = DEFAULT_UNFADEABLE_PLAYER_TYPES;
+ private IntArray mUnfadeableUids = new IntArray();
+ private List<AudioAttributes> mUnfadeableAudioAttributes = new ArrayList<>();
+
+ /**
+ * Constructs a new Builder with default fade out and fade in durations
+ */
+ public Builder() {
+ mFadeOutDurationMillis = DEFAULT_FADE_OUT_DURATION_MS;
+ mFadeInDurationMillis = DEFAULT_FADE_IN_DURATION_MS;
+ }
+
+ /**
+ * Constructs a new Builder with the provided fade out and fade in durations
+ *
+ * @param fadeOutDurationMillis duration in milliseconds used for fading out
+ * @param fadeInDurationMills duration in milliseconds used for fading in
+ */
+ public Builder(long fadeOutDurationMillis, long fadeInDurationMills) {
+ mFadeOutDurationMillis = fadeOutDurationMillis;
+ mFadeInDurationMillis = fadeInDurationMills;
+ }
+
+ /**
+ * Constructs a new Builder from the given {@link FadeManagerConfiguration}
+ *
+ * @param fmc the {@link FadeManagerConfiguration} object whose data will be reused in the
+ * new builder
+ */
+ public Builder(@NonNull FadeManagerConfiguration fmc) {
+ mFadeState = fmc.mFadeState;
+ mUsageToFadeWrapperMap = fmc.mUsageToFadeWrapperMap.clone();
+ mAttrToFadeWrapperMap = new ArrayMap<AudioAttributes, FadeVolumeShaperConfigsWrapper>(
+ fmc.mAttrToFadeWrapperMap);
+ mFadeableUsages = fmc.mFadeableUsages.clone();
+ setFlag(IS_FADEABLE_USAGES_FIELD_SET);
+ mUnfadeableContentTypes = fmc.mUnfadeableContentTypes.clone();
+ setFlag(IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET);
+ mUnfadeablePlayerTypes = fmc.mUnfadeablePlayerTypes.clone();
+ mUnfadeableUids = fmc.mUnfadeableUids.clone();
+ mUnfadeableAudioAttributes = new ArrayList<>(fmc.mUnfadeableAudioAttributes);
+ mFadeOutDurationMillis = fmc.mFadeOutDurationMillis;
+ mFadeInDurationMillis = fmc.mFadeInDurationMillis;
+ }
+
+ /**
+ * Set the overall fade state
+ *
+ * @param state one of the {@link FadeStateEnum} states
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the fade state is invalid
+ * @see #getFadeState()
+ */
+ @NonNull
+ public Builder setFadeState(@FadeStateEnum int state) {
+ validateFadeState(state);
+ mFadeState = state;
+ return this;
+ }
+
+ /**
+ * Set the {@link android.media.VolumeShaper.Configuration} used to fade out players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ * <p>
+ * This method accepts {@code null} for volume shaper config to clear a previously set
+ * configuration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)})
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage} of target player
+ * @param fadeOutVShaperConfig the {@link android.media.VolumeShaper.Configuration} used
+ * to fade out players with usage
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the usage is invalid
+ * @see #getFadeOutVolumeShaperConfigForUsage(int)
+ */
+ @NonNull
+ public Builder setFadeOutVolumeShaperConfigForUsage(int usage,
+ @Nullable VolumeShaper.Configuration fadeOutVShaperConfig) {
+ validateUsage(usage);
+ getFadeVolShaperConfigWrapperForUsage(usage)
+ .setFadeOutVolShaperConfig(fadeOutVShaperConfig);
+ cleanupInactiveWrapperEntries(usage);
+ return this;
+ }
+
+ /**
+ * Set the {@link android.media.VolumeShaper.Configuration} used to fade in players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ * <p>
+ * This method accepts {@code null} for volume shaper config to clear a previously set
+ * configuration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)})
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @param fadeInVShaperConfig the {@link android.media.VolumeShaper.Configuration} used
+ * to fade in players with usage
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the usage is invalid
+ * @see #getFadeInVolumeShaperConfigForUsage(int)
+ */
+ @NonNull
+ public Builder setFadeInVolumeShaperConfigForUsage(int usage,
+ @Nullable VolumeShaper.Configuration fadeInVShaperConfig) {
+ validateUsage(usage);
+ getFadeVolShaperConfigWrapperForUsage(usage)
+ .setFadeInVolShaperConfig(fadeInVShaperConfig);
+ cleanupInactiveWrapperEntries(usage);
+ return this;
+ }
+
+ /**
+ * Set the duration used for fading out players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ * <p>
+ * A Volume shaper configuration is generated with the provided duration and default
+ * volume curve definitions. This config is then used to fade out players with given usage.
+ * <p>
+ * In order to clear previously set duration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)}), this method accepts
+ * {@link #DURATION_NOT_SET} and sets the corresponding fade out volume shaper config to
+ * {@code null}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage} of target player
+ * @param fadeOutDurationMillis positive duration in milliseconds or
+ * {@link #DURATION_NOT_SET}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the fade out duration is non-positive with the
+ * exception of {@link #DURATION_NOT_SET}
+ * @see #setFadeOutVolumeShaperConfigForUsage(int, VolumeShaper.Configuration)
+ * @see #getFadeOutDurationForUsage(int)
+ */
+ @NonNull
+ public Builder setFadeOutDurationForUsage(int usage, long fadeOutDurationMillis) {
+ validateUsage(usage);
+ VolumeShaper.Configuration fadeOutVShaperConfig =
+ createVolShaperConfigForDuration(fadeOutDurationMillis, /* isFadeIn= */ false);
+ setFadeOutVolumeShaperConfigForUsage(usage, fadeOutVShaperConfig);
+ return this;
+ }
+
+ /**
+ * Set the duration used for fading in players with
+ * {@link android.media.AudioAttributes.AttributeUsage}
+ * <p>
+ * A Volume shaper configuration is generated with the provided duration and default
+ * volume curve definitions. This config is then used to fade in players with given usage.
+ * <p>
+ * <b>Note: </b>In order to clear previously set duration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)}), this method accepts
+ * {@link #DURATION_NOT_SET} and sets the corresponding fade in volume shaper config to
+ * {@code null}
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage} of target player
+ * @param fadeInDurationMillis positive duration in milliseconds or
+ * {@link #DURATION_NOT_SET}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the fade in duration is non-positive with the
+ * exception of {@link #DURATION_NOT_SET}
+ * @see #setFadeInVolumeShaperConfigForUsage(int, VolumeShaper.Configuration)
+ * @see #getFadeInDurationForUsage(int)
+ */
+ @NonNull
+ public Builder setFadeInDurationForUsage(int usage, long fadeInDurationMillis) {
+ validateUsage(usage);
+ VolumeShaper.Configuration fadeInVShaperConfig =
+ createVolShaperConfigForDuration(fadeInDurationMillis, /* isFadeIn= */ true);
+ setFadeInVolumeShaperConfigForUsage(usage, fadeInVShaperConfig);
+ return this;
+ }
+
+ /**
+ * Set the {@link android.media.VolumeShaper.Configuration} used to fade out players with
+ * {@link android.media.AudioAttributes}
+ * <p>
+ * This method accepts {@code null} for volume shaper config to clear a previously set
+ * configuration (example, set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)})
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes}
+ * @param fadeOutVShaperConfig the {@link android.media.VolumeShaper.Configuration} used to
+ * fade out players with audio attribute
+ * @return the same Builder instance
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @see #getFadeOutVolumeShaperConfigForAudioAttributes(AudioAttributes)
+ */
+ @NonNull
+ public Builder setFadeOutVolumeShaperConfigForAudioAttributes(
+ @NonNull AudioAttributes audioAttributes,
+ @Nullable VolumeShaper.Configuration fadeOutVShaperConfig) {
+ Objects.requireNonNull(audioAttributes, "Audio attribute cannot be null");
+ getFadeVolShaperConfigWrapperForAttr(audioAttributes)
+ .setFadeOutVolShaperConfig(fadeOutVShaperConfig);
+ cleanupInactiveWrapperEntries(audioAttributes);
+ return this;
+ }
+
+ /**
+ * Set the {@link android.media.VolumeShaper.Configuration} used to fade in players with
+ * {@link android.media.AudioAttributes}
+ *
+ * <p>This method accepts {@code null} for volume shaper config to clear a previously set
+ * configuration (example, set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)})
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes}
+ * @param fadeInVShaperConfig the {@link android.media.VolumeShaper.Configuration} used to
+ * fade in players with audio attribute
+ * @return the same Builder instance
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @see #getFadeInVolumeShaperConfigForAudioAttributes(AudioAttributes)
+ */
+ @NonNull
+ public Builder setFadeInVolumeShaperConfigForAudioAttributes(
+ @NonNull AudioAttributes audioAttributes,
+ @Nullable VolumeShaper.Configuration fadeInVShaperConfig) {
+ Objects.requireNonNull(audioAttributes, "Audio attribute cannot be null");
+ getFadeVolShaperConfigWrapperForAttr(audioAttributes)
+ .setFadeInVolShaperConfig(fadeInVShaperConfig);
+ cleanupInactiveWrapperEntries(audioAttributes);
+ return this;
+ }
+
+ /**
+ * Set the duration used for fading out players of type
+ * {@link android.media.AudioAttributes}.
+ * <p>
+ * A Volume shaper configuration is generated with the provided duration and default
+ * volume curve definitions. This config is then used to fade out players with given usage.
+ * <p>
+ * <b>Note: </b>In order to clear previously set duration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)}), this method accepts
+ * {@link #DURATION_NOT_SET} and sets the corresponding fade out volume shaper config to
+ * {@code null}
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes} for which the fade out
+ * duration will be set/updated/reset
+ * @param fadeOutDurationMillis positive duration in milliseconds or
+ * {@link #DURATION_NOT_SET}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the fade out duration is non-positive with the
+ * exception of {@link #DURATION_NOT_SET}
+ * @see #getFadeOutDurationForAudioAttributes(AudioAttributes)
+ * @see #setFadeOutVolumeShaperConfigForAudioAttributes(AudioAttributes,
+ * VolumeShaper.Configuration)
+ */
+ @NonNull
+ public Builder setFadeOutDurationForAudioAttributes(
+ @NonNull AudioAttributes audioAttributes,
+ long fadeOutDurationMillis) {
+ Objects.requireNonNull(audioAttributes, "Audio attribute cannot be null");
+ VolumeShaper.Configuration fadeOutVShaperConfig =
+ createVolShaperConfigForDuration(fadeOutDurationMillis, /* isFadeIn= */ false);
+ setFadeOutVolumeShaperConfigForAudioAttributes(audioAttributes, fadeOutVShaperConfig);
+ return this;
+ }
+
+ /**
+ * Set the duration used for fading in players of type
+ * {@link android.media.AudioAttributes}.
+ * <p>
+ * A Volume shaper configuration is generated with the provided duration and default
+ * volume curve definitions. This config is then used to fade in players with given usage.
+ * <p>
+ * <b>Note: </b>In order to clear previously set duration (example, if set through
+ * {@link #Builder(android.media.FadeManagerConfiguration)}), this method accepts
+ * {@link #DURATION_NOT_SET} and sets the corresponding fade in volume shaper config to
+ * {@code null}
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes} for which the fade in
+ * duration will be set/updated/reset
+ * @param fadeInDurationMillis positive duration in milliseconds or
+ * {@link #DURATION_NOT_SET}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the fade in duration is non-positive with the
+ * exception of {@link #DURATION_NOT_SET}
+ * @see #getFadeInDurationForAudioAttributes(AudioAttributes)
+ * @see #setFadeInVolumeShaperConfigForAudioAttributes(AudioAttributes,
+ * VolumeShaper.Configuration)
+ */
+ @NonNull
+ public Builder setFadeInDurationForAudioAttributes(@NonNull AudioAttributes audioAttributes,
+ long fadeInDurationMillis) {
+ Objects.requireNonNull(audioAttributes, "Audio attribute cannot be null");
+ VolumeShaper.Configuration fadeInVShaperConfig =
+ createVolShaperConfigForDuration(fadeInDurationMillis, /* isFadeIn= */ true);
+ setFadeInVolumeShaperConfigForAudioAttributes(audioAttributes, fadeInVShaperConfig);
+ return this;
+ }
+
+ /**
+ * Set the list of {@link android.media.AudioAttributes.AttributeUsage} that can be faded
+ *
+ * <p>This is a positive list. Players with matching usage will be considered for fading.
+ * Usages that are not part of this list will not be faded
+ *
+ * <p>Passing an empty list as input clears the existing list. This can be used to
+ * reset the list when using a copy constructor
+ *
+ * <p><b>Warning:</b> When fade state is set to enabled, the builder expects at least one
+ * usage to be set/added. Failure to do so will result in an exception during
+ * {@link #build()}
+ *
+ * @param usages List of the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the usages are invalid
+ * @throws NullPointerException if the usage list is {@code null}
+ * @see #getFadeableUsages()
+ */
+ @NonNull
+ public Builder setFadeableUsages(@NonNull List<Integer> usages) {
+ Objects.requireNonNull(usages, "List of usages cannot be null");
+ validateUsages(usages);
+ setFlag(IS_FADEABLE_USAGES_FIELD_SET);
+ mFadeableUsages.clear();
+ mFadeableUsages.addAll(convertIntegerListToIntArray(usages));
+ return this;
+ }
+
+ /**
+ * Add the {@link android.media.AudioAttributes.AttributeUsage} to the fadeable list
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the usage is invalid
+ * @see #getFadeableUsages()
+ * @see #setFadeableUsages(List)
+ */
+ @NonNull
+ public Builder addFadeableUsage(@AudioAttributes.AttributeUsage int usage) {
+ validateUsage(usage);
+ setFlag(IS_FADEABLE_USAGES_FIELD_SET);
+ if (!mFadeableUsages.contains(usage)) {
+ mFadeableUsages.add(usage);
+ }
+ return this;
+ }
+
+ /**
+ * Remove the {@link android.media.AudioAttributes.AttributeUsage} from the fadeable list
+ * <p>
+ * Players of this usage type will not be faded.
+ *
+ * @param usage the {@link android.media.AudioAttributes.AttributeUsage}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the usage is invalid
+ * @see #getFadeableUsages()
+ * @see #setFadeableUsages(List)
+ */
+ @NonNull
+ public Builder clearFadeableUsage(@AudioAttributes.AttributeUsage int usage) {
+ validateUsage(usage);
+ setFlag(IS_FADEABLE_USAGES_FIELD_SET);
+ int index = mFadeableUsages.indexOf(usage);
+ if (index != INVALID_INDEX) {
+ mFadeableUsages.remove(index);
+ }
+ return this;
+ }
+
+ /**
+ * Set the list of {@link android.media.AudioAttributes.AttributeContentType} that can not
+ * be faded
+ *
+ * <p>This is a negative list. Players with matching content type of this list will not be
+ * faded. Content types that are not part of this list will be considered for fading.
+ *
+ * <p>Passing an empty list as input clears the existing list. This can be used to
+ * reset the list when using a copy constructor
+ *
+ * @param contentTypes list of {@link android.media.AudioAttributes.AttributeContentType}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the content types are invalid
+ * @throws NullPointerException if the content type list is {@code null}
+ * @see #getUnfadeableContentTypes()
+ */
+ @NonNull
+ public Builder setUnfadeableContentTypes(@NonNull List<Integer> contentTypes) {
+ Objects.requireNonNull(contentTypes, "List of content types cannot be null");
+ validateContentTypes(contentTypes);
+ setFlag(IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET);
+ mUnfadeableContentTypes.clear();
+ mUnfadeableContentTypes.addAll(convertIntegerListToIntArray(contentTypes));
+ return this;
+ }
+
+ /**
+ * Add the {@link android.media.AudioAttributes.AttributeContentType} to unfadeable list
+ *
+ * @param contentType the {@link android.media.AudioAttributes.AttributeContentType}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the content type is invalid
+ * @see #setUnfadeableContentTypes(List)
+ * @see #getUnfadeableContentTypes()
+ */
+ @NonNull
+ public Builder addUnfadeableContentType(
+ @AudioAttributes.AttributeContentType int contentType) {
+ validateContentType(contentType);
+ setFlag(IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET);
+ if (!mUnfadeableContentTypes.contains(contentType)) {
+ mUnfadeableContentTypes.add(contentType);
+ }
+ return this;
+ }
+
+ /**
+ * Remove the {@link android.media.AudioAttributes.AttributeContentType} from the
+ * unfadeable list
+ *
+ * @param contentType the {@link android.media.AudioAttributes.AttributeContentType}
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the content type is invalid
+ * @see #setUnfadeableContentTypes(List)
+ * @see #getUnfadeableContentTypes()
+ */
+ @NonNull
+ public Builder clearUnfadeableContentType(
+ @AudioAttributes.AttributeContentType int contentType) {
+ validateContentType(contentType);
+ setFlag(IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET);
+ int index = mUnfadeableContentTypes.indexOf(contentType);
+ if (index != INVALID_INDEX) {
+ mUnfadeableContentTypes.remove(index);
+ }
+ return this;
+ }
+
+ /**
+ * Set the uids that cannot be faded
+ *
+ * <p>This is a negative list. Players with matching uid of this list will not be faded.
+ * Uids that are not part of this list shall be considered for fading
+ *
+ * <p>Passing an empty list as input clears the existing list. This can be used to
+ * reset the list when using a copy constructor
+ *
+ * @param uids list of uids
+ * @return the same Builder instance
+ * @throws NullPointerException if the uid list is {@code null}
+ * @see #getUnfadeableUids()
+ */
+ @NonNull
+ public Builder setUnfadeableUids(@NonNull List<Integer> uids) {
+ Objects.requireNonNull(uids, "List of uids cannot be null");
+ mUnfadeableUids.clear();
+ mUnfadeableUids.addAll(convertIntegerListToIntArray(uids));
+ return this;
+ }
+
+ /**
+ * Add uid to unfadeable list
+ *
+ * @param uid client uid
+ * @return the same Builder instance
+ * @see #setUnfadeableUids(List)
+ * @see #getUnfadeableUids()
+ */
+ @NonNull
+ public Builder addUnfadeableUid(int uid) {
+ if (!mUnfadeableUids.contains(uid)) {
+ mUnfadeableUids.add(uid);
+ }
+ return this;
+ }
+
+ /**
+ * Remove the uid from unfadeable list
+ *
+ * @param uid client uid
+ * @return the same Builder instance
+ * @see #setUnfadeableUids(List)
+ * @see #getUnfadeableUids()
+ */
+ @NonNull
+ public Builder clearUnfadeableUid(int uid) {
+ int index = mUnfadeableUids.indexOf(uid);
+ if (index != INVALID_INDEX) {
+ mUnfadeableUids.remove(index);
+ }
+ return this;
+ }
+
+ /**
+ * Set the list of {@link android.media.AudioAttributes} that can not be faded
+ *
+ * <p>This is a negative list. Players with matching audio attributes of this list will not
+ * be faded. Audio attributes that are not part of this list shall be considered for fading.
+ *
+ * <p>Passing an empty list as input clears any existing list. This can be used to
+ * reset the list when using a copy constructor
+ *
+ * <p><b>Note:</b> Be cautious when adding generic audio attributes into this list as it can
+ * negatively impact fadeability decision if such an audio attribute and corresponding
+ * usage fall into opposing lists.
+ * For example:
+ * <pre class=prettyprint>
+ * AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build() </pre>
+ * is a generic audio attribute for {@link android.media.AudioAttributes.USAGE_MEDIA}.
+ * It is an undefined behavior to have an
+ * {@link android.media.AudioAttributes.AttributeUsage} in the fadeable usage list and the
+ * corresponding generic {@link android.media.AudioAttributes} in the unfadeable list. Such
+ * cases will result in an exception during {@link #build()}
+ *
+ * @param attrs list of {@link android.media.AudioAttributes}
+ * @return the same Builder instance
+ * @throws NullPointerException if the audio attributes list is {@code null}
+ * @see #getUnfadeableAudioAttributes()
+ */
+ @NonNull
+ public Builder setUnfadeableAudioAttributes(@NonNull List<AudioAttributes> attrs) {
+ Objects.requireNonNull(attrs, "List of audio attributes cannot be null");
+ mUnfadeableAudioAttributes.clear();
+ mUnfadeableAudioAttributes.addAll(attrs);
+ return this;
+ }
+
+ /**
+ * Add the {@link android.media.AudioAttributes} to the unfadeable list
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes}
+ * @return the same Builder instance
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @see #setUnfadeableAudioAttributes(List)
+ * @see #getUnfadeableAudioAttributes()
+ */
+ @NonNull
+ public Builder addUnfadeableAudioAttributes(@NonNull AudioAttributes audioAttributes) {
+ Objects.requireNonNull(audioAttributes, "Audio attributes cannot be null");
+ if (!mUnfadeableAudioAttributes.contains(audioAttributes)) {
+ mUnfadeableAudioAttributes.add(audioAttributes);
+ }
+ return this;
+ }
+
+ /**
+ * Remove the {@link android.media.AudioAttributes} from the unfadeable list.
+ *
+ * @param audioAttributes the {@link android.media.AudioAttributes}
+ * @return the same Builder instance
+ * @throws NullPointerException if the audio attributes is {@code null}
+ * @see #getUnfadeableAudioAttributes()
+ */
+ @NonNull
+ public Builder clearUnfadeableAudioAttributes(@NonNull AudioAttributes audioAttributes) {
+ Objects.requireNonNull(audioAttributes, "Audio attributes cannot be null");
+ if (mUnfadeableAudioAttributes.contains(audioAttributes)) {
+ mUnfadeableAudioAttributes.remove(audioAttributes);
+ }
+ return this;
+ }
+
+ /**
+ * Set the delay after which the offending faded out player will be faded in.
+ *
+ * <p>This is the amount of time between the app being notified of the focus loss (when its
+ * muted by the fade out), and the time fade in (to unmute) starts
+ *
+ * @param delayMillis delay in milliseconds
+ * @return the same Builder instance
+ * @throws IllegalArgumentException if the delay is negative
+ * @see #getFadeInDelayForOffenders()
+ */
+ @NonNull
+ public Builder setFadeInDelayForOffenders(long delayMillis) {
+ Preconditions.checkArgument(delayMillis >= 0, "Delay cannot be negative");
+ mFadeInDelayForOffendersMillis = delayMillis;
+ return this;
+ }
+
+ /**
+ * Builds the {@link FadeManagerConfiguration} with all of the fade configurations that
+ * have been set.
+ *
+ * @return a new {@link FadeManagerConfiguration} object
+ */
+ @NonNull
+ public FadeManagerConfiguration build() {
+ if (!checkNotSet(IS_BUILDER_USED_FIELD_SET)) {
+ throw new IllegalStateException(
+ "This Builder should not be reused. Use a new Builder instance instead");
+ }
+
+ setFlag(IS_BUILDER_USED_FIELD_SET);
+
+ if (checkNotSet(IS_FADEABLE_USAGES_FIELD_SET)) {
+ mFadeableUsages = DEFAULT_FADEABLE_USAGES;
+ setVolShaperConfigsForUsages(mFadeableUsages);
+ }
+
+ if (checkNotSet(IS_UNFADEABLE_CONTENT_TYPE_FIELD_SET)) {
+ mUnfadeableContentTypes = DEFAULT_UNFADEABLE_CONTENT_TYPES;
+ }
+
+ validateFadeConfigurations();
+
+ return new FadeManagerConfiguration(mFadeState, mFadeOutDurationMillis,
+ mFadeInDurationMillis, mFadeInDelayForOffendersMillis, mUsageToFadeWrapperMap,
+ mAttrToFadeWrapperMap, mFadeableUsages, mUnfadeableContentTypes,
+ mUnfadeablePlayerTypes, mUnfadeableUids, mUnfadeableAudioAttributes);
+ }
+
+ private void setFlag(long flag) {
+ mBuilderFieldsSet |= flag;
+ }
+
+ private boolean checkNotSet(long flag) {
+ return (mBuilderFieldsSet & flag) == 0;
+ }
+
+ private FadeVolumeShaperConfigsWrapper getFadeVolShaperConfigWrapperForUsage(int usage) {
+ if (!mUsageToFadeWrapperMap.contains(usage)) {
+ mUsageToFadeWrapperMap.put(usage, new FadeVolumeShaperConfigsWrapper());
+ }
+ return mUsageToFadeWrapperMap.get(usage);
+ }
+
+ private FadeVolumeShaperConfigsWrapper getFadeVolShaperConfigWrapperForAttr(
+ AudioAttributes attr) {
+ // if no entry, create a new one for setting/clearing
+ if (!mAttrToFadeWrapperMap.containsKey(attr)) {
+ mAttrToFadeWrapperMap.put(attr, new FadeVolumeShaperConfigsWrapper());
+ }
+ return mAttrToFadeWrapperMap.get(attr);
+ }
+
+ private VolumeShaper.Configuration createVolShaperConfigForDuration(long duration,
+ boolean isFadeIn) {
+ // used to reset the volume shaper config setting
+ if (duration == DURATION_NOT_SET) {
+ return null;
+ }
+
+ VolumeShaper.Configuration.Builder builder = new VolumeShaper.Configuration.Builder()
+ .setId(VOLUME_SHAPER_SYSTEM_FADE_ID)
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDuration(duration);
+
+ if (isFadeIn) {
+ builder.setCurve(/* times= */ new float[]{0.f, 0.50f, 1.0f},
+ /* volumes= */ new float[]{0.f, 0.30f, 1.0f});
+ } else {
+ builder.setCurve(/* times= */ new float[]{0.f, 0.25f, 1.0f},
+ /* volumes= */ new float[]{1.f, 0.65f, 0.0f});
+ }
+
+ return builder.build();
+ }
+
+ private void cleanupInactiveWrapperEntries(int usage) {
+ FadeVolumeShaperConfigsWrapper fmcw = mUsageToFadeWrapperMap.get(usage);
+ // cleanup map entry if FadeVolumeShaperConfigWrapper is inactive
+ if (fmcw != null && fmcw.isInactive()) {
+ mUsageToFadeWrapperMap.remove(usage);
+ }
+ }
+
+ private void cleanupInactiveWrapperEntries(AudioAttributes attr) {
+ FadeVolumeShaperConfigsWrapper fmcw = mAttrToFadeWrapperMap.get(attr);
+ // cleanup map entry if FadeVolumeShaperConfigWrapper is inactive
+ if (fmcw != null && fmcw.isInactive()) {
+ mAttrToFadeWrapperMap.remove(attr);
+ }
+ }
+
+ private void setVolShaperConfigsForUsages(IntArray usages) {
+ // set default volume shaper configs for fadeable usages
+ for (int index = 0; index < usages.size(); index++) {
+ setMissingVolShaperConfigsForWrapper(
+ getFadeVolShaperConfigWrapperForUsage(usages.get(index)));
+ }
+ }
+
+ private void setMissingVolShaperConfigsForWrapper(FadeVolumeShaperConfigsWrapper wrapper) {
+ if (!wrapper.isFadeOutConfigActive()) {
+ wrapper.setFadeOutVolShaperConfig(createVolShaperConfigForDuration(
+ mFadeOutDurationMillis, /* isFadeIn= */ false));
+ }
+ if (!wrapper.isFadeInConfigActive()) {
+ wrapper.setFadeInVolShaperConfig(createVolShaperConfigForDuration(
+ mFadeInDurationMillis, /* isFadeIn= */ true));
+ }
+ }
+
+ private void validateFadeState(int state) {
+ switch(state) {
+ case FADE_STATE_DISABLED:
+ case FADE_STATE_ENABLED_DEFAULT:
+ case FADE_STATE_ENABLED_AUTO:
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown fade state: " + state);
+ }
+ }
+
+ private void validateUsages(List<Integer> usages) {
+ for (int index = 0; index < usages.size(); index++) {
+ validateUsage(usages.get(index));
+ }
+ }
+
+ private void validateContentTypes(List<Integer> contentTypes) {
+ for (int index = 0; index < contentTypes.size(); index++) {
+ validateContentType(contentTypes.get(index));
+ }
+ }
+
+ private void validateContentType(int contentType) {
+ Preconditions.checkArgument(AudioAttributes.isSdkContentType(contentType),
+ "Invalid content type: ", contentType);
+ }
+
+ private void validateFadeConfigurations() {
+ validateFadeableUsages();
+ validateFadeVolumeShaperConfigsWrappers();
+ validateUnfadeableAudioAttributes();
+ }
+
+ /** Ensure fadeable usage list meets config requirements */
+ private void validateFadeableUsages() {
+ // ensure at least one fadeable usage
+ Preconditions.checkArgumentPositive(mFadeableUsages.size(),
+ "Fadeable usage list cannot be empty when state set to enabled");
+ // ensure all fadeable usages have volume shaper configs - both fade in and out
+ for (int index = 0; index < mFadeableUsages.size(); index++) {
+ setMissingVolShaperConfigsForWrapper(
+ getFadeVolShaperConfigWrapperForUsage(mFadeableUsages.get(index)));
+ }
+ }
+
+ /** Ensure Fade volume shaper config wrappers meet requirements */
+ private void validateFadeVolumeShaperConfigsWrappers() {
+ // ensure both fade in & out volume shaper configs are defined for all wrappers
+ // for usages -
+ for (int index = 0; index < mUsageToFadeWrapperMap.size(); index++) {
+ setMissingVolShaperConfigsForWrapper(
+ getFadeVolShaperConfigWrapperForUsage(mUsageToFadeWrapperMap.keyAt(index)));
+ }
+
+ // for additional audio attributes -
+ for (int index = 0; index < mAttrToFadeWrapperMap.size(); index++) {
+ setMissingVolShaperConfigsForWrapper(
+ getFadeVolShaperConfigWrapperForAttr(mAttrToFadeWrapperMap.keyAt(index)));
+ }
+ }
+
+ /** Ensure Unfadeable attributes meet configuration requirements */
+ private void validateUnfadeableAudioAttributes() {
+ // ensure no generic AudioAttributes in unfadeable list with matching usage in fadeable
+ // list. failure results in an undefined behavior as the audio attributes
+ // shall be both fadeable (because of the usage) and unfadeable at the same time.
+ for (int index = 0; index < mUnfadeableAudioAttributes.size(); index++) {
+ AudioAttributes targetAttr = mUnfadeableAudioAttributes.get(index);
+ int usage = targetAttr.getSystemUsage();
+ boolean isFadeableUsage = mFadeableUsages.contains(usage);
+ // cannot have a generic audio attribute that also is a fadeable usage
+ Preconditions.checkArgument(
+ !isFadeableUsage || (isFadeableUsage && !isGeneric(targetAttr)),
+ "Unfadeable audio attributes cannot be generic of the fadeable usage");
+ }
+ }
+
+ private static boolean isGeneric(AudioAttributes attr) {
+ return (attr.getContentType() == AudioAttributes.CONTENT_TYPE_UNKNOWN
+ && attr.getFlags() == 0x0
+ && attr.getBundle() == null
+ && attr.getTags().isEmpty());
+ }
+ }
+
+ private static final class FadeVolumeShaperConfigsWrapper implements Parcelable {
+ // null volume shaper config refers to either init state or if its cleared/reset
+ private @Nullable VolumeShaper.Configuration mFadeOutVolShaperConfig;
+ private @Nullable VolumeShaper.Configuration mFadeInVolShaperConfig;
+
+ FadeVolumeShaperConfigsWrapper() {}
+
+ public void setFadeOutVolShaperConfig(@Nullable VolumeShaper.Configuration fadeOutConfig) {
+ mFadeOutVolShaperConfig = fadeOutConfig;
+ }
+
+ public void setFadeInVolShaperConfig(@Nullable VolumeShaper.Configuration fadeInConfig) {
+ mFadeInVolShaperConfig = fadeInConfig;
+ }
+
+ /**
+ * Query fade out volume shaper config
+ *
+ * @return configured fade out volume shaper config or {@code null} when initialized/reset
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeOutVolShaperConfig() {
+ return mFadeOutVolShaperConfig;
+ }
+
+ /**
+ * Query fade in volume shaper config
+ *
+ * @return configured fade in volume shaper config or {@code null} when initialized/reset
+ */
+ @Nullable
+ public VolumeShaper.Configuration getFadeInVolShaperConfig() {
+ return mFadeInVolShaperConfig;
+ }
+
+ /**
+ * Wrapper is inactive if both fade out and in configs are cleared.
+ *
+ * @return {@code true} if configs are cleared. {@code false} if either of the configs is
+ * set
+ */
+ public boolean isInactive() {
+ return !isFadeOutConfigActive() && !isFadeInConfigActive();
+ }
+
+ boolean isFadeOutConfigActive() {
+ return mFadeOutVolShaperConfig != null;
+ }
+
+ boolean isFadeInConfigActive() {
+ return mFadeInVolShaperConfig != null;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (!(o instanceof FadeVolumeShaperConfigsWrapper)) {
+ return false;
+ }
+
+ FadeVolumeShaperConfigsWrapper rhs = (FadeVolumeShaperConfigsWrapper) o;
+
+ if (mFadeInVolShaperConfig == null && rhs.mFadeInVolShaperConfig == null
+ && mFadeOutVolShaperConfig == null && rhs.mFadeOutVolShaperConfig == null) {
+ return true;
+ }
+
+ boolean isEqual;
+ if (mFadeOutVolShaperConfig != null) {
+ isEqual = mFadeOutVolShaperConfig.equals(rhs.mFadeOutVolShaperConfig);
+ } else if (rhs.mFadeOutVolShaperConfig != null) {
+ return false;
+ } else {
+ isEqual = true;
+ }
+
+ if (mFadeInVolShaperConfig != null) {
+ isEqual = isEqual && mFadeInVolShaperConfig.equals(rhs.mFadeInVolShaperConfig);
+ } else if (rhs.mFadeInVolShaperConfig != null) {
+ return false;
+ }
+
+ return isEqual;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mFadeOutVolShaperConfig, mFadeInVolShaperConfig);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
+ mFadeOutVolShaperConfig.writeToParcel(dest, flags);
+ mFadeInVolShaperConfig.writeToParcel(dest, flags);
+ }
+
+ /**
+ * Creates fade volume shaper config wrapper from parcel
+ *
+ * @hide
+ */
+ @VisibleForTesting()
+ FadeVolumeShaperConfigsWrapper(Parcel in) {
+ mFadeOutVolShaperConfig = VolumeShaper.Configuration.CREATOR.createFromParcel(in);
+ mFadeInVolShaperConfig = VolumeShaper.Configuration.CREATOR.createFromParcel(in);
+ }
+
+ @NonNull
+ public static final Creator<FadeVolumeShaperConfigsWrapper> CREATOR = new Creator<>() {
+ @Override
+ @NonNull
+ public FadeVolumeShaperConfigsWrapper createFromParcel(@NonNull Parcel in) {
+ return new FadeVolumeShaperConfigsWrapper(in);
+ }
+
+ @Override
+ @NonNull
+ public FadeVolumeShaperConfigsWrapper[] newArray(int size) {
+ return new FadeVolumeShaperConfigsWrapper[size];
+ }
+ };
+ }
+}
+
diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java
index 0a0a626..ab7c27f 100644
--- a/media/java/android/media/MediaCas.java
+++ b/media/java/android/media/MediaCas.java
@@ -272,7 +272,7 @@
Log.d(TAG, "Trying to get AIDL service");
IMediaCasService serviceAidl =
IMediaCasService.Stub.asInterface(
- ServiceManager.getService(
+ ServiceManager.waitForDeclaredService(
IMediaCasService.DESCRIPTOR + "/default"));
if (serviceAidl != null) {
return serviceAidl;
diff --git a/media/java/android/media/flags/fade_manager_configuration.aconfig b/media/java/android/media/flags/fade_manager_configuration.aconfig
new file mode 100644
index 0000000..100e2235
--- /dev/null
+++ b/media/java/android/media/flags/fade_manager_configuration.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.media.flags"
+
+flag {
+ namespace: "media_solutions"
+ name: "enable_fade_manager_configuration"
+ description: "Enable Fade Manager Configuration support to determine fade properties"
+ bug: "307354764"
+}
\ No newline at end of file
diff --git a/media/tests/AudioPolicyTest/Android.bp b/media/tests/AudioPolicyTest/Android.bp
index 4624dfe..3dc2a0a 100644
--- a/media/tests/AudioPolicyTest/Android.bp
+++ b/media/tests/AudioPolicyTest/Android.bp
@@ -17,6 +17,7 @@
"guava-android-testlib",
"hamcrest-library",
"platform-test-annotations",
+ "truth",
],
platform_apis: true,
certificate: "platform",
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java
index 94df40d..e9a0d3e 100644
--- a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioManagerTest.java
@@ -229,7 +229,7 @@
@Test
public void testSetGetVolumePerAttributes() {
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
if (usage == AudioAttributes.USAGE_UNKNOWN) {
continue;
}
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java
index 266faae..18e8608 100644
--- a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioProductStrategyTest.java
@@ -169,7 +169,7 @@
assertNotNull(audioProductStrategies);
assertTrue(audioProductStrategies.size() > 0);
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
AudioAttributes aaForUsage = new AudioAttributes.Builder().setUsage(usage).build();
int streamTypeFromUsage =
diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java
new file mode 100644
index 0000000..fb6bd48
--- /dev/null
+++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/FadeManagerConfigurationUnitTest.java
@@ -0,0 +1,795 @@
+/*
+ * 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.audiopolicytest;
+
+import static com.android.media.flags.Flags.FLAG_ENABLE_FADE_MANAGER_CONFIGURATION;
+
+import static org.junit.Assert.assertThrows;
+
+import android.media.AudioAttributes;
+import android.media.AudioPlaybackConfiguration;
+import android.media.FadeManagerConfiguration;
+import android.media.VolumeShaper;
+import android.os.Parcel;
+import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.google.common.truth.Expect;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@RequiresFlagsEnabled(FLAG_ENABLE_FADE_MANAGER_CONFIGURATION)
+public final class FadeManagerConfigurationUnitTest {
+ private static final long DEFAULT_FADE_OUT_DURATION_MS = 2_000;
+ private static final long DEFAULT_FADE_IN_DURATION_MS = 1_000;
+ private static final long TEST_FADE_OUT_DURATION_MS = 1_500;
+ private static final long TEST_FADE_IN_DURATION_MS = 750;
+ private static final int TEST_INVALID_USAGE = -10;
+ private static final int TEST_INVALID_CONTENT_TYPE = 100;
+ private static final int TEST_INVALID_FADE_STATE = 100;
+ private static final long TEST_INVALID_DURATION = -10;
+ private static final int TEST_UID_1 = 1010001;
+ private static final int TEST_UID_2 = 1000;
+ private static final int TEST_PARCEL_FLAGS = 0;
+ private static final AudioAttributes TEST_MEDIA_AUDIO_ATTRIBUTE =
+ createAudioAttributesForUsage(AudioAttributes.USAGE_MEDIA);
+ private static final AudioAttributes TEST_GAME_AUDIO_ATTRIBUTE =
+ createAudioAttributesForUsage(AudioAttributes.USAGE_GAME);
+ private static final AudioAttributes TEST_NAVIGATION_AUDIO_ATTRIBUTE =
+ new AudioAttributes.Builder().setUsage(
+ AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .build();
+ private static final AudioAttributes TEST_ASSISTANT_AUDIO_ATTRIBUTE =
+ new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ASSISTANT)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build();
+ private static final List<Integer> TEST_FADEABLE_USAGES = Arrays.asList(
+ AudioAttributes.USAGE_MEDIA,
+ AudioAttributes.USAGE_GAME
+ );
+ private static final List<Integer> TEST_UNFADEABLE_CONTENT_TYPES = Arrays.asList(
+ AudioAttributes.CONTENT_TYPE_SPEECH
+ );
+
+ private static final List<Integer> TEST_UNFADEABLE_PLAYER_TYPES = Arrays.asList(
+ AudioPlaybackConfiguration.PLAYER_TYPE_AAUDIO,
+ AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL
+ );
+ private static final VolumeShaper.Configuration TEST_DEFAULT_FADE_OUT_VOLUME_SHAPER_CONFIG =
+ new VolumeShaper.Configuration.Builder()
+ .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
+ .setCurve(/* times= */new float[]{0.f, 0.25f, 1.0f},
+ /* volumes= */new float[]{1.f, 0.65f, 0.0f})
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDuration(DEFAULT_FADE_OUT_DURATION_MS)
+ .build();
+ private static final VolumeShaper.Configuration TEST_DEFAULT_FADE_IN_VOLUME_SHAPER_CONFIG =
+ new VolumeShaper.Configuration.Builder()
+ .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
+ .setCurve(/* times= */new float[]{0.f, 0.50f, 1.0f},
+ /* volumes= */new float[]{0.f, 0.30f, 1.0f})
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDuration(DEFAULT_FADE_IN_DURATION_MS)
+ .build();
+ private static final VolumeShaper.Configuration TEST_FADE_OUT_VOLUME_SHAPER_CONFIG =
+ new VolumeShaper.Configuration.Builder()
+ .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
+ .setCurve(/* times= */new float[]{0.f, 0.25f, 1.0f},
+ /* volumes= */new float[]{1.f, 0.65f, 0.0f})
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDuration(TEST_FADE_OUT_DURATION_MS)
+ .build();
+ private static final VolumeShaper.Configuration TEST_FADE_IN_VOLUME_SHAPER_CONFIG =
+ new VolumeShaper.Configuration.Builder()
+ .setId(FadeManagerConfiguration.VOLUME_SHAPER_SYSTEM_FADE_ID)
+ .setCurve(/* times= */new float[]{0.f, 0.50f, 1.0f},
+ /* volumes= */new float[]{0.f, 0.30f, 1.0f})
+ .setOptionFlags(VolumeShaper.Configuration.OPTION_FLAG_CLOCK_TIME)
+ .setDuration(TEST_FADE_IN_DURATION_MS)
+ .build();
+
+ private FadeManagerConfiguration mFmc;
+
+ @Rule
+ public final Expect expect = Expect.create();
+
+ @Before
+ public void setUp() {
+ mFmc = new FadeManagerConfiguration.Builder().build();
+ }
+
+
+ @Test
+ public void build() {
+ expect.withMessage("Fade state for default builder")
+ .that(mFmc.getFadeState())
+ .isEqualTo(FadeManagerConfiguration.FADE_STATE_ENABLED_DEFAULT);
+ expect.withMessage("Fadeable usages for default builder")
+ .that(mFmc.getFadeableUsages())
+ .containsExactlyElementsIn(TEST_FADEABLE_USAGES);
+ expect.withMessage("Unfadeable content types usages for default builder")
+ .that(mFmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(TEST_UNFADEABLE_CONTENT_TYPES);
+ expect.withMessage("Unfadeable player types for default builder")
+ .that(mFmc.getUnfadeablePlayerTypes())
+ .containsExactlyElementsIn(TEST_UNFADEABLE_PLAYER_TYPES);
+ expect.withMessage("Unfadeable uids for default builder")
+ .that(mFmc.getUnfadeableUids()).isEmpty();
+ expect.withMessage("Unfadeable audio attributes for default builder")
+ .that(mFmc.getUnfadeableAudioAttributes()).isEmpty();
+ expect.withMessage("Fade out volume shaper config for media usage")
+ .that(mFmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(TEST_DEFAULT_FADE_OUT_VOLUME_SHAPER_CONFIG);
+ expect.withMessage("Fade out duration for game usage")
+ .that(mFmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(DEFAULT_FADE_OUT_DURATION_MS);
+ expect.withMessage("Fade in volume shaper config for media uasge")
+ .that(mFmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(TEST_DEFAULT_FADE_IN_VOLUME_SHAPER_CONFIG);
+ expect.withMessage("Fade in duration for game audio usage")
+ .that(mFmc.getFadeInDurationForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(DEFAULT_FADE_IN_DURATION_MS);
+ }
+
+ @Test
+ public void build_withFadeDurations_succeeds() {
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration
+ .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();
+
+ expect.withMessage("Fade state for builder with duration").that(fmc.getFadeState())
+ .isEqualTo(FadeManagerConfiguration.FADE_STATE_ENABLED_DEFAULT);
+ expect.withMessage("Fadeable usages for builder with duration")
+ .that(fmc.getFadeableUsages())
+ .containsExactlyElementsIn(TEST_FADEABLE_USAGES);
+ expect.withMessage("Unfadeable content types usages for builder with duration")
+ .that(fmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(TEST_UNFADEABLE_CONTENT_TYPES);
+ expect.withMessage("Unfadeable player types for builder with duration")
+ .that(fmc.getUnfadeablePlayerTypes())
+ .containsExactlyElementsIn(TEST_UNFADEABLE_PLAYER_TYPES);
+ expect.withMessage("Unfadeable uids for builder with duration")
+ .that(fmc.getUnfadeableUids()).isEmpty();
+ expect.withMessage("Unfadeable audio attributes for builder with duration")
+ .that(fmc.getUnfadeableAudioAttributes()).isEmpty();
+ expect.withMessage("Fade out volume shaper config for media usage")
+ .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
+ expect.withMessage("Fade out duration for game usage")
+ .that(fmc.getFadeOutDurationForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(TEST_FADE_OUT_DURATION_MS);
+ expect.withMessage("Fade in volume shaper config for media audio attributes")
+ .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
+ expect.withMessage("Fade in duration for game audio attributes")
+ .that(fmc.getFadeInDurationForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(TEST_FADE_IN_DURATION_MS);
+
+ }
+
+ @Test
+ public void build_withFadeManagerConfiguration_succeeds() {
+ FadeManagerConfiguration fmcObj = new FadeManagerConfiguration
+ .Builder(TEST_FADE_OUT_DURATION_MS, TEST_FADE_IN_DURATION_MS).build();
+
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration
+ .Builder(fmcObj).build();
+
+ expect.withMessage("Fade state for copy builder").that(fmc.getFadeState())
+ .isEqualTo(fmcObj.getFadeState());
+ expect.withMessage("Fadeable usages for copy builder")
+ .that(fmc.getFadeableUsages())
+ .containsExactlyElementsIn(fmcObj.getFadeableUsages());
+ expect.withMessage("Unfadeable content types usages for copy builder")
+ .that(fmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(fmcObj.getUnfadeableContentTypes());
+ expect.withMessage("Unfadeable player types for copy builder")
+ .that(fmc.getUnfadeablePlayerTypes())
+ .containsExactlyElementsIn(fmcObj.getUnfadeablePlayerTypes());
+ expect.withMessage("Unfadeable uids for copy builder")
+ .that(fmc.getUnfadeableUids()).isEqualTo(fmcObj.getUnfadeableUids());
+ expect.withMessage("Unfadeable audio attributes for copy builder")
+ .that(fmc.getUnfadeableAudioAttributes())
+ .isEqualTo(fmcObj.getUnfadeableAudioAttributes());
+ expect.withMessage("Fade out volume shaper config for media usage")
+ .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForUsage(
+ AudioAttributes.USAGE_MEDIA));
+ expect.withMessage("Fade out volume shaper config for game usage")
+ .that(fmc.getFadeOutVolumeShaperConfigForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForUsage(
+ AudioAttributes.USAGE_GAME));
+ expect.withMessage("Fade in volume shaper config for media usage")
+ .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_MEDIA))
+ .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForUsage(
+ AudioAttributes.USAGE_MEDIA));
+ expect.withMessage("Fade in volume shaper config for game usage")
+ .that(fmc.getFadeInVolumeShaperConfigForUsage(AudioAttributes.USAGE_GAME))
+ .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForUsage(
+ AudioAttributes.USAGE_GAME));
+ expect.withMessage("Fade out volume shaper config for media audio attributes")
+ .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
+ TEST_MEDIA_AUDIO_ATTRIBUTE))
+ .isEqualTo(fmcObj.getFadeOutVolumeShaperConfigForAudioAttributes(
+ TEST_MEDIA_AUDIO_ATTRIBUTE));
+ expect.withMessage("Fade out duration for game audio attributes")
+ .that(fmc.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
+ .isEqualTo(fmcObj.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
+ expect.withMessage("Fade in volume shaper config for media audio attributes")
+ .that(fmc.getFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE))
+ .isEqualTo(fmcObj.getFadeInVolumeShaperConfigForAudioAttributes(
+ TEST_MEDIA_AUDIO_ATTRIBUTE));
+ expect.withMessage("Fade in duration for game audio attributes")
+ .that(fmc.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
+ .isEqualTo(fmcObj.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE));
+ }
+
+ @Test
+ public void testSetFadeState_toDisable() {
+ final int fadeState = FadeManagerConfiguration.FADE_STATE_DISABLED;
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setFadeState(fadeState).build();
+
+ expect.withMessage("Fade state when disabled").that(fmc.getFadeState())
+ .isEqualTo(fadeState);
+ }
+
+ @Test
+ public void testSetFadeState_toEnableAuto() {
+ final int fadeStateAuto = FadeManagerConfiguration.FADE_STATE_ENABLED_AUTO;
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setFadeState(fadeStateAuto).build();
+
+ expect.withMessage("Fade state when enabled for audio").that(fmc.getFadeState())
+ .isEqualTo(fadeStateAuto);
+ }
+
+ @Test
+ public void testSetFadeState_toInvalid_fails() {
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setFadeState(TEST_INVALID_FADE_STATE).build()
+ );
+
+ expect.withMessage("Invalid fade state exception").that(thrown)
+ .hasMessageThat().contains("Unknown fade state");
+ }
+
+ @Test
+ public void testSetFadeVolShaperConfig() {
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_ASSISTANT_AUDIO_ATTRIBUTE,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(TEST_ASSISTANT_AUDIO_ATTRIBUTE,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
+
+ expect.withMessage("Fade out volume shaper config set for assistant audio attributes")
+ .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
+ TEST_ASSISTANT_AUDIO_ATTRIBUTE))
+ .isEqualTo(TEST_FADE_OUT_VOLUME_SHAPER_CONFIG);
+ expect.withMessage("Fade in volume shaper config set for assistant audio attributes")
+ .that(fmc.getFadeInVolumeShaperConfigForAudioAttributes(
+ TEST_ASSISTANT_AUDIO_ATTRIBUTE))
+ .isEqualTo(TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
+ }
+
+ @Test
+ public void testSetFadeOutVolShaperConfig_withNullAudioAttributes_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setFadeOutVolumeShaperConfigForAudioAttributes(/* audioAttributes= */ null,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG).build()
+ );
+
+ expect.withMessage("Null audio attributes for fade out exception")
+ .that(thrown).hasMessageThat().contains("cannot be null");
+ }
+
+ @Test
+ public void testSetFadeVolShaperConfig_withNullVolumeShaper_getsNull() {
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder(mFmc)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
+ /* VolumeShaper.Configuration= */ null)
+ .setFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
+ /* VolumeShaper.Configuration= */ null)
+ .clearFadeableUsage(AudioAttributes.USAGE_MEDIA).build();
+
+ expect.withMessage("Fade out volume shaper config set with null value")
+ .that(fmc.getFadeOutVolumeShaperConfigForAudioAttributes(
+ TEST_MEDIA_AUDIO_ATTRIBUTE)).isNull();
+ }
+
+ @Test
+ public void testSetFadeInVolShaperConfig_withNullAudioAttributes_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setFadeInVolumeShaperConfigForAudioAttributes(/* audioAttributes= */ null,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build()
+ );
+
+ expect.withMessage("Null audio attributes for fade in exception")
+ .that(thrown).hasMessageThat().contains("cannot be null");
+ }
+
+ @Test
+ public void testSetFadeDuration() {
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE,
+ TEST_FADE_OUT_DURATION_MS)
+ .setFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE,
+ TEST_FADE_IN_DURATION_MS).build();
+
+ expect.withMessage("Fade out duration set for audio attributes")
+ .that(fmc.getFadeOutDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
+ .isEqualTo(TEST_FADE_OUT_DURATION_MS);
+ expect.withMessage("Fade in duration set for audio attributes")
+ .that(fmc.getFadeInDurationForAudioAttributes(TEST_GAME_AUDIO_ATTRIBUTE))
+ .isEqualTo(TEST_FADE_IN_DURATION_MS);
+ }
+
+ @Test
+ public void testSetFadeOutDuration_withNullAudioAttributes_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeOutDurationForAudioAttributes(
+ /* audioAttributes= */ null, TEST_FADE_OUT_DURATION_MS).build()
+ );
+
+ expect.withMessage("Null audio attributes for fade out duration exception").that(thrown)
+ .hasMessageThat().contains("cannot be null");
+ }
+
+ @Test
+ public void testSetFadeOutDuration_withInvalidDuration_fails() {
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeOutDurationForAudioAttributes(
+ TEST_NAVIGATION_AUDIO_ATTRIBUTE, TEST_INVALID_DURATION).build()
+ );
+
+ expect.withMessage("Invalid duration for fade out exception").that(thrown)
+ .hasMessageThat().contains("not positive");
+ }
+
+ @Test
+ public void testSetFadeInDuration_withNullAudioAttributes_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeInDurationForAudioAttributes(
+ /* audioAttributes= */ null, TEST_FADE_IN_DURATION_MS).build()
+ );
+
+ expect.withMessage("Null audio attributes for fade in duration exception").that(thrown)
+ .hasMessageThat().contains("cannot be null");
+ }
+
+ @Test
+ public void testSetFadeInDuration_withInvalidDuration_fails() {
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeInDurationForAudioAttributes(
+ TEST_NAVIGATION_AUDIO_ATTRIBUTE, TEST_INVALID_DURATION).build()
+ );
+
+ expect.withMessage("Invalid duration for fade in exception").that(thrown)
+ .hasMessageThat().contains("not positive");
+ }
+
+ @Test
+ public void testSetFadeableUsages() {
+ final List<Integer> fadeableUsages = List.of(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION,
+ AudioAttributes.USAGE_ALARM,
+ AudioAttributes.USAGE_ASSISTANT
+ );
+ AudioAttributes aaForVoiceComm = createAudioAttributesForUsage(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION);
+ AudioAttributes aaForAlarm = createAudioAttributesForUsage(AudioAttributes.USAGE_ALARM);
+ AudioAttributes aaForAssistant = createAudioAttributesForUsage(
+ AudioAttributes.USAGE_ASSISTANT);
+
+
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setFadeableUsages(fadeableUsages)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAlarm,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaForAlarm,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAssistant,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaForAssistant,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
+
+ expect.withMessage("Fadeable usages")
+ .that(fmc.getFadeableUsages()).isEqualTo(fadeableUsages);
+ }
+
+ @Test
+ public void testSetFadeableUsages_withInvalidUsage_fails() {
+ final List<Integer> fadeableUsages = List.of(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION,
+ TEST_INVALID_USAGE,
+ AudioAttributes.USAGE_ANNOUNCEMENT
+ );
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeableUsages(fadeableUsages).build()
+ );
+
+ expect.withMessage("Fadeable usages set to invalid usage").that(thrown).hasMessageThat()
+ .contains("Invalid usage");
+ }
+
+ @Test
+ public void testSetFadeableUsages_withNullUsages_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder().setFadeableUsages(/* usages= */ null)
+ .build()
+ );
+
+ expect.withMessage("Fadeable usages set to null list").that(thrown).hasMessageThat()
+ .contains("cannot be null");
+ }
+
+ @Test
+ public void testSetFadeableUsages_withEmptyListClears_addsNewUsage() {
+ final List<Integer> fadeableUsages = List.of(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION,
+ AudioAttributes.USAGE_ALARM,
+ AudioAttributes.USAGE_ASSISTANT
+ );
+ FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
+ .setFadeableUsages(fadeableUsages);
+
+ fmcBuilder.setFadeableUsages(List.of());
+
+ FadeManagerConfiguration fmc = fmcBuilder
+ .addFadeableUsage(AudioAttributes.USAGE_MEDIA)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(TEST_MEDIA_AUDIO_ATTRIBUTE,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG).build();
+ expect.withMessage("Fadeable usages set to empty list")
+ .that(fmc.getFadeableUsages()).isEqualTo(List.of(AudioAttributes.USAGE_MEDIA));
+ }
+
+
+ @Test
+ public void testAddFadeableUsage() {
+ final int usageToAdd = AudioAttributes.USAGE_ASSISTANT;
+ AudioAttributes aaToAdd = createAudioAttributesForUsage(usageToAdd);
+ List<Integer> updatedUsages = new ArrayList<>(mFmc.getFadeableUsages());
+ updatedUsages.add(usageToAdd);
+
+ FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration
+ .Builder(mFmc).addFadeableUsage(usageToAdd)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaToAdd,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaToAdd,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
+ .build();
+
+ expect.withMessage("Fadeable usages").that(updatedFmc.getFadeableUsages())
+ .containsExactlyElementsIn(updatedUsages);
+ }
+
+ @Test
+ public void testAddFadeableUsage_withoutSetFadeableUsages() {
+ final int newUsage = AudioAttributes.USAGE_ASSISTANT;
+ AudioAttributes aaToAdd = createAudioAttributesForUsage(newUsage);
+
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .addFadeableUsage(newUsage)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaToAdd,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaToAdd,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
+ .build();
+
+ expect.withMessage("Fadeable usages").that(fmc.getFadeableUsages())
+ .containsExactlyElementsIn(List.of(newUsage));
+ }
+
+ @Test
+ public void testAddFadeableUsage_withInvalidUsage_fails() {
+ List<Integer> setUsages = Arrays.asList(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION,
+ AudioAttributes.USAGE_ASSISTANT
+ );
+ AudioAttributes aaForVoiceComm = createAudioAttributesForUsage(
+ AudioAttributes.USAGE_VOICE_COMMUNICATION);
+ AudioAttributes aaForAssistant = createAudioAttributesForUsage(
+ AudioAttributes.USAGE_ASSISTANT);
+ FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
+ .setFadeableUsages(setUsages)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaForVoiceComm,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG)
+ .setFadeOutVolumeShaperConfigForAudioAttributes(aaForAssistant,
+ TEST_FADE_OUT_VOLUME_SHAPER_CONFIG)
+ .setFadeInVolumeShaperConfigForAudioAttributes(aaForAssistant,
+ TEST_FADE_IN_VOLUME_SHAPER_CONFIG);
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ fmcBuilder.addFadeableUsage(TEST_INVALID_USAGE)
+ );
+
+ FadeManagerConfiguration fmc = fmcBuilder.build();
+ expect.withMessage("Fadeable usages ").that(thrown).hasMessageThat()
+ .contains("Invalid usage");
+ expect.withMessage("Fadeable usages").that(fmc.getFadeableUsages())
+ .containsExactlyElementsIn(setUsages);
+ }
+
+ @Test
+ public void testClearFadeableUsage() {
+ final int usageToClear = AudioAttributes.USAGE_MEDIA;
+ List<Integer> updatedUsages = new ArrayList<>(mFmc.getFadeableUsages());
+ updatedUsages.remove((Integer) usageToClear);
+
+ FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration
+ .Builder(mFmc).clearFadeableUsage(usageToClear).build();
+
+ expect.withMessage("Clear fadeable usage").that(updatedFmc.getFadeableUsages())
+ .containsExactlyElementsIn(updatedUsages);
+ }
+
+ @Test
+ public void testClearFadeableUsage_withInvalidUsage_fails() {
+ FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder(mFmc);
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ fmcBuilder.clearFadeableUsage(TEST_INVALID_USAGE)
+ );
+
+ FadeManagerConfiguration fmc = fmcBuilder.build();
+ expect.withMessage("Clear invalid usage").that(thrown).hasMessageThat()
+ .contains("Invalid usage");
+ expect.withMessage("Fadeable usages").that(fmc.getFadeableUsages())
+ .containsExactlyElementsIn(mFmc.getFadeableUsages());
+ }
+
+ @Test
+ public void testSetUnfadeableContentTypes() {
+ final List<Integer> unfadeableContentTypes = List.of(
+ AudioAttributes.CONTENT_TYPE_MOVIE,
+ AudioAttributes.CONTENT_TYPE_SONIFICATION
+ );
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(unfadeableContentTypes).build();
+
+ expect.withMessage("Unfadeable content types set")
+ .that(fmc.getUnfadeableContentTypes()).isEqualTo(unfadeableContentTypes);
+ }
+
+ @Test
+ public void testSetUnfadeableContentTypes_withInvalidContentType_fails() {
+ final List<Integer> invalidUnfadeableContentTypes = List.of(
+ AudioAttributes.CONTENT_TYPE_MOVIE,
+ TEST_INVALID_CONTENT_TYPE,
+ AudioAttributes.CONTENT_TYPE_SONIFICATION
+ );
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(invalidUnfadeableContentTypes).build()
+ );
+
+ expect.withMessage("Invalid content type set exception").that(thrown).hasMessageThat()
+ .contains("Invalid content type");
+ }
+
+ @Test
+ public void testSetUnfadeableContentTypes_withNullContentType_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(/* contentType= */ null).build()
+ );
+
+ expect.withMessage("Null content type set exception").that(thrown).hasMessageThat()
+ .contains("cannot be null");
+ }
+
+ @Test
+ public void testSetUnfadeableContentTypes_withEmptyList_clearsExistingList() {
+ final List<Integer> unfadeableContentTypes = List.of(
+ AudioAttributes.CONTENT_TYPE_MOVIE,
+ AudioAttributes.CONTENT_TYPE_SONIFICATION
+ );
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(unfadeableContentTypes).build();
+
+ FadeManagerConfiguration fmcWithEmptyLsit = new FadeManagerConfiguration.Builder(fmc)
+ .setUnfadeableContentTypes(List.of()).build();
+
+ expect.withMessage("Unfadeable content types for empty list")
+ .that(fmcWithEmptyLsit.getUnfadeableContentTypes()).isEmpty();
+ }
+
+ @Test
+ public void testAddUnfadeableContentType() {
+ final int contentTypeToAdd = AudioAttributes.CONTENT_TYPE_MOVIE;
+ List<Integer> upatdedContentTypes = new ArrayList<>(mFmc.getUnfadeableContentTypes());
+ upatdedContentTypes.add(contentTypeToAdd);
+
+ FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration
+ .Builder(mFmc).addUnfadeableContentType(contentTypeToAdd).build();
+
+ expect.withMessage("Unfadeable content types").that(updatedFmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(upatdedContentTypes);
+ }
+
+ @Test
+ public void testAddUnfadeableContentTypes_withoutSetUnfadeableContentTypes() {
+ final int newContentType = AudioAttributes.CONTENT_TYPE_MOVIE;
+
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .addUnfadeableContentType(newContentType).build();
+
+ expect.withMessage("Unfadeable content types").that(fmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(List.of(newContentType));
+ }
+
+ @Test
+ public void testAddunfadeableContentTypes_withInvalidContentType_fails() {
+ final List<Integer> unfadeableContentTypes = List.of(
+ AudioAttributes.CONTENT_TYPE_MOVIE,
+ AudioAttributes.CONTENT_TYPE_SONIFICATION
+ );
+ FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(unfadeableContentTypes);
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ fmcBuilder.addUnfadeableContentType(TEST_INVALID_CONTENT_TYPE).build()
+ );
+
+ expect.withMessage("Invalid content types exception").that(thrown).hasMessageThat()
+ .contains("Invalid content type");
+ }
+
+ @Test
+ public void testClearUnfadeableContentType() {
+ List<Integer> unfadeableContentTypes = new ArrayList<>(Arrays.asList(
+ AudioAttributes.CONTENT_TYPE_MOVIE,
+ AudioAttributes.CONTENT_TYPE_SONIFICATION
+ ));
+ final int contentTypeToClear = AudioAttributes.CONTENT_TYPE_MOVIE;
+
+ FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableContentTypes(unfadeableContentTypes)
+ .clearUnfadeableContentType(contentTypeToClear).build();
+
+ unfadeableContentTypes.remove((Integer) contentTypeToClear);
+ expect.withMessage("Unfadeable content types").that(updatedFmc.getUnfadeableContentTypes())
+ .containsExactlyElementsIn(unfadeableContentTypes);
+ }
+
+ @Test
+ public void testClearUnfadeableContentType_withInvalidContentType_fails() {
+ FadeManagerConfiguration.Builder fmcBuilder = new FadeManagerConfiguration.Builder(mFmc);
+
+ IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, () ->
+ fmcBuilder.clearUnfadeableContentType(TEST_INVALID_CONTENT_TYPE).build()
+ );
+
+ expect.withMessage("Invalid content type exception").that(thrown).hasMessageThat()
+ .contains("Invalid content type");
+ }
+
+ @Test
+ public void testSetUnfadeableUids() {
+ final List<Integer> unfadeableUids = List.of(
+ TEST_UID_1,
+ TEST_UID_2
+ );
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableUids(unfadeableUids).build();
+
+ expect.withMessage("Unfadeable uids set")
+ .that(fmc.getUnfadeableUids()).isEqualTo(unfadeableUids);
+ }
+
+ @Test
+ public void testSetUnfadeableUids_withNullUids_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setUnfadeableUids(/* uids= */ null).build()
+ );
+
+ expect.withMessage("Null unfadeable uids").that(thrown).hasMessageThat()
+ .contains("cannot be null");
+ }
+
+ @Test
+ public void testAddUnfadeableUid() {
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .addUnfadeableUid(TEST_UID_1).build();
+
+ expect.withMessage("Unfadeable uids")
+ .that(fmc.getUnfadeableUids()).isEqualTo(List.of(TEST_UID_1));
+ }
+
+ @Test
+ public void testClearUnfadebaleUid() {
+ final List<Integer> unfadeableUids = List.of(
+ TEST_UID_1,
+ TEST_UID_2
+ );
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableUids(unfadeableUids).build();
+
+ FadeManagerConfiguration updatedFmc = new FadeManagerConfiguration.Builder(fmc)
+ .clearUnfadeableUid(TEST_UID_1).build();
+
+ expect.withMessage("Unfadeable uids").that(updatedFmc.getUnfadeableUids())
+ .isEqualTo(List.of(TEST_UID_2));
+ }
+
+ @Test
+ public void testSetUnfadeableAudioAttributes() {
+ final List<AudioAttributes> unfadeableAttrs = List.of(
+ TEST_ASSISTANT_AUDIO_ATTRIBUTE,
+ TEST_NAVIGATION_AUDIO_ATTRIBUTE
+ );
+
+ FadeManagerConfiguration fmc = new FadeManagerConfiguration.Builder()
+ .setUnfadeableAudioAttributes(unfadeableAttrs).build();
+
+ expect.withMessage("Unfadeable audio attributes")
+ .that(fmc.getUnfadeableAudioAttributes()).isEqualTo(unfadeableAttrs);
+ }
+
+ @Test
+ public void testSetUnfadeableAudioAttributes_withNullAttributes_fails() {
+ NullPointerException thrown = assertThrows(NullPointerException.class, () ->
+ new FadeManagerConfiguration.Builder()
+ .setUnfadeableAudioAttributes(/* attrs= */ null).build()
+ );
+
+ expect.withMessage("Null audio attributes exception").that(thrown).hasMessageThat()
+ .contains("cannot be null");
+ }
+
+ @Test
+ public void testWriteToParcel_andCreateFromParcel() {
+ Parcel parcel = Parcel.obtain();
+
+ mFmc.writeToParcel(parcel, TEST_PARCEL_FLAGS);
+ parcel.setDataPosition(/* position= */ 0);
+ expect.withMessage("Fade manager configuration write to and create from parcel")
+ .that(mFmc)
+ .isEqualTo(FadeManagerConfiguration.CREATOR.createFromParcel(parcel));
+ }
+
+ private static AudioAttributes createAudioAttributesForUsage(int usage) {
+ if (AudioAttributes.isSystemUsage(usage)) {
+ return new AudioAttributes.Builder().setSystemUsage(usage).build();
+ }
+ return new AudioAttributes.Builder().setUsage(usage).build();
+ }
+}
diff --git a/media/tests/ringtone/res/raw/test_haptic_file.ahv b/media/tests/ringtone/res/raw/test_haptic_file.ahv
index 18c99c7..d6eba1a 100644
--- a/media/tests/ringtone/res/raw/test_haptic_file.ahv
+++ b/media/tests/ringtone/res/raw/test_haptic_file.ahv
@@ -1,4 +1,4 @@
-<vibration>
+<vibration-effect>
<waveform-effect>
<waveform-entry durationMs="63" amplitude="255"/>
<waveform-entry durationMs="63" amplitude="231"/>
@@ -14,4 +14,4 @@
<waveform-entry durationMs="63" amplitude="0"/>
<waveform-entry durationMs="1250" amplitude="0"/>
</waveform-effect>
-</vibration>
+</vibration-effect>
diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt
index fea6c5f..9f2a9ac 100644
--- a/native/android/libandroid.map.txt
+++ b/native/android/libandroid.map.txt
@@ -336,6 +336,13 @@
APerformanceHint_closeSession; # introduced=Tiramisu
APerformanceHint_setThreads; # introduced=UpsideDownCake
APerformanceHint_setPreferPowerEfficiency; # introduced=VanillaIceCream
+ APerformanceHint_reportActualWorkDuration2; # introduced=VanillaIceCream
+ AWorkDuration_create; # introduced=VanillaIceCream
+ AWorkDuration_release; # introduced=VanillaIceCream
+ AWorkDuration_setWorkPeriodStartTimestampNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualTotalDurationNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualCpuDurationNanos; # introduced=VanillaIceCream
+ AWorkDuration_setActualGpuDurationNanos; # introduced=VanillaIceCream
local:
*;
};
diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp
index c25df6e..c4c8128 100644
--- a/native/android/performance_hint.cpp
+++ b/native/android/performance_hint.cpp
@@ -18,12 +18,14 @@
#include <aidl/android/hardware/power/SessionHint.h>
#include <aidl/android/hardware/power/SessionMode.h>
+#include <android/WorkDuration.h>
#include <android/os/IHintManager.h>
#include <android/os/IHintSession.h>
#include <android/performance_hint.h>
#include <binder/Binder.h>
#include <binder/IBinder.h>
#include <binder/IServiceManager.h>
+#include <inttypes.h>
#include <performance_hint_private.h>
#include <utils/SystemClock.h>
@@ -75,10 +77,13 @@
int setThreads(const int32_t* threadIds, size_t size);
int getThreadIds(int32_t* const threadIds, size_t* size);
int setPreferPowerEfficiency(bool enabled);
+ int reportActualWorkDuration(AWorkDuration* workDuration);
private:
friend struct APerformanceHintManager;
+ int reportActualWorkDurationInternal(WorkDuration* workDuration);
+
sp<IHintManager> mHintManager;
sp<IHintSession> mHintSession;
// HAL preferred update rate
@@ -92,8 +97,7 @@
// Last hint reported from sendHint indexed by hint value
std::vector<int64_t> mLastHintSentTimestamp;
// Cached samples
- std::vector<int64_t> mActualDurationsNanos;
- std::vector<int64_t> mTimestampsNanos;
+ std::vector<WorkDuration> mActualWorkDurations;
};
static IHintManager* gIHintManagerForTesting = nullptr;
@@ -195,8 +199,7 @@
* Most of the workload is target_duration dependent, so now clear the cached samples
* as they are most likely obsolete.
*/
- mActualDurationsNanos.clear();
- mTimestampsNanos.clear();
+ mActualWorkDurations.clear();
mFirstTargetMetTimestamp = 0;
mLastTargetMetTimestamp = 0;
return 0;
@@ -207,43 +210,10 @@
ALOGE("%s: actualDurationNanos must be positive", __FUNCTION__);
return EINVAL;
}
- int64_t now = elapsedRealtimeNano();
- mActualDurationsNanos.push_back(actualDurationNanos);
- mTimestampsNanos.push_back(now);
- if (actualDurationNanos >= mTargetDurationNanos) {
- // Reset timestamps if we are equal or over the target.
- mFirstTargetMetTimestamp = 0;
- } else {
- // Set mFirstTargetMetTimestamp for first time meeting target.
- if (!mFirstTargetMetTimestamp || !mLastTargetMetTimestamp ||
- (now - mLastTargetMetTimestamp > 2 * mPreferredRateNanos)) {
- mFirstTargetMetTimestamp = now;
- }
- /**
- * Rate limit the change if the update is over mPreferredRateNanos since first
- * meeting target and less than mPreferredRateNanos since last meeting target.
- */
- if (now - mFirstTargetMetTimestamp > mPreferredRateNanos &&
- now - mLastTargetMetTimestamp <= mPreferredRateNanos) {
- return 0;
- }
- mLastTargetMetTimestamp = now;
- }
+ WorkDuration workDuration(0, actualDurationNanos, actualDurationNanos, 0);
- binder::Status ret =
- mHintSession->reportActualWorkDuration(mActualDurationsNanos, mTimestampsNanos);
- if (!ret.isOk()) {
- ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__,
- ret.exceptionMessage().c_str());
- mFirstTargetMetTimestamp = 0;
- mLastTargetMetTimestamp = 0;
- return EPIPE;
- }
- mActualDurationsNanos.clear();
- mTimestampsNanos.clear();
-
- return 0;
+ return reportActualWorkDurationInternal(&workDuration);
}
int APerformanceHintSession::sendHint(SessionHint hint) {
@@ -322,6 +292,67 @@
return OK;
}
+int APerformanceHintSession::reportActualWorkDuration(AWorkDuration* aWorkDuration) {
+ WorkDuration* workDuration = static_cast<WorkDuration*>(aWorkDuration);
+ if (workDuration->workPeriodStartTimestampNanos <= 0) {
+ ALOGE("%s: workPeriodStartTimestampNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualTotalDurationNanos <= 0) {
+ ALOGE("%s: actualDurationNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualCpuDurationNanos <= 0) {
+ ALOGE("%s: cpuDurationNanos must be positive", __FUNCTION__);
+ return EINVAL;
+ }
+ if (workDuration->actualGpuDurationNanos < 0) {
+ ALOGE("%s: gpuDurationNanos must be non negative", __FUNCTION__);
+ return EINVAL;
+ }
+
+ return reportActualWorkDurationInternal(workDuration);
+}
+
+int APerformanceHintSession::reportActualWorkDurationInternal(WorkDuration* workDuration) {
+ int64_t actualTotalDurationNanos = workDuration->actualTotalDurationNanos;
+ int64_t now = uptimeNanos();
+ workDuration->timestampNanos = now;
+ mActualWorkDurations.push_back(std::move(*workDuration));
+
+ if (actualTotalDurationNanos >= mTargetDurationNanos) {
+ // Reset timestamps if we are equal or over the target.
+ mFirstTargetMetTimestamp = 0;
+ } else {
+ // Set mFirstTargetMetTimestamp for first time meeting target.
+ if (!mFirstTargetMetTimestamp || !mLastTargetMetTimestamp ||
+ (now - mLastTargetMetTimestamp > 2 * mPreferredRateNanos)) {
+ mFirstTargetMetTimestamp = now;
+ }
+ /**
+ * Rate limit the change if the update is over mPreferredRateNanos since first
+ * meeting target and less than mPreferredRateNanos since last meeting target.
+ */
+ if (now - mFirstTargetMetTimestamp > mPreferredRateNanos &&
+ now - mLastTargetMetTimestamp <= mPreferredRateNanos) {
+ return 0;
+ }
+ mLastTargetMetTimestamp = now;
+ }
+
+ binder::Status ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations);
+ if (!ret.isOk()) {
+ ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__,
+ ret.exceptionMessage().c_str());
+ mFirstTargetMetTimestamp = 0;
+ mLastTargetMetTimestamp = 0;
+ return ret.exceptionCode() == binder::Status::EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE;
+ }
+ mActualWorkDurations.clear();
+
+ return 0;
+}
+
// ===================================== C API
APerformanceHintManager* APerformanceHint_getManager() {
return APerformanceHintManager::getInstance();
@@ -376,6 +407,64 @@
return session->setPreferPowerEfficiency(enabled);
}
+int APerformanceHint_reportActualWorkDuration2(APerformanceHintSession* session,
+ AWorkDuration* workDuration) {
+ if (session == nullptr || workDuration == nullptr) {
+ ALOGE("Invalid value: (session %p, workDuration %p)", session, workDuration);
+ return EINVAL;
+ }
+ return session->reportActualWorkDuration(workDuration);
+}
+
+AWorkDuration* AWorkDuration_create() {
+ WorkDuration* workDuration = new WorkDuration();
+ return static_cast<AWorkDuration*>(workDuration);
+}
+
+void AWorkDuration_release(AWorkDuration* aWorkDuration) {
+ if (aWorkDuration == nullptr) {
+ ALOGE("%s: aWorkDuration is nullptr", __FUNCTION__);
+ }
+ delete aWorkDuration;
+}
+
+void AWorkDuration_setWorkPeriodStartTimestampNanos(AWorkDuration* aWorkDuration,
+ int64_t workPeriodStartTimestampNanos) {
+ if (aWorkDuration == nullptr || workPeriodStartTimestampNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, workPeriodStartTimestampNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, workPeriodStartTimestampNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->workPeriodStartTimestampNanos =
+ workPeriodStartTimestampNanos;
+}
+
+void AWorkDuration_setActualTotalDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualTotalDurationNanos) {
+ if (aWorkDuration == nullptr || actualTotalDurationNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualTotalDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualTotalDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualTotalDurationNanos = actualTotalDurationNanos;
+}
+
+void AWorkDuration_setActualCpuDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualCpuDurationNanos) {
+ if (aWorkDuration == nullptr || actualCpuDurationNanos <= 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualCpuDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualCpuDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualCpuDurationNanos = actualCpuDurationNanos;
+}
+
+void AWorkDuration_setActualGpuDurationNanos(AWorkDuration* aWorkDuration,
+ int64_t actualGpuDurationNanos) {
+ if (aWorkDuration == nullptr || actualGpuDurationNanos < 0) {
+ ALOGE("%s: Invalid value. (AWorkDuration: %p, actualGpuDurationNanos: %" PRIi64 ")",
+ __FUNCTION__, aWorkDuration, actualGpuDurationNanos);
+ }
+ static_cast<WorkDuration*>(aWorkDuration)->actualGpuDurationNanos = actualGpuDurationNanos;
+}
+
void APerformanceHint_setIHintManagerForTesting(void* iManager) {
delete gHintManagerForTesting;
gHintManagerForTesting = nullptr;
diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
index 22d33b1..4553b49 100644
--- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
+++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "PerformanceHintNativeTest"
+#include <android/WorkDuration.h>
#include <android/os/IHintManager.h>
#include <android/os/IHintSession.h>
#include <android/performance_hint.h>
@@ -60,6 +61,8 @@
MOCK_METHOD(Status, setMode, (int32_t mode, bool enabled), (override));
MOCK_METHOD(Status, close, (), (override));
MOCK_METHOD(IBinder*, onAsBinder, (), (override));
+ MOCK_METHOD(Status, reportActualWorkDuration2,
+ (const ::std::vector<android::os::WorkDuration>& workDurations), (override));
};
class PerformanceHintTest : public Test {
@@ -120,6 +123,7 @@
std::vector<int64_t> actualDurations;
actualDurations.push_back(20);
EXPECT_CALL(*iSession, reportActualWorkDuration(Eq(actualDurations), _)).Times(Exactly(1));
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(_)).Times(Exactly(1));
result = APerformanceHint_reportActualWorkDuration(session, actualDurationNanos);
EXPECT_EQ(0, result);
@@ -238,4 +242,125 @@
APerformanceHintSession* session =
APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration);
ASSERT_TRUE(session);
-}
\ No newline at end of file
+}
+
+MATCHER_P(WorkDurationEq, expected, "") {
+ if (arg.size() != expected.size()) {
+ *result_listener << "WorkDuration vectors are different sizes. Expected: "
+ << expected.size() << ", Actual: " << arg.size();
+ return false;
+ }
+ for (int i = 0; i < expected.size(); ++i) {
+ android::os::WorkDuration expectedWorkDuration = expected[i];
+ android::os::WorkDuration actualWorkDuration = arg[i];
+ if (!expectedWorkDuration.equalsWithoutTimestamp(actualWorkDuration)) {
+ *result_listener << "WorkDuration at [" << i << "] is different: "
+ << "Expected: " << expectedWorkDuration
+ << ", Actual: " << actualWorkDuration;
+ return false;
+ }
+ }
+ return true;
+}
+
+TEST_F(PerformanceHintTest, TestAPerformanceHint_reportActualWorkDuration2) {
+ APerformanceHintManager* manager = createManager();
+
+ std::vector<int32_t> tids;
+ tids.push_back(1);
+ tids.push_back(2);
+ int64_t targetDuration = 56789L;
+
+ StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>();
+ sp<IHintSession> session_sp(iSession);
+
+ EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _))
+ .Times(Exactly(1))
+ .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status())));
+
+ APerformanceHintSession* session =
+ APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration);
+ ASSERT_TRUE(session);
+
+ int64_t targetDurationNanos = 10;
+ EXPECT_CALL(*iSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1));
+ int result = APerformanceHint_updateTargetWorkDuration(session, targetDurationNanos);
+ EXPECT_EQ(0, result);
+
+ usleep(2); // Sleep for longer than preferredUpdateRateNanos.
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(0, result);
+ }
+
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(-1, 20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(22, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, -20, 13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(22, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, -13, 8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(EINVAL, result);
+ }
+ {
+ std::vector<android::os::WorkDuration> actualWorkDurations;
+ android::os::WorkDuration workDuration(1, 20, 13, -8);
+ actualWorkDurations.push_back(workDuration);
+
+ EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations)))
+ .Times(Exactly(1));
+ result = APerformanceHint_reportActualWorkDuration2(session,
+ static_cast<AWorkDuration*>(
+ &workDuration));
+ EXPECT_EQ(EINVAL, result);
+ }
+
+ EXPECT_CALL(*iSession, close()).Times(Exactly(1));
+ APerformanceHint_closeSession(session);
+}
+
+TEST_F(PerformanceHintTest, TestAWorkDuration) {
+ AWorkDuration* aWorkDuration = AWorkDuration_create();
+ ASSERT_NE(aWorkDuration, nullptr);
+
+ AWorkDuration_setWorkPeriodStartTimestampNanos(aWorkDuration, 1);
+ AWorkDuration_setActualTotalDurationNanos(aWorkDuration, 20);
+ AWorkDuration_setActualCpuDurationNanos(aWorkDuration, 13);
+ AWorkDuration_setActualGpuDurationNanos(aWorkDuration, 8);
+ AWorkDuration_release(aWorkDuration);
+}
diff --git a/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
index 90041da..24b4d2f 100644
--- a/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
+++ b/packages/InputDevices/res/raw/keyboard_layout_ukrainian.kcm
@@ -14,8 +14,8 @@
#
# Ukrainian keyboard layout.
-# This is a typical Ukrainian PC keyboard layout.
-# As an added convenience, English characters are accessible using ralt (Alt Gr).
+# Based on PC enhanced Ukrainian layout with added Unicode keys based on
+# the Linux one.
#
type OVERLAY
@@ -25,32 +25,34 @@
### ROW 1
key GRAVE {
- label: '\u0401'
- base: '\u0451'
- shift, capslock: '\u0401'
- shift+capslock: '\u0451'
- ralt: '`'
+ label: '\''
+ base: '\''
+ shift: '\u02bc'
+ ralt: '\u0301'
ralt+shift: '~'
}
key 1 {
label: '1'
base: '1'
- shift, ralt: '!'
+ shift: '!'
+ ralt: '\u00b9'
}
key 2 {
label: '2'
base: '2'
shift: '"'
- ralt: '@'
+ ralt: '\u00b2'
+ ralt+shift: '\u2019'
}
key 3 {
label: '3'
base: '3'
shift: '\u2116'
- ralt: '#'
+ ralt: '\u00a7'
+ ralt+shift: '\u20b4'
}
key 4 {
@@ -58,60 +60,67 @@
base: '4'
shift: ';'
ralt: '$'
+ ralt+shift: '\u20ac'
}
key 5 {
label: '5'
base: '5'
- shift, ralt: '%'
+ shift: '%'
+ ralt: '\u00b0'
}
key 6 {
label: '6'
base: '6'
shift: ':'
- ralt: '^'
+ ralt: '<'
}
key 7 {
label: '7'
base: '7'
shift: '?'
- ralt: '&'
+ ralt: '>'
}
key 8 {
label: '8'
base: '8'
- shift, ralt: '*'
+ shift: '*'
+ ralt: '\u2022'
}
key 9 {
label: '9'
base: '9'
- shift, ralt: '('
+ shift: '('
+ ralt: '['
+ ralt+shift: '{'
}
key 0 {
label: '0'
base: '0'
- shift, ralt: ')'
+ shift: ')'
+ ralt: ']'
+ ralt+shift: '}'
}
key MINUS {
label: '-'
base: '-'
shift: '_'
- ralt: '-'
- shift+ralt: '_'
+ ralt: '\u2014'
+ shift+ralt: '\u2013'
}
key EQUALS {
label: '='
base: '='
shift: '+'
- ralt: '='
- shift+ralt: '+'
+ ralt: '\u2260'
+ shift+ralt: '\u00b1'
}
### ROW 2
@@ -121,6 +130,9 @@
base: '\u0439'
shift, capslock: '\u0419'
shift+capslock: '\u0439'
+ ralt: '\u0458'
+ ralt+shift, ralt+capslock: '\u0408'
+ ralt+shift+capslock: '\u0458'
}
key W {
@@ -128,6 +140,9 @@
base: '\u0446'
shift, capslock: '\u0426'
shift+capslock: '\u0446'
+ ralt: '\u045f'
+ ralt+shift, ralt+capslock: '\u040f'
+ ralt+shift+capslock: '\u045f'
}
key E {
@@ -135,6 +150,9 @@
base: '\u0443'
shift, capslock: '\u0423'
shift+capslock: '\u0443'
+ ralt: '\u045e'
+ ralt+shift, ralt+capslock: '\u040e'
+ ralt+shift+capslock: '\u045e'
}
key R {
@@ -142,6 +160,7 @@
base: '\u043a'
shift, capslock: '\u041a'
shift+capslock: '\u043a'
+ ralt: '\u00ae'
}
key T {
@@ -149,6 +168,9 @@
base: '\u0435'
shift, capslock: '\u0415'
shift+capslock: '\u0435'
+ ralt: '\u0451'
+ ralt+shift, ralt+capslock: '\u0401'
+ ralt+shift+capslock: '\u0451'
}
key Y {
@@ -156,6 +178,9 @@
base: '\u043d'
shift, capslock: '\u041d'
shift+capslock: '\u043d'
+ ralt: '\u045a'
+ ralt+shift, ralt+capslock: '\u040a'
+ ralt+shift+capslock: '\u045a'
}
key U {
@@ -164,8 +189,8 @@
shift, capslock: '\u0413'
shift+capslock: '\u0433'
ralt: '\u0491'
- shift+ralt, capslock+ralt: '\u0490'
- shift+capslock+ralt: '\u0491'
+ ralt+shift, ralt+capslock: '\u0490'
+ ralt+shift+capslock: '\u0491'
}
key I {
@@ -201,6 +226,9 @@
base: '\u0457'
shift, capslock: '\u0407'
shift+capslock: '\u0457'
+ ralt: '\u044a'
+ ralt+shift, ralt+capslock: '\u042a'
+ ralt+shift+capslock: '\u044a'
}
### ROW 3
@@ -217,6 +245,9 @@
base: '\u0456'
shift, capslock: '\u0406'
shift+capslock: '\u0456'
+ ralt: '\u044b'
+ ralt+shift, ralt+capslock: '\u042b'
+ ralt+shift+capslock: '\u044b'
}
key D {
@@ -259,6 +290,9 @@
base: '\u043b'
shift, capslock: '\u041b'
shift+capslock: '\u043b'
+ ralt: '\u0459'
+ ralt+shift, ralt+capslock: '\u0409'
+ ralt+shift+capslock: '\u0459'
}
key L {
@@ -266,6 +300,9 @@
base: '\u0434'
shift, capslock: '\u0414'
shift+capslock: '\u0434'
+ ralt: '\u0452'
+ ralt+shift, ralt+capslock: '\u0402'
+ ralt+shift+capslock: '\u0452'
}
key SEMICOLON {
@@ -282,15 +319,18 @@
base: '\u0454'
shift, capslock: '\u0404'
shift+capslock: '\u0454'
- ralt: '\''
- ralt+shift: '"'
+ ralt: '\u044d'
+ ralt+shift, ralt+capslock: '\u042d'
+ ralt+shift+capslock: '\u044d'
}
key BACKSLASH {
label: '\\'
base: '\\'
shift: '/'
- ralt: '|'
+ ralt: '\u0491'
+ ralt+shift, ralt+capslock: '\u0490'
+ ralt+shift+capslock: '\u0491'
}
### ROW 4
@@ -316,6 +356,9 @@
base: '\u0447'
shift, capslock: '\u0427'
shift+capslock: '\u0447'
+ ralt: '\u045b'
+ ralt+shift, ralt+capslock: '\u040b'
+ ralt+shift+capslock: '\u045b'
}
key C {
@@ -323,6 +366,7 @@
base: '\u0441'
shift, capslock: '\u0421'
shift+capslock: '\u0441'
+ ralt: '\u00a9'
}
key V {
@@ -344,6 +388,7 @@
base: '\u0442'
shift, capslock: '\u0422'
shift+capslock: '\u0442'
+ ralt: '\u2122'
}
key M {
@@ -358,8 +403,8 @@
base: '\u0431'
shift, capslock: '\u0411'
shift+capslock: '\u0431'
- ralt: ','
- ralt+shift: '<'
+ ralt: '\u00ab'
+ ralt+shift: '\u201e'
}
key PERIOD {
@@ -367,8 +412,8 @@
base: '\u044e'
shift, capslock: '\u042e'
shift+capslock: '\u044e'
- ralt: '.'
- ralt+shift: '>'
+ ralt: '\u00bb'
+ ralt+shift: '\u201c'
}
key SLASH {
@@ -376,5 +421,5 @@
base: '.'
shift: ','
ralt: '/'
- ralt+shift: '?'
+ ralt+shift: '\u2026'
}
diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp
index 6213b34..25ad9b8 100644
--- a/packages/PackageInstaller/Android.bp
+++ b/packages/PackageInstaller/Android.bp
@@ -50,6 +50,7 @@
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
"android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
lint: {
@@ -77,6 +78,7 @@
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
"android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
aaptflags: ["--product tablet"],
@@ -106,6 +108,7 @@
"androidx.lifecycle_lifecycle-livedata",
"androidx.lifecycle_lifecycle-extensions",
"android.content.pm.flags-aconfig-java",
+ "android.os.flags-aconfig-java",
],
aaptflags: ["--product tv"],
diff --git a/packages/PackageInstaller/AndroidManifest.xml b/packages/PackageInstaller/AndroidManifest.xml
index ef218fd..2e4fd9b 100644
--- a/packages/PackageInstaller/AndroidManifest.xml
+++ b/packages/PackageInstaller/AndroidManifest.xml
@@ -206,7 +206,19 @@
android:noHistory="true"
android:exported="true">
<intent-filter android:priority="1">
- <action android:name="android.intent.action.UNARCHIVE_DIALOG" />
+ <action android:name="com.android.intent.action.UNARCHIVE_DIALOG" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=".UnarchiveErrorActivity"
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:theme="@style/Theme.AlertDialogActivity.NoActionBar"
+ android:excludeFromRecents="true"
+ android:noHistory="true"
+ android:exported="true">
+ <intent-filter android:priority="1">
+ <action android:name="com.android.intent.action.UNARCHIVE_ERROR_DIALOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
diff --git a/packages/PackageInstaller/TEST_MAPPING b/packages/PackageInstaller/TEST_MAPPING
index cef9014..76d7ab1 100644
--- a/packages/PackageInstaller/TEST_MAPPING
+++ b/packages/PackageInstaller/TEST_MAPPING
@@ -22,6 +22,9 @@
},
{
"name": "PackageInstallerTests"
+ },
+ {
+ "name": "CtsIntentSignatureTestCases"
}
]
}
diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml
index 38a781a..a3496ca 100644
--- a/packages/PackageInstaller/res/values-af/strings.xml
+++ b/packages/PackageInstaller/res/values-af/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Kennisgewing dat program geïnstalleer is"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Suksesvol geïnstalleer"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” is suksesvol geïnstalleer"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Stel <xliff:g id="APPNAME">%1$s</xliff:g> terug vanaf <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Hierdie app sal in die agtergrond begin aflaai"</string>
+ <string name="restore" msgid="8460854736328970444">"Stel terug"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml
index 7b664bc..9d0fd53 100644
--- a/packages/PackageInstaller/res/values-am/strings.xml
+++ b/packages/PackageInstaller/res/values-am/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"የመተግበሪያ ተጭኗል ማሳወቂያ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"በተሳካ ሁኔታ ተጭኗል"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» በተሳካ ሁኔታ ተጭኗል"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ከ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ወደነበረበት <xliff:g id="APPNAME">%1$s</xliff:g> መልስ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ይህ መተግበሪያ በዳራ ማውረድ ይጀምራል።"</string>
+ <string name="restore" msgid="8460854736328970444">"ወደነበረበት መልስ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml
index 9a4d7ea..f4c9581 100644
--- a/packages/PackageInstaller/res/values-ar/strings.xml
+++ b/packages/PackageInstaller/res/values-ar/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"إشعار \"تم تثبيت التطبيق\""</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"تم التثبيت بنجاح."</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"تم تثبيت \"<xliff:g id="APPNAME">%1$s</xliff:g>\" بنجاح."</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"هل تريد استعادة التطبيق \"<xliff:g id="APPNAME">%1$s</xliff:g>\" من \"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>\"؟"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"سيبدأ تنزيل هذا التطبيق في الخلفية."</string>
+ <string name="restore" msgid="8460854736328970444">"استعادة"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml
index 65f6641..4d264c6 100644
--- a/packages/PackageInstaller/res/values-as/strings.xml
+++ b/packages/PackageInstaller/res/values-as/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"এপ্ ইনষ্টল কৰাৰ জাননী"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” সফলতাৰে ইনষ্টল কৰা হ’ল"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ৰ পৰা <xliff:g id="APPNAME">%1$s</xliff:g> পুনঃস্থাপন কৰিবনে?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"এই এপ্টোৱে নেপথ্যত ডাউনল’ড কৰিবলৈ আৰম্ভ কৰিব"</string>
+ <string name="restore" msgid="8460854736328970444">"পুনঃস্থাপন কৰক"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml
index cf3ea84..0807ef7 100644
--- a/packages/PackageInstaller/res/values-az/strings.xml
+++ b/packages/PackageInstaller/res/values-az/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tətbiq quraşdırma bildirişi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Quraşdırıldı"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" quraşdırıldı"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ünvanından bərpa edilsin?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu tətbiq arxa fonda endirilməyə başlayacaq"</string>
+ <string name="restore" msgid="8460854736328970444">"Bərpa edin"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
index 77fe3ba..6b9cd04 100644
--- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
+++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obaveštenje o instaliranju aplikacije"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalirana je"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija „<xliff:g id="APPNAME">%1$s</xliff:g>“ je instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite da vratite <xliff:g id="APPNAME">%1$s</xliff:g> iz <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikacija će započeti preuzimanje u pozadini."</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml
index b10a9e0..9e6e6fd 100644
--- a/packages/PackageInstaller/res/values-be/strings.xml
+++ b/packages/PackageInstaller/res/values-be/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апавяшчэнне пра завяршэнне ўсталявання"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Усталявана"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Усталявана праграма \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Аднавіць праграму \"<xliff:g id="APPNAME">%1$s</xliff:g>\" адсюль: <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Праграма пачне спампоўвацца ў фонавым рэжыме"</string>
+ <string name="restore" msgid="8460854736328970444">"Аднавіць"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml
index 8d4739c..1c91874 100644
--- a/packages/PackageInstaller/res/values-bg/strings.xml
+++ b/packages/PackageInstaller/res/values-bg/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известие, че приложението е инсталирано"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирането бе успешно"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Приложението <xliff:g id="APPNAME">%1$s</xliff:g> бе инсталирано успешно"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Да се възстанови ли <xliff:g id="APPNAME">%1$s</xliff:g> от <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Това приложение ще започне да се изтегля на заден план"</string>
+ <string name="restore" msgid="8460854736328970444">"Възстановяване"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml
index d3c8ad7..5a78f37 100644
--- a/packages/PackageInstaller/res/values-bn/strings.xml
+++ b/packages/PackageInstaller/res/values-bn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"\'অ্যাপ ইনস্টল করা হয়েছে\' বিজ্ঞপ্তি"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ইনস্টল করা হয়েছে"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ইনস্টল করা হয়েছে"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> থেকে <xliff:g id="APPNAME">%1$s</xliff:g> ফিরিয়ে আনবেন?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"এই অ্যাপটি ব্যাকগ্রাউন্ডে ডাউনলোড হওয়া শুরু হবে"</string>
+ <string name="restore" msgid="8460854736328970444">"ফিরিয়ে আনুন"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml
index f93263f0..aed2d22 100644
--- a/packages/PackageInstaller/res/values-bs/strings.xml
+++ b/packages/PackageInstaller/res/values-bs/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavještenje o instaliranoj aplikaciji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" je uspješno instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vratiti aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> s usluge <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Preuzimanje aplikacije će započeti u pozadini"</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml
index 7a60d46..85e5110 100644
--- a/packages/PackageInstaller/res/values-ca/strings.xml
+++ b/packages/PackageInstaller/res/values-ca/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificació d\'aplicació instal·lada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"S\'ha instal·lat correctament"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"S\'ha instal·lat <xliff:g id="APPNAME">%1$s</xliff:g> correctament"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vols restaurar <xliff:g id="APPNAME">%1$s</xliff:g> des de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aquesta aplicació començarà a baixar-se en segon pla"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaura"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml
index 0874214..fc85bca 100644
--- a/packages/PackageInstaller/res/values-cs/strings.xml
+++ b/packages/PackageInstaller/res/values-cs/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Oznámení o nainstalované aplikaci"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Úspěšně nainstalováno"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikace <xliff:g id="APPNAME">%1$s</xliff:g> byla úspěšně nainstalována"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Obnovit aplikaci <xliff:g id="APPNAME">%1$s</xliff:g> z aplikace <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikace se začne stahovat na pozadí"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnovit"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml
index 85032c9..aa6fe8f 100644
--- a/packages/PackageInstaller/res/values-da/strings.xml
+++ b/packages/PackageInstaller/res/values-da/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikation om appinstallation"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Appen er installeret"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" er installeret"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vil du gendanne <xliff:g id="APPNAME">%1$s</xliff:g> fra <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Download af denne app startes i baggrunden"</string>
+ <string name="restore" msgid="8460854736328970444">"Gendan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml
index b638040b..dc23696 100644
--- a/packages/PackageInstaller/res/values-de/strings.xml
+++ b/packages/PackageInstaller/res/values-de/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Installationsbenachrichtigung für App"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Erfolgreich installiert"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" wurde erfolgreich installiert"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> von <xliff:g id="INSTALLERNAME">%1$s</xliff:g> wiederherstellen?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Diese App beginnt im Hintergrund mit dem Herunterladen"</string>
+ <string name="restore" msgid="8460854736328970444">"Wiederherstellen"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml
index 96b582b..ea4eeb6 100644
--- a/packages/PackageInstaller/res/values-el/strings.xml
+++ b/packages/PackageInstaller/res/values-el/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ειδοποίηση εγκατάστασης εφαρμογής"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Εγκαταστάθηκε επιτυχώς"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Η εφαρμογή \"<xliff:g id="APPNAME">%1$s</xliff:g>\" εγκαταστάθηκε επιτυχώς"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Επαναφορά <xliff:g id="APPNAME">%1$s</xliff:g> από <xliff:g id="INSTALLERNAME">%1$s</xliff:g>;"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Η λήψη της εφαρμογής θα ξεκινήσει στο παρασκήνιο"</string>
+ <string name="restore" msgid="8460854736328970444">"Επαναφορά"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml
index 08b8bf1a..0187172 100644
--- a/packages/PackageInstaller/res/values-en-rAU/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml
index da4a8a0..9b31f27 100644
--- a/packages/PackageInstaller/res/values-en-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will begin to download in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml
index 08b8bf1a..0187172 100644
--- a/packages/PackageInstaller/res/values-en-rGB/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml
index 08b8bf1a..0187172 100644
--- a/packages/PackageInstaller/res/values-en-rIN/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed \'<xliff:g id="APPNAME">%1$s</xliff:g>\'"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will start downloading in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml
index 0749a27..67ffce5 100644
--- a/packages/PackageInstaller/res/values-en-rXC/strings.xml
+++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"App installed notification"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Successfully installed"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Successfully installed “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restore <xliff:g id="APPNAME">%1$s</xliff:g> from <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"This app will begin to download in the background"</string>
+ <string name="restore" msgid="8460854736328970444">"Restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml
index 3330e5f..2a8559a 100644
--- a/packages/PackageInstaller/res/values-es-rUS/strings.xml
+++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de app instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Se instaló correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Se instaló correctamente \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"¿Quieres restablecer <xliff:g id="APPNAME">%1$s</xliff:g> desde <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta app comenzará la descarga en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restablecer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml
index c351f15..5e1022b 100644
--- a/packages/PackageInstaller/res/values-es/strings.xml
+++ b/packages/PackageInstaller/res/values-es/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación de aplicación instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Se ha instalado correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> se ha instalado correctamente"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"¿Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta aplicación comenzará a descargarse en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml
index 5ecfbf4..2bd2c04 100644
--- a/packages/PackageInstaller/res/values-et/strings.xml
+++ b/packages/PackageInstaller/res/values-et/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Rakenduse installimise märguanne"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installimine õnnestus"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Rakenduse „<xliff:g id="APPNAME">%1$s</xliff:g>” installimine õnnestus"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Kas taastada rakendus <xliff:g id="APPNAME">%1$s</xliff:g> rakenduse <xliff:g id="INSTALLERNAME">%1$s</xliff:g> kaudu?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Selle rakenduse allalaadimine algab taustal"</string>
+ <string name="restore" msgid="8460854736328970444">"Taasta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml
index ec720ac..574d4ab 100644
--- a/packages/PackageInstaller/res/values-eu/strings.xml
+++ b/packages/PackageInstaller/res/values-eu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Aplikazioa instalatu izanaren jakinarazpena"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalatu da"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Instalatu da \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> aplikaziotik leheneratu nahi duzu <xliff:g id="APPNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Atzeko planoan deskargatuko da aplikazioa"</string>
+ <string name="restore" msgid="8460854736328970444">"Leheneratu"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml
index 7a8b579..1869cb6 100644
--- a/packages/PackageInstaller/res/values-fa/strings.xml
+++ b/packages/PackageInstaller/res/values-fa/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"اعلان نصب برنامه"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"نصب موفقیتآمیز بود"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> باموفقیت نصب شد"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> از <xliff:g id="INSTALLERNAME">%1$s</xliff:g> بازیابی شود؟"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"این برنامه در پسزمینه شروع به بارگیری میکند"</string>
+ <string name="restore" msgid="8460854736328970444">"بازیابی"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml
index a9b6984..8f960ea 100644
--- a/packages/PackageInstaller/res/values-fi/strings.xml
+++ b/packages/PackageInstaller/res/values-fi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Sovellus asennettu ‑ilmoitus"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Asennus onnistui"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g>: asennus onnistui"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Palautetaanko <xliff:g id="APPNAME">%1$s</xliff:g> sovelluksella <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Sovelluksen lataus aloitetaan taustalla"</string>
+ <string name="restore" msgid="8460854736328970444">"Palauta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
index 0ef53b9..647a7b5 100644
--- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml
+++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installation réussie"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Installation de « <xliff:g id="APPNAME">%1$s</xliff:g> » réussie"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurer <xliff:g id="APPNAME">%1$s</xliff:g> à partir de <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Le téléchargement de cette application commencera en arrière-plan"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml
index 5065a22..3cf043b 100644
--- a/packages/PackageInstaller/res/values-fr/strings.xml
+++ b/packages/PackageInstaller/res/values-fr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification d\'application installée"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"L\'application a été installée"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"L\'application <xliff:g id="APPNAME">%1$s</xliff:g> a bien été installée"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurer <xliff:g id="APPNAME">%1$s</xliff:g> depuis <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Cette application commencera à se télécharger en arrière-plan"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurer"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml
index 694218d..eeb1f95 100644
--- a/packages/PackageInstaller/res/values-gl/strings.xml
+++ b/packages/PackageInstaller/res/values-gl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificación da aplicación instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalouse correctamente"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Instalouse correctamente a aplicación <xliff:g id="APPNAME">%1$s</xliff:g>"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Queres restaurar <xliff:g id="APPNAME">%1$s</xliff:g> desde <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta aplicación comezará a descargarse en segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml
index 8f5976c..e1f1887 100644
--- a/packages/PackageInstaller/res/values-gu/strings.xml
+++ b/packages/PackageInstaller/res/values-gu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ઍપ ઇન્સ્ટૉલ થવાનું નોટિફિકેશન"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” સફળતાપૂર્વક ઇન્સ્ટૉલ કરેલ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>માંથી <xliff:g id="APPNAME">%1$s</xliff:g> રિસ્ટોર કરીએ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"બૅકગ્રાઉન્ડમાં આ ઍપ ડાઉનલોડ થવાનું શરૂ થશે"</string>
+ <string name="restore" msgid="8460854736328970444">"રિસ્ટોર કરો"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml
index ddb16dd..642bbd9 100644
--- a/packages/PackageInstaller/res/values-hi/strings.xml
+++ b/packages/PackageInstaller/res/values-hi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ऐप्लिकेशन इंस्टॉल होने की सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"पूरी तरह से इंस्टॉल हो गया है"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” पूरी तरह से इंस्टॉल हो गया है"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> को <xliff:g id="INSTALLERNAME">%1$s</xliff:g> से वापस लाएं?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"यह ऐप्लिकेशन, बैकग्राउंड में डाउनलोड होना शुरू हो जाएगा"</string>
+ <string name="restore" msgid="8460854736328970444">"वापस लाएं"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml
index c758f4f..69ce3f1 100644
--- a/packages/PackageInstaller/res/values-hr/strings.xml
+++ b/packages/PackageInstaller/res/values-hr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obavijest o instaliranoj aplikaciji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspješno instalirano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikacija \"<xliff:g id="APPNAME">%1$s</xliff:g>\" uspješno je instalirana"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite li vratiti aplikaciju <xliff:g id="APPNAME">%1$s</xliff:g> putem aplikacije <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ova aplikacija počet će se preuzimati u pozadini"</string>
+ <string name="restore" msgid="8460854736328970444">"Vrati"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml
index 4fd866d..ea8cfc7 100644
--- a/packages/PackageInstaller/res/values-hu/strings.xml
+++ b/packages/PackageInstaller/res/values-hu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Alkalmazás telepítve értesítés"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sikeresen telepítve"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"A(z) <xliff:g id="APPNAME">%1$s</xliff:g> alkalmazás sikeresen telepítve"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Visszaállítja a(z) <xliff:g id="APPNAME">%1$s</xliff:g> appot innen: <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"A háttérben megkezdődik az app letöltése"</string>
+ <string name="restore" msgid="8460854736328970444">"Visszaállítás"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml
index e5e7cec..a447371 100644
--- a/packages/PackageInstaller/res/values-hy/strings.xml
+++ b/packages/PackageInstaller/res/values-hy/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ծանուցում հավելվածի տեղադրման մասին"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Տեղադրվեց"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը տեղադրվեց"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Վերականգնե՞լ <xliff:g id="APPNAME">%1$s</xliff:g> հավելվածը <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-ից"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Այս հավելվածը կներբեռնվի ֆոնային ռեժիմում"</string>
+ <string name="restore" msgid="8460854736328970444">"Վերականգնել"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml
index a52b63c..9e24424 100644
--- a/packages/PackageInstaller/res/values-in/strings.xml
+++ b/packages/PackageInstaller/res/values-in/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifikasi penginstalan aplikasi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Berhasil diinstal"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Berhasil menginstal “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Pulihkan <xliff:g id="APPNAME">%1$s</xliff:g> dari <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikasi ini akan mulai didownload di latar belakang"</string>
+ <string name="restore" msgid="8460854736328970444">"Pulihkan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml
index b125da1..c24f284 100644
--- a/packages/PackageInstaller/res/values-is/strings.xml
+++ b/packages/PackageInstaller/res/values-is/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Tilkynning um uppsett forrit"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uppsetning tókst"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sett upp"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Endurheimta <xliff:g id="APPNAME">%1$s</xliff:g> úr <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Forritið verður sótt í bakgrunni"</string>
+ <string name="restore" msgid="8460854736328970444">"Endurheimta"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml
index 9ee0882..604d88a 100644
--- a/packages/PackageInstaller/res/values-it/strings.xml
+++ b/packages/PackageInstaller/res/values-it/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notifica relativa alle app installate"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installata"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"App \"<xliff:g id="APPNAME">%1$s</xliff:g>\" installata"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Ripristinare <xliff:g id="APPNAME">%1$s</xliff:g> da <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Il download di quest\'app inizierà in background"</string>
+ <string name="restore" msgid="8460854736328970444">"Ripristina"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml
index 6684ec0..0e37b2e 100644
--- a/packages/PackageInstaller/res/values-iw/strings.xml
+++ b/packages/PackageInstaller/res/values-iw/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"התראה על התקנת האפליקציה"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"הותקנה בהצלחה"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"האפליקציה \"<xliff:g id="APPNAME">%1$s</xliff:g>\" הותקנה"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"לשחזר את <xliff:g id="APPNAME">%1$s</xliff:g> מ-<xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"תהליך ההורדה של האפליקציה יתחיל ברקע"</string>
+ <string name="restore" msgid="8460854736328970444">"שחזור"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml
index 600b6b7..58e46a6 100644
--- a/packages/PackageInstaller/res/values-ja/strings.xml
+++ b/packages/PackageInstaller/res/values-ja/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"アプリのインストールに関する通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"インストールしました"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」をインストールしました"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> から <xliff:g id="APPNAME">%1$s</xliff:g> を復元しますか?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"このアプリのダウンロードをバックグラウンドで開始します"</string>
+ <string name="restore" msgid="8460854736328970444">"復元する"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml
index c8bf93b..bbd63d1 100644
--- a/packages/PackageInstaller/res/values-ka/strings.xml
+++ b/packages/PackageInstaller/res/values-ka/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"შეტყობინება აპის ინსტალაციის შესახებ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"წარმატებით დაინსტალირდა"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ წარმატებით დაინსტალირდა"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"აღვადგინოთ <xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-დან?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ამ აპის ჩამოტვირთვა ფონურ რეჟიმში დაიწყება"</string>
+ <string name="restore" msgid="8460854736328970444">"აღდგენა"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml
index 1ccac10..02843b8 100644
--- a/packages/PackageInstaller/res/values-kk/strings.xml
+++ b/packages/PackageInstaller/res/values-kk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Қолданба орнатылғаны туралы хабарландыру"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Орнатылды"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнатылды"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> қолданбасын <xliff:g id="INSTALLERNAME">%1$s</xliff:g> арқылы қалпына келтіру керек пе?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Бұл қолданба фондық режимде жүктеп алына бастайды."</string>
+ <string name="restore" msgid="8460854736328970444">"Қалпына келтіру"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml
index 3e3ef99..bb84976 100644
--- a/packages/PackageInstaller/res/values-km/strings.xml
+++ b/packages/PackageInstaller/res/values-km/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ការជូនដំណឹងអំពីកម្មវិធីដែលបានដំឡើង"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"បានដំឡើងដោយជោគជ័យហើយ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"បានដំឡើង \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ដោយជោគជ័យហើយ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ស្ដារ <xliff:g id="APPNAME">%1$s</xliff:g> ពី <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ឬ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"កម្មវិធីនេះនឹងចាប់ផ្ដើមទាញយកនៅផ្ទៃខាងក្រោយ"</string>
+ <string name="restore" msgid="8460854736328970444">"ស្ដារ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml
index 9cfe389..476b45d 100644
--- a/packages/PackageInstaller/res/values-kn/strings.xml
+++ b/packages/PackageInstaller/res/values-kn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿರುವ ಕುರಿತು ನೋಟಿಫಿಕೇಶನ್"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ಯಶಸ್ವಿಯಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಆಗಿದೆ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ಆ್ಯಪ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> ನಿಂದ <xliff:g id="APPNAME">%1$s</xliff:g> ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಬೇಕೆ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಡೌನ್ಲೋಡ್ ಆಗಲು ಈ ಆ್ಯಪ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ"</string>
+ <string name="restore" msgid="8460854736328970444">"ಮರುಸ್ಥಾಪಿಸಿ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml
index 271ec90..7ae19ac 100644
--- a/packages/PackageInstaller/res/values-ko/strings.xml
+++ b/packages/PackageInstaller/res/values-ko/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"앱 설치 완료 알림"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"설치 완료"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' 설치 완료"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>에서 <xliff:g id="APPNAME">%1$s</xliff:g> 앱을 복원하시겠습니까?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"백그라운드에서 앱이 다운로드되기 시작합니다"</string>
+ <string name="restore" msgid="8460854736328970444">"복원"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml
index 5e9948d..faf3df2 100644
--- a/packages/PackageInstaller/res/values-ky/strings.xml
+++ b/packages/PackageInstaller/res/values-ky/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Колдонмолорду орноткучтун билдирмелери"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Ийгиликтүү орнотулду"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" орнотулду"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> <xliff:g id="INSTALLERNAME">%1$s</xliff:g> платформасынан калыбына келтирилсинби?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Бул колдонмо фондо жүктөлүп алына баштайт"</string>
+ <string name="restore" msgid="8460854736328970444">"Калыбына келтирүү"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml
index d12bb4b..e9b3e8e 100644
--- a/packages/PackageInstaller/res/values-lo/strings.xml
+++ b/packages/PackageInstaller/res/values-lo/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ການແຈ້ງເຕືອນແອັບທີ່ຕິດຕັ້ງແລ້ວ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ຕິດຕັ້ງສຳເລັດແລ້ວ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"ຕິດຕັ້ງ \"<xliff:g id="APPNAME">%1$s</xliff:g>\" ສຳເລັດແລ້ວ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ກູ້ຄືນ <xliff:g id="APPNAME">%1$s</xliff:g> ຈາກ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ບໍ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ແອັບນີ້ຈະເລີ່ມດາວໂຫຼດໃນພື້ນຫຼັງ"</string>
+ <string name="restore" msgid="8460854736328970444">"ກູ້ຄືນ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml
index 91ae9d1..654dee0 100644
--- a/packages/PackageInstaller/res/values-lt/strings.xml
+++ b/packages/PackageInstaller/res/values-lt/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pranešimas apie įdiegtą programą"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sėkmingai įdiegta"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>“ sėkmingai įdiegta"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Atkurti „<xliff:g id="APPNAME">%1$s</xliff:g>“ iš „<xliff:g id="INSTALLERNAME">%1$s</xliff:g>“?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Šios programos atsisiuntimas bus pradėtas fone"</string>
+ <string name="restore" msgid="8460854736328970444">"Atkurti"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml
index c6f9eb4..2d319fc 100644
--- a/packages/PackageInstaller/res/values-lv/strings.xml
+++ b/packages/PackageInstaller/res/values-lv/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Paziņojums par instalētu lietotni"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Sekmīgi instalēta"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Lietotne “<xliff:g id="APPNAME">%1$s</xliff:g>” sekmīgi instalēta"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vai atjaunot lietotni <xliff:g id="APPNAME">%1$s</xliff:g> no <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Fonā tiks sākta šīs lietotnes lejupielāde."</string>
+ <string name="restore" msgid="8460854736328970444">"Atjaunot"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml
index bc5cb90..e02c3c5 100644
--- a/packages/PackageInstaller/res/values-mk/strings.xml
+++ b/packages/PackageInstaller/res/values-mk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Известување за инсталирана апликација"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Успешно инсталирана"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> е успешно инсталирана"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Да се врати <xliff:g id="APPNAME">%1$s</xliff:g> од <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Апликацијава ќе почне да се презема во заднина"</string>
+ <string name="restore" msgid="8460854736328970444">"Враќање"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml
index a64f87f..2e5dcfb 100644
--- a/packages/PackageInstaller/res/values-ml/strings.xml
+++ b/packages/PackageInstaller/res/values-ml/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്ത അറിയിപ്പ്"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ഇൻസ്റ്റാൾ ചെയ്തു"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ഇൻസ്റ്റാൾ ചെയ്തു"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> എന്നതിൽ നിന്ന് <xliff:g id="APPNAME">%1$s</xliff:g> പുനഃസ്ഥാപിക്കണോ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"പശ്ചാത്തലത്തിൽ ഈ ആപ്പ് ഡൗൺലോഡ് ചെയ്ത് തുടങ്ങും"</string>
+ <string name="restore" msgid="8460854736328970444">"പുനഃസ്ഥാപിക്കുക"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml
index a9365b6..5deda94 100644
--- a/packages/PackageInstaller/res/values-mn/strings.xml
+++ b/packages/PackageInstaller/res/values-mn/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Апп суулгасны мэдэгдэл"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Амжилттай суулгасан"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”-г амжилттай суулгасан"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g>-г <xliff:g id="INSTALLERNAME">%1$s</xliff:g>-с сэргээх үү?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Энэ аппыг дэвсгэрт татаж эхэлнэ"</string>
+ <string name="restore" msgid="8460854736328970444">"Сэргээх"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml
index d6f04b4..53ca403 100644
--- a/packages/PackageInstaller/res/values-mr/strings.xml
+++ b/packages/PackageInstaller/res/values-mr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"अॅप इंस्टॉल सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"यशस्वीरित्या इंस्टॉल केले"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" यशस्वीरित्या इंस्टॉल झाले"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> मधून <xliff:g id="APPNAME">%1$s</xliff:g> रिस्टोअर करायचे आहे का?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"हे ॲप बॅकग्राउंडमध्ये डाउनलोड होण्यास सुरुवात होईल"</string>
+ <string name="restore" msgid="8460854736328970444">"रिस्टोअर करा"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml
index 80f4be3..4b0b560 100644
--- a/packages/PackageInstaller/res/values-ms/strings.xml
+++ b/packages/PackageInstaller/res/values-ms/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Pemberitahuan apl dipasang"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Berjaya dipasang"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Berjaya memasang \"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Pulihkan <xliff:g id="APPNAME">%1$s</xliff:g> daripada <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Apl ini akan mula dimuat turun dalam latar"</string>
+ <string name="restore" msgid="8460854736328970444">"Pulihkan"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml
index 77a45899..302c2c3 100644
--- a/packages/PackageInstaller/res/values-my/strings.xml
+++ b/packages/PackageInstaller/res/values-my/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"အက်ပ်ထည့်သွင်းခြင်း အကြောင်းကြားချက်"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ထည့်သွင်းပြီးပြီ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ကို ထည့်သွင်းပြီးပြီ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> မှ <xliff:g id="APPNAME">%1$s</xliff:g> ကို ပြန်ယူမလား။"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ဤအက်ပ်ကို နောက်ခံတွင် စတင်ဒေါင်းလုဒ်လုပ်ပါမည်"</string>
+ <string name="restore" msgid="8460854736328970444">"ပြန်ယူရန်"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml
index 89d9762..65c0cb8 100644
--- a/packages/PackageInstaller/res/values-nb/strings.xml
+++ b/packages/PackageInstaller/res/values-nb/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Varsel om at appen er installert"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installert"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"«<xliff:g id="APPNAME">%1$s</xliff:g>» er installert"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vil du gjenopprette <xliff:g id="APPNAME">%1$s</xliff:g> fra <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Denne appen begynner å laste ned i bakgrunnen"</string>
+ <string name="restore" msgid="8460854736328970444">"Gjenopprett"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml
index 23a689f..b72218c 100644
--- a/packages/PackageInstaller/res/values-ne/strings.xml
+++ b/packages/PackageInstaller/res/values-ne/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"एपको स्थापना गरिएको सूचना"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"सफलतापूर्वक स्थापना गरियो"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” सफलतापूर्वक स्थापना गरियो"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> बाट <xliff:g id="APPNAME">%1$s</xliff:g> रिस्टोर गर्ने हो?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"यो एप ब्याकग्राउन्डमा डाउनलोड हुन थाल्ने छ"</string>
+ <string name="restore" msgid="8460854736328970444">"रिस्टोर गर्नुहोस्"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml
index 731dc48..a1eb708 100644
--- a/packages/PackageInstaller/res/values-nl/strings.xml
+++ b/packages/PackageInstaller/res/values-nl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Melding dat app is geïnstalleerd"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Installatie voltooid"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\'<xliff:g id="APPNAME">%1$s</xliff:g>\' is geïnstalleerd"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> herstellen via <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Deze app wordt gedownload op de achtergrond"</string>
+ <string name="restore" msgid="8460854736328970444">"Herstellen"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml
index 331852e1..a1c685c 100644
--- a/packages/PackageInstaller/res/values-or/strings.xml
+++ b/packages/PackageInstaller/res/values-or/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ଆପ୍ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇଥିବା ବିଜ୍ଞପ୍ତି"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ସଫଳତାପୂର୍ବକ ଇନ୍ଷ୍ଟଲ୍ କରାଗଲା"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” ସଫଳତାପୂର୍ବକ ଇନ୍ଷ୍ଚଲ୍ କରାଗଲା"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ରୁ <xliff:g id="APPNAME">%1$s</xliff:g>କୁ ରିଷ୍ଟୋର କରିବେ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ଏହି ଆପ ପୃଷ୍ଠପଟରେ ଡାଉନଲୋଡ ହେବା ଆରମ୍ଭ କରିବ"</string>
+ <string name="restore" msgid="8460854736328970444">"ରିଷ୍ଟୋର କରନ୍ତୁ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml
index 5bc4624..1c7fb862 100644
--- a/packages/PackageInstaller/res/values-pa/strings.xml
+++ b/packages/PackageInstaller/res/values-pa/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ਐਪ ਸਥਾਪਨਾ ਦੀ ਸੂਚਨਾ"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤੀ ਗਈ"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"ਕੀ <xliff:g id="APPNAME">%1$s</xliff:g> ਨੂੰ <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ਤੋਂ ਮੁੜ-ਬਹਾਲ ਕਰਨਾ ਹੈ?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ਇਹ ਐਪ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਹੋਣੀ ਸ਼ੁਰੂ ਹੋ ਜਾਵੇਗੀ"</string>
+ <string name="restore" msgid="8460854736328970444">"ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml
index 4aa96f7..8fa11ed 100644
--- a/packages/PackageInstaller/res/values-pl/strings.xml
+++ b/packages/PackageInstaller/res/values-pl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Powiadomienie o zainstalowaniu aplikacji"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Zainstalowano"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Zainstalowano aplikację „<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Przywrócić aplikację <xliff:g id="APPNAME">%1$s</xliff:g> z aplikacji <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ta aplikacja zacznie pobieranie w tle"</string>
+ <string name="restore" msgid="8460854736328970444">"Przywróć"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
index d8713db..71ecb2b3 100644
--- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> usando o app <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"O download desse app será feito em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
index fb2240e..1d5c1a2 100644
--- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml
+++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalada"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"App instalada com êxito"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplicação \"<xliff:g id="APPNAME">%1$s</xliff:g>\" instalada com êxito"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> a partir da <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Esta app vai começar a ser transferida em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml
index d8713db..71ecb2b3 100644
--- a/packages/PackageInstaller/res/values-pt/strings.xml
+++ b/packages/PackageInstaller/res/values-pt/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalado"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Instalação concluída"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” instalado"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restaurar <xliff:g id="APPNAME">%1$s</xliff:g> usando o app <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"O download desse app será feito em segundo plano"</string>
+ <string name="restore" msgid="8460854736328970444">"Restaurar"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml
index fab0c33..810f544 100644
--- a/packages/PackageInstaller/res/values-ro/strings.xml
+++ b/packages/PackageInstaller/res/values-ro/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificare de aplicație instalată"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Aplicația a fost instalată"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"„<xliff:g id="APPNAME">%1$s</xliff:g>” a fost instalată"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Restabilești <xliff:g id="APPNAME">%1$s</xliff:g> din <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Descărcarea aplicației va începe în fundal"</string>
+ <string name="restore" msgid="8460854736328970444">"Restabilește"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml
index 094a19a..e368f12 100644
--- a/packages/PackageInstaller/res/values-ru/strings.xml
+++ b/packages/PackageInstaller/res/values-ru/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Уведомление об установке приложения"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" установлено"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Восстановить приложение \"<xliff:g id="APPNAME">%1$s</xliff:g>\" из <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Приложение начнет скачиваться в фоновом режиме."</string>
+ <string name="restore" msgid="8460854736328970444">"Восстановить"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml
index afc2195..cea50a6 100644
--- a/packages/PackageInstaller/res/values-si/strings.xml
+++ b/packages/PackageInstaller/res/values-si/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"යෙදුම් ස්ථාපනය කළ දැනුම්දීම"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"සාර්ථකව ස්ථාපනය කරන ලදී"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" සාර්ථකව ස්ථාපනය කරන ලදි"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> වෙතින් <xliff:g id="APPNAME">%1$s</xliff:g> ප්රතිසාධනය කරන්න ද?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"මෙම යෙදුම පසුබිමේ බාගැනීම ආරම්භ කරනු ඇත"</string>
+ <string name="restore" msgid="8460854736328970444">"ප්රතිසාධනය කරන්න"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml
index 7a1e70c..34117c3 100644
--- a/packages/PackageInstaller/res/values-sk/strings.xml
+++ b/packages/PackageInstaller/res/values-sk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Upozornenie na inštaláciu aplikácie"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Úspešne nainštalovaná"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Aplikácia <xliff:g id="APPNAME">%1$s</xliff:g> bola nainštalovaná"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Chcete obnoviť <xliff:g id="APPNAME">%1$s</xliff:g> z inštalátora <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Táto aplikácia sa začne sťahovať na pozadí"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnoviť"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml
index 91bcbda..a303759 100644
--- a/packages/PackageInstaller/res/values-sl/strings.xml
+++ b/packages/PackageInstaller/res/values-sl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Obvestilo o namestitvi aplikacije"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Uspešno nameščeno"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Uspešno nameščeno: »<xliff:g id="APPNAME">%1$s</xliff:g>«"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Želite obnoviti aplikacijo <xliff:g id="APPNAME">%1$s</xliff:g> iz aplikacije <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Aplikacija bo začela prenos v ozadju"</string>
+ <string name="restore" msgid="8460854736328970444">"Obnovi"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml
index 566054ed..7f68c8b 100644
--- a/packages/PackageInstaller/res/values-sq/strings.xml
+++ b/packages/PackageInstaller/res/values-sq/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Njoftimi për aplikacionin e instaluar"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"U instalua me sukses"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” u instalua me sukses"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Të restaurohet <xliff:g id="APPNAME">%1$s</xliff:g> nga <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ky aplikacion do të fillojë të shkarkohet në sfond"</string>
+ <string name="restore" msgid="8460854736328970444">"Restauro"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml
index 9e17716..196e784 100644
--- a/packages/PackageInstaller/res/values-sr/strings.xml
+++ b/packages/PackageInstaller/res/values-sr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Обавештење о инсталирању апликације"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Инсталирана је"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Апликација „<xliff:g id="APPNAME">%1$s</xliff:g>“ је инсталирана"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Желите да вратите <xliff:g id="APPNAME">%1$s</xliff:g> из <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Апликација ће започети преузимање у позадини."</string>
+ <string name="restore" msgid="8460854736328970444">"Врати"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml
index 79e5738..0ce696e 100644
--- a/packages/PackageInstaller/res/values-sv/strings.xml
+++ b/packages/PackageInstaller/res/values-sv/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Avisering om installerad app"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Appen har installerats"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> har installerats"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Vill du återställa <xliff:g id="APPNAME">%1$s</xliff:g> från <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Appen börjar ladda ned i bakgrunden"</string>
+ <string name="restore" msgid="8460854736328970444">"Återställ"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml
index f69d612..0a34d81 100644
--- a/packages/PackageInstaller/res/values-sw/strings.xml
+++ b/packages/PackageInstaller/res/values-sw/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Arifa ya kusakinishwa kwa programu"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Imesakinishwa"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"<xliff:g id="APPNAME">%1$s</xliff:g> imesakinishwa"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Je, ungependa kurejesha <xliff:g id="APPNAME">%1$s</xliff:g> kutoka kwenye <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Itaanza kupakua programu hii chinichini"</string>
+ <string name="restore" msgid="8460854736328970444">"Rejesha"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml
index f2d5463..322ce5c 100644
--- a/packages/PackageInstaller/res/values-ta/strings.xml
+++ b/packages/PackageInstaller/res/values-ta/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ஆப்ஸ் நிறுவப்பட்டது குறித்த அறிவிப்பு"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"வெற்றிகரமாக நிறுவப்பட்டது"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" வெற்றிகரமாக நிறுவப்பட்டது"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g>ல் இருந்து <xliff:g id="APPNAME">%1$s</xliff:g> ஐ மீட்டெடுக்கவா?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"இந்த ஆப்ஸ் பின்னணியில் பதிவிறக்கத் தொடங்கும்"</string>
+ <string name="restore" msgid="8460854736328970444">"மீட்டெடு"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml
index 1013e3d..9abc87e 100644
--- a/packages/PackageInstaller/res/values-te/strings.xml
+++ b/packages/PackageInstaller/res/values-te/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"యాప్ ఇన్స్టాల్ చేయబడిందనే నోటిఫికేషన్"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"విజయవంతంగా ఇన్స్టాల్ చేయబడింది"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” విజయవంతంగా ఇన్స్టాల్ చేయబడింది"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="INSTALLERNAME">%1$s</xliff:g> నుండి <xliff:g id="APPNAME">%1$s</xliff:g>ను రీస్టోర్ చేయాలా?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"ఈ యాప్ బ్యాక్గ్రౌండ్లో డౌన్లోడ్ అవ్వడం ప్రారంభమవుతుంది"</string>
+ <string name="restore" msgid="8460854736328970444">"రీస్టోర్ చేయండి"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml
index 35a7611..b1faa1c 100644
--- a/packages/PackageInstaller/res/values-th/strings.xml
+++ b/packages/PackageInstaller/res/values-th/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"การแจ้งเตือนว่าติดตั้งแอปแล้ว"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"ติดตั้งเรียบร้อยแล้ว"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"ติดตั้ง “<xliff:g id="APPNAME">%1$s</xliff:g>” สำเร็จแล้ว"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"กู้คืน <xliff:g id="APPNAME">%1$s</xliff:g> จาก <xliff:g id="INSTALLERNAME">%1$s</xliff:g> ใช่ไหม"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"แอปนี้จะเริ่มดาวน์โหลดในเบื้องหลัง"</string>
+ <string name="restore" msgid="8460854736328970444">"กู้คืน"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml
index 78a1b2b..8e6e2517 100644
--- a/packages/PackageInstaller/res/values-tl/strings.xml
+++ b/packages/PackageInstaller/res/values-tl/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notification na na-install ang app"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Matagumpay na na-install"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Matagumpay na na-install ang “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"I-restore ang <xliff:g id="APPNAME">%1$s</xliff:g> mula sa <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Magsisimulang mag-download ang app na ito sa background"</string>
+ <string name="restore" msgid="8460854736328970444">"I-restore"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml
index a34765c..dc84030 100644
--- a/packages/PackageInstaller/res/values-tr/strings.xml
+++ b/packages/PackageInstaller/res/values-tr/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Uygulama yükleme bildirimi"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Başarıyla yüklendi"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" başarıyla yüklendi"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> uygulaması <xliff:g id="INSTALLERNAME">%1$s</xliff:g> üzerinden geri yüklensin mi?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu uygulama arka planda indirilmeye başlanacak"</string>
+ <string name="restore" msgid="8460854736328970444">"Geri yükle"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml
index 76f3372..3d7083f 100644
--- a/packages/PackageInstaller/res/values-uk/strings.xml
+++ b/packages/PackageInstaller/res/values-uk/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Сповіщення: додаток установлено"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Установлено"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Додаток <xliff:g id="APPNAME">%1$s</xliff:g> установлено"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Відновити додаток <xliff:g id="APPNAME">%1$s</xliff:g> з <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Цей додаток почне завантажуватись у фоновому режимі"</string>
+ <string name="restore" msgid="8460854736328970444">"Відновити"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml
index e621d71..08a8315 100644
--- a/packages/PackageInstaller/res/values-ur/strings.xml
+++ b/packages/PackageInstaller/res/values-ur/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"ایپ انسٹال ہونے کی اطلاع"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"کامیابی کے ساتھ انسٹال ہو گئی"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"\"<xliff:g id="APPNAME">%1$s</xliff:g>\" کامیابی کے ساتھ انسٹال ہو گئی"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> کو <xliff:g id="INSTALLERNAME">%1$s</xliff:g> سے بحال کریں"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"یہ ایپ پس منظر میں ڈاؤن لوڈ ہونا شروع ہو جائے گی"</string>
+ <string name="restore" msgid="8460854736328970444">"بحال کریں"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml
index 7597fb2..894e867 100644
--- a/packages/PackageInstaller/res/values-uz/strings.xml
+++ b/packages/PackageInstaller/res/values-uz/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Ilova oʻrnatilgani haqida bildirishnoma"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"O‘rnatildi"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>” o‘rnatildi"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"<xliff:g id="APPNAME">%1$s</xliff:g> ilovasi <xliff:g id="INSTALLERNAME">%1$s</xliff:g> orqali tiklansinmi?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Bu ilova orqa fonda yuklab olinishi boshlanadi"</string>
+ <string name="restore" msgid="8460854736328970444">"Tiklash"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml
index 53b2a78..14959da 100644
--- a/packages/PackageInstaller/res/values-vi/strings.xml
+++ b/packages/PackageInstaller/res/values-vi/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Thông báo đã cài đặt ứng dụng"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Đã cài đặt thành công"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Đã cài đặt thành công “<xliff:g id="APPNAME">%1$s</xliff:g>”"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Khôi phục <xliff:g id="APPNAME">%1$s</xliff:g> từ <xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Ứng dụng này sẽ bắt đầu tải xuống ở chế độ nền"</string>
+ <string name="restore" msgid="8460854736328970444">"Khôi phục"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
index eb6d0f2..ae12559 100644
--- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"“应用已安装”通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安装"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"“<xliff:g id="APPNAME">%1$s</xliff:g>”安装成功"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要从 <xliff:g id="INSTALLERNAME">%1$s</xliff:g> 中恢复 <xliff:g id="APPNAME">%1$s</xliff:g> 吗?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"系统将开始在后台下载此应用"</string>
+ <string name="restore" msgid="8460854736328970444">"恢复"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
index 883a6b1..5a79817 100644
--- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"已成功安裝"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"「<xliff:g id="APPNAME">%1$s</xliff:g>」已成功安裝"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要從「<xliff:g id="INSTALLERNAME">%1$s</xliff:g>」還原「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"此應用程式將開始在背景下載"</string>
+ <string name="restore" msgid="8460854736328970444">"還原"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
index 0d9e266..873392b 100644
--- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml
+++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"「應用程式已安裝」通知"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"安裝成功"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"已成功安裝「<xliff:g id="APPNAME">%1$s</xliff:g>」"</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"要從「<xliff:g id="INSTALLERNAME">%1$s</xliff:g>」還原「<xliff:g id="APPNAME">%1$s</xliff:g>」嗎?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"系統將開始在背景下載這個應用程式"</string>
+ <string name="restore" msgid="8460854736328970444">"還原"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml
index 98c75e8..8ff1e38 100644
--- a/packages/PackageInstaller/res/values-zu/strings.xml
+++ b/packages/PackageInstaller/res/values-zu/strings.xml
@@ -103,4 +103,7 @@
<string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Isaziso sokufakwa kohlelo lokusebenza"</string>
<string name="notification_installation_success_message" msgid="6450467996056038442">"Ifakwe ngempumelelo"</string>
<string name="notification_installation_success_status" msgid="3172502643504323321">"Kufakwe ngempumelelo i-\"<xliff:g id="APPNAME">%1$s</xliff:g>\""</string>
+ <string name="unarchive_application_title" msgid="7958278328280721421">"Buyisela i-<xliff:g id="APPNAME">%1$s</xliff:g> ukusuka ku-<xliff:g id="INSTALLERNAME">%1$s</xliff:g>?"</string>
+ <string name="unarchive_body_text" msgid="8244155079861708964">"Le app izoqala ukudawuniloda ingemuva"</string>
+ <string name="restore" msgid="8460854736328970444">"Buyisela"</string>
</resources>
diff --git a/packages/PackageInstaller/res/values/strings.xml b/packages/PackageInstaller/res/values/strings.xml
index 0a2e880..8f60c97 100644
--- a/packages/PackageInstaller/res/values/strings.xml
+++ b/packages/PackageInstaller/res/values/strings.xml
@@ -131,6 +131,8 @@
<string name="uninstall_application_text_current_user_clone_profile">Do you want to delete this app?</string>
<!-- [CHAR LIMIT=none] -->
<string name="uninstall_application_text_with_clone_instance">Do you want to uninstall this app? <xliff:g id="package_label">%1$s</xliff:g> clone will also be deleted.</string>
+ <!-- [CHAR LIMIT=none] -->
+ <string name="uninstall_application_text_current_user_private_profile">Do you want to uninstall this app from your private space?</string>
<!-- Label for the notification channel containing notifications for current uninstall operations [CHAR LIMIT=40] -->
<string name="uninstalling_notification_channel">Running uninstalls</string>
@@ -267,4 +269,86 @@
<!-- The action to restore (i.e. re-install, re-download) an app after parts of the app have been previously moved
into the cloud for temporary storage. [CHAR LIMIT=15] -->
<string name="restore">Restore</string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the associated download
+ cannot happen immediately because the device is offline (has no internet connection.
+ [CHAR LIMIT=50] -->
+ <string name="unarchive_error_offline_title">You\'re offline</string>
+
+ <!-- Dialog body test shown when the user is trying to restore an app but the associated download
+ cannot happen immediately because the device is offline (has no internet connection.
+ [CHAR LIMIT=none] -->
+ <string name="unarchive_error_offline_body">
+ This app will automatically restore when you\'re connected to the internet
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but a generic error happened.
+ [CHAR LIMIT=50] -->
+ <string name="unarchive_error_generic_title">Something went wrong</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but a generic error happened.
+ [CHAR LIMIT=none] -->
+ <string name="unarchive_error_generic_body">
+ There was a problem trying to restore this app
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the device is out of
+ storage. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_storage_title">Not enough storage</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the device is out of
+ storage. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_storage_body">
+ To restore this app, you can free up space on this device. Storage
+ required: <xliff:g id="bytes" example="100 MB">%1$s</xliff:g>
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the installer needs to
+ perform an additional action. [CHAR LIMIT=50] -->
+ <string name="unarchive_action_required_title">Action required</string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer needs to
+ perform an additional action. [CHAR LIMIT=none] -->
+ <string name="unarchive_action_required_body">
+ Follow the next steps to restore this app
+ </string>
+ <!-- Dialog title shown when the user is trying to restore an app but the installer responsible
+ for the action is in a disabled state. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_installer_disabled_title">
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> is disabled
+ </string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer responsible
+ for the action is in a disabled state. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_installer_disabled_body">
+ To restore this app, enable the
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> in Settings
+ </string>
+
+ <!-- Dialog title shown when the user is trying to restore an app but the installer responsible
+ for the action is uninstalled. [CHAR LIMIT=50] -->
+ <string name="unarchive_error_installer_uninstalled_title">
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g> is uninstalled
+ </string>
+
+ <!-- Dialog body shown when the user is trying to restore an app but the installer responsible
+ for the action is uninstalled. [CHAR LIMIT=none] -->
+ <string name="unarchive_error_installer_uninstalled_body">
+ To restore this app, you\'ll need to install
+ <xliff:g id="installername" example="App Store">%1$s</xliff:g>
+ </string>
+
+ <!-- Dialog action to continue with the next action. [CHAR LIMIT=30] -->
+ <string name="unarchive_action_required_continue">Continue</string>
+
+ <!-- Dialog action to clear device storage, as in deleting some apps or photos to free up bytes
+ [CHAR LIMIT=30] -->
+ <string name="unarchive_clear_storage_button">Clear storage</string>
+
+ <!-- Dialog action to open the Settings app. [CHAR LIMIT=30] -->
+ <string name="unarchive_settings_button">Settings</string>
+
+ <!-- Dialog action to close a dialog. [CHAR LIMIT=30] -->
+ <string name="close">Close</string>
+
</resources>
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
index daedb1a..8d8254a 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java
@@ -298,7 +298,14 @@
broadcastIntent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
- session.commit(pendingIntent.getIntentSender());
+ try {
+ session.commit(pendingIntent.getIntentSender());
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Cannot install package: ", e);
+ launchFailure(PackageInstaller.STATUS_FAILURE,
+ PackageManager.INSTALL_FAILED_INTERNAL_ERROR, null);
+ return;
+ }
mCancelButton.setEnabled(false);
setFinishOnTouchOutside(false);
} else {
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java
new file mode 100644
index 0000000..78d2f88
--- /dev/null
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorActivity.java
@@ -0,0 +1,79 @@
+/*
+ * 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.packageinstaller;
+
+import android.app.Activity;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.pm.PackageInstaller;
+import android.os.Bundle;
+
+import java.util.Objects;
+
+public class UnarchiveErrorActivity extends Activity {
+
+ static final String EXTRA_REQUIRED_BYTES =
+ "com.android.content.pm.extra.UNARCHIVE_EXTRA_REQUIRED_BYTES";
+ static final String EXTRA_INSTALLER_PACKAGE_NAME =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_PACKAGE_NAME";
+ static final String EXTRA_INSTALLER_TITLE =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_TITLE";
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(null);
+
+ Bundle extras = getIntent().getExtras();
+ int unarchivalStatus = extras.getInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS);
+ long requiredBytes = extras.getLong(EXTRA_REQUIRED_BYTES);
+ PendingIntent intent = extras.getParcelable(Intent.EXTRA_INTENT, PendingIntent.class);
+ String installerPackageName = extras.getString(EXTRA_INSTALLER_PACKAGE_NAME);
+ // We cannot derive this from the package name because the installer might not be installed
+ // anymore.
+ String installerAppTitle = extras.getString(EXTRA_INSTALLER_TITLE);
+
+ if (unarchivalStatus == PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED) {
+ Objects.requireNonNull(intent);
+ }
+
+ FragmentTransaction ft = getFragmentManager().beginTransaction();
+ Fragment prev = getFragmentManager().findFragmentByTag("dialog");
+ if (prev != null) {
+ ft.remove(prev);
+ }
+
+ Bundle args = new Bundle();
+ args.putInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS, unarchivalStatus);
+ args.putLong(EXTRA_REQUIRED_BYTES, requiredBytes);
+ if (intent != null) {
+ args.putParcelable(Intent.EXTRA_INTENT, intent);
+ }
+ if (installerPackageName != null) {
+ args.putString(EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
+ }
+ if (installerAppTitle != null) {
+ args.putString(EXTRA_INSTALLER_TITLE, installerAppTitle);
+ }
+
+ DialogFragment fragment = new UnarchiveErrorFragment();
+ fragment.setArguments(args);
+ fragment.show(ft, "dialog");
+ }
+}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java
new file mode 100644
index 0000000..d33433f
--- /dev/null
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UnarchiveErrorFragment.java
@@ -0,0 +1,196 @@
+/*
+ * 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.packageinstaller;
+
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.PendingIntent;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.PackageInstaller;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.text.format.Formatter;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+public class UnarchiveErrorFragment extends DialogFragment implements
+ DialogInterface.OnClickListener {
+
+ private static final String TAG = "UnarchiveErrorFragment";
+
+ private int mStatus;
+
+ @Nullable
+ private PendingIntent mExtraIntent;
+
+ @Nullable
+ private String mInstallerPackageName;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ Bundle args = getArguments();
+ mStatus = args.getInt(PackageInstaller.EXTRA_UNARCHIVE_STATUS, -1);
+ mExtraIntent = args.getParcelable(Intent.EXTRA_INTENT, PendingIntent.class);
+ long requiredBytes = args.getLong(UnarchiveErrorActivity.EXTRA_REQUIRED_BYTES);
+ mInstallerPackageName = args.getString(
+ UnarchiveErrorActivity.EXTRA_INSTALLER_PACKAGE_NAME);
+ String installerAppTitle = args.getString(UnarchiveErrorActivity.EXTRA_INSTALLER_TITLE);
+
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
+
+ dialogBuilder.setTitle(getDialogTitle(mStatus, installerAppTitle));
+ dialogBuilder.setMessage(getBodyText(mStatus, installerAppTitle, requiredBytes));
+
+ addButtons(dialogBuilder, mStatus);
+
+ return dialogBuilder.create();
+ }
+
+ private void addButtons(AlertDialog.Builder dialogBuilder, int status) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ dialogBuilder.setPositiveButton(R.string.unarchive_action_required_continue, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ dialogBuilder.setPositiveButton(R.string.unarchive_clear_storage_button, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ dialogBuilder.setPositiveButton(R.string.external_sources_settings, this);
+ dialogBuilder.setNegativeButton(R.string.close, this);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ dialogBuilder.setPositiveButton(android.R.string.ok, this);
+ break;
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ private String getBodyText(int status, String installerAppTitle, long requiredBytes) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ return getString(R.string.unarchive_action_required_body);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ return String.format(getString(R.string.unarchive_error_storage_body),
+ Formatter.formatShortFileSize(getActivity(), requiredBytes));
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ return getString(R.string.unarchive_error_offline_body);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ return String.format(getString(R.string.unarchive_error_installer_disabled_body),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ return String.format(
+ getString(R.string.unarchive_error_installer_uninstalled_body),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ return getString(R.string.unarchive_error_generic_body);
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ private String getDialogTitle(int status, String installerAppTitle) {
+ switch (status) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ return getString(R.string.unarchive_action_required_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ return getString(R.string.unarchive_error_storage_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY:
+ return getString(R.string.unarchive_error_offline_title);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ return String.format(getString(R.string.unarchive_error_installer_disabled_title),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED:
+ return String.format(
+ getString(R.string.unarchive_error_installer_uninstalled_title),
+ installerAppTitle);
+ case PackageInstaller.UNARCHIVAL_GENERIC_ERROR:
+ return getString(R.string.unarchive_error_generic_title);
+ default:
+ // This should never happen through normal API usage.
+ throw new IllegalArgumentException("Invalid unarchive status " + status);
+ }
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which != Dialog.BUTTON_POSITIVE) {
+ return;
+ }
+
+ try {
+ onClickInternal();
+ } catch (IntentSender.SendIntentException e) {
+ Log.e(TAG, "Failed to start intent after onClick.", e);
+ }
+ }
+
+ private void onClickInternal() throws IntentSender.SendIntentException {
+ Activity activity = getActivity();
+ if (activity == null) {
+ // This probably shouldn't happen in practice.
+ Log.i(TAG, "Lost reference to activity, cannot act onClick.");
+ return;
+ }
+
+ switch (mStatus) {
+ case PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED:
+ activity.startIntentSender(mExtraIntent.getIntentSender(), /* fillInIntent= */
+ null, /* flagsMask= */ 0, FLAG_ACTIVITY_NEW_TASK, /* extraFlags= */ 0);
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE:
+ if (mExtraIntent != null) {
+ activity.startIntentSender(mExtraIntent.getIntentSender(), /* fillInIntent= */
+ null, /* flagsMask= */ 0, FLAG_ACTIVITY_NEW_TASK, /* extraFlags= */ 0);
+ } else {
+ Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
+ startActivity(intent);
+ }
+ break;
+ case PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED:
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ Uri uri = Uri.fromParts("package", mInstallerPackageName, null);
+ intent.setData(uri);
+ startActivity(intent);
+ break;
+ default:
+ // Do nothing. The rest of the dialogs are purely informational.
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ super.onDismiss(dialog);
+ if (isAdded()) {
+ getActivity().finish();
+ }
+ }
+}
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
index 4e28d77..09be768 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallUninstalling.java
@@ -116,6 +116,7 @@
int flags = allUsers ? PackageManager.DELETE_ALL_USERS : 0;
flags |= keepData ? PackageManager.DELETE_KEEP_DATA : 0;
+ flags |= getIntent().getIntExtra(PackageInstaller.EXTRA_DELETE_FLAGS, 0);
createContextAsUser(user, 0).getPackageManager().getPackageInstaller().uninstall(
new VersionedPackage(mAppInfo.packageName,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
index ba627e9..5c9b728 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
@@ -19,6 +19,7 @@
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.content.pm.Flags.usePiaV2;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+
import static com.android.packageinstaller.PackageUtil.getMaxTargetSdkVersionForUid;
import android.Manifest;
@@ -55,8 +56,8 @@
import com.android.packageinstaller.television.ErrorFragment;
import com.android.packageinstaller.television.UninstallAlertFragment;
import com.android.packageinstaller.television.UninstallAppProgress;
-
import com.android.packageinstaller.v2.ui.UninstallLaunch;
+
import java.util.List;
/*
@@ -76,6 +77,7 @@
public boolean allUsers;
public UserHandle user;
public PackageManager.UninstallCompleteCallback callback;
+ public int deleteFlags;
}
private String mPackageName;
@@ -226,10 +228,26 @@
// Continue as the ActivityInfo isn't critical.
}
}
+ parseDeleteFlags(intent);
showConfirmationDialog();
}
+ /**
+ * Parses specific {@link android.content.pm.PackageManager.DeleteFlags} from {@link Intent}
+ * to archive an app if requested.
+ *
+ * Do not parse any flags because developers might pass here any flags which might cause
+ * unintended behaviour.
+ * For more context {@link com.android.server.pm.PackageArchiver#requestArchive}.
+ */
+ private void parseDeleteFlags(Intent intent) {
+ int deleteFlags = intent.getIntExtra(PackageInstaller.EXTRA_DELETE_FLAGS, 0);
+ int archive = deleteFlags & PackageManager.DELETE_ARCHIVE;
+ int keepData = deleteFlags & PackageManager.DELETE_KEEP_DATA;
+ mDialogInfo.deleteFlags = archive | keepData;
+ }
+
public DialogInfo getDialogInfo() {
return mDialogInfo;
}
@@ -347,7 +365,10 @@
if (returnResult || getCallingActivity() != null) {
newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
}
-
+ if (mDialogInfo.deleteFlags != 0) {
+ newIntent.putExtra(PackageInstaller.EXTRA_DELETE_FLAGS,
+ mDialogInfo.deleteFlags);
+ }
startActivity(newIntent);
} else {
int uninstallId;
@@ -393,6 +414,7 @@
int flags = mDialogInfo.allUsers ? PackageManager.DELETE_ALL_USERS : 0;
flags |= keepData ? PackageManager.DELETE_KEEP_DATA : 0;
+ flags |= mDialogInfo.deleteFlags;
createContextAsUser(mDialogInfo.user, 0).getPackageManager().getPackageInstaller()
.uninstall(new VersionedPackage(mDialogInfo.appInfo.packageName,
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
index d113878..e889050 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/handheld/UninstallAlertDialogFragment.java
@@ -30,6 +30,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
+import android.os.Flags;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
@@ -157,6 +158,12 @@
mIsClonedApp = true;
messageBuilder.append(getString(
R.string.uninstall_application_text_current_user_clone_profile));
+ } else if (Flags.allowPrivateProfile()
+ && customUserManager.isPrivateProfile()
+ && customUserManager.isSameProfileGroup(dialogInfo.user, myUserHandle)) {
+ messageBuilder.append(getString(
+ R.string.uninstall_application_text_current_user_private_profile,
+ userName));
} else {
messageBuilder.append(
getString(R.string.uninstall_application_text_user, userName));
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
index 6979825..e4befc2 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml
@@ -70,6 +70,7 @@
<style name="SettingsSwitchPreferenceCompat.SettingsLib" parent="@style/Preference.SwitchPreferenceCompat.Material">
<item name="layout">@layout/settingslib_preference</item>
+ <item name="singleLineTitle">false</item>
<item name="iconSpaceReserved">@bool/settingslib_config_icon_space_reserved</item>
</style>
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
index 8386bc1..f216abb 100644
--- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
+++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/card/CardPageProvider.kt
@@ -17,24 +17,32 @@
package com.android.settingslib.spa.gallery.card
import android.os.Bundle
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Error
import androidx.compose.material.icons.outlined.PowerOff
import androidx.compose.material.icons.outlined.Shield
import androidx.compose.material.icons.outlined.WarningAmber
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.navigator
+import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.widget.card.CardButton
import com.android.settingslib.spa.widget.card.CardModel
import com.android.settingslib.spa.widget.card.SettingsCard
import com.android.settingslib.spa.widget.card.SettingsCollapsibleCard
+import com.android.settingslib.spa.widget.card.SettingsCardContent
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
@@ -50,6 +58,7 @@
SettingsCardWithIcon()
SettingsCardWithoutIcon()
SampleSettingsCollapsibleCard()
+ SampleSettingsCardContent()
}
}
@@ -108,6 +117,32 @@
)
}
+ @Composable
+ fun SampleSettingsCardContent() {
+ SettingsCard {
+ SettingsCardContent {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .clickable { }
+ .padding(SettingsDimension.dialogItemPadding),
+ ) {
+ Text(text = "Abc")
+ }
+ }
+ SettingsCardContent {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .clickable { }
+ .padding(SettingsDimension.dialogItemPadding),
+ ) {
+ Text(text = "123")
+ }
+ }
+ }
+ }
+
fun buildInjectEntry(): SettingsEntryBuilder {
return SettingsEntryBuilder.createInject(owner = createSettingsPage())
.setUiLayoutFn {
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
index 8c862d4..f7c5414 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/theme/SettingsShape.kt
@@ -20,6 +20,8 @@
import androidx.compose.ui.unit.dp
object SettingsShape {
+ val CornerExtraSmall = RoundedCornerShape(4.dp)
+
val CornerMedium = RoundedCornerShape(12.dp)
val CornerExtraLarge = RoundedCornerShape(28.dp)
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
index 10e2686..4379278 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCard.kt
@@ -36,10 +36,13 @@
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.debug.UiModePreviews
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge
+import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.ui.SettingsBody
import com.android.settingslib.spa.widget.ui.SettingsTitle
@@ -49,7 +52,7 @@
Card(
shape = CornerExtraLarge,
colors = CardDefaults.cardColors(
- containerColor = SettingsTheme.colorScheme.surface,
+ containerColor = Color.Transparent,
),
modifier = Modifier
.fillMaxWidth()
@@ -62,6 +65,20 @@
}
@Composable
+fun SettingsCardContent(content: @Composable ColumnScope.() -> Unit) {
+ Card(
+ shape = CornerExtraSmall,
+ colors = CardDefaults.cardColors(
+ containerColor = SettingsTheme.colorScheme.surface,
+ ),
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(vertical = 1.dp),
+ content = content,
+ )
+}
+
+@Composable
fun SettingsCard(model: CardModel) {
SettingsCard {
SettingsCardImpl(model)
@@ -70,14 +87,16 @@
@Composable
internal fun SettingsCardImpl(model: CardModel) {
- Column(
- modifier = Modifier.padding(SettingsDimension.itemPaddingStart),
- verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround)
- ) {
- CardIcon(model.imageVector)
- SettingsTitle(model.title)
- SettingsBody(model.text)
- Buttons(model.buttons)
+ SettingsCardContent {
+ Column(
+ modifier = Modifier.padding(SettingsDimension.itemPaddingStart),
+ verticalArrangement = Arrangement.spacedBy(SettingsDimension.itemPaddingAround)
+ ) {
+ CardIcon(model.imageVector)
+ SettingsTitle(model.title)
+ SettingsBody(model.text)
+ Buttons(model.buttons)
+ }
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
index 7d10645..bf192a1 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/card/SettingsCollapsibleCard.kt
@@ -30,7 +30,6 @@
import androidx.compose.material.icons.outlined.Error
import androidx.compose.material.icons.outlined.PowerOff
import androidx.compose.material.icons.outlined.Shield
-import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
@@ -54,18 +53,16 @@
fun SettingsCollapsibleCard(
title: String,
imageVector: ImageVector,
- models: List<CardModel>
+ models: List<CardModel>,
) {
var expanded by rememberSaveable { mutableStateOf(false) }
SettingsCard {
- Header(title, imageVector, models.size, expanded) { expanded = it }
+ SettingsCardContent {
+ Header(title, imageVector, models.size, expanded) { expanded = it }
+ }
AnimatedVisibility(expanded) {
Column {
for (model in models) {
- HorizontalDivider(
- thickness = SettingsDimension.paddingSmall,
- color = MaterialTheme.colorScheme.surface,
- )
SettingsCardImpl(model)
}
}
diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
index 7ca15d9..e761a33 100644
--- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
+++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/chart/BarChart.kt
@@ -86,6 +86,10 @@
*/
val yAxisLabelCount: Int
get() = 3
+
+ /** If set to true, touch gestures are enabled on the [BarChart]. */
+ val enableBarchartTouch: Boolean
+ get() = true
}
data class BarChartData(
@@ -127,6 +131,7 @@
legend.isEnabled = false
extraBottomOffset = 4f
setScaleEnabled(false)
+ setTouchEnabled(barChartModel.enableBarchartTouch)
xAxis.apply {
position = XAxis.XAxisPosition.BOTTOM
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
similarity index 71%
rename from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt
rename to packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
index de5c558..8f67354 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalFlow.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/database/ContentChangeFlow.kt
@@ -14,12 +14,11 @@
* limitations under the License.
*/
-package com.android.settingslib.spaprivileged.settingsprovider
+package com.android.settingslib.spaprivileged.database
import android.content.Context
import android.database.ContentObserver
-import android.os.Handler
-import android.provider.Settings
+import android.net.Uri
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
@@ -27,20 +26,19 @@
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.flowOn
-internal fun <T> Context.settingsGlobalFlow(
- name: String,
- sendInitialValue: Boolean = true,
- value: () -> T,
-): Flow<T> = callbackFlow {
- val contentObserver = object : ContentObserver(Handler.getMain()) {
+/** Content change flow for the given [uri]. */
+internal fun Context.contentChangeFlow(
+ uri: Uri,
+ sendInitial: Boolean = true,
+): Flow<Unit> = callbackFlow {
+ val contentObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
- trySend(value())
+ trySend(Unit)
}
}
- val uri = Settings.Global.getUriFor(name)
contentResolver.registerContentObserver(uri, false, contentObserver)
- if (sendInitialValue) {
- trySend(value())
+ if (sendInitial) {
+ trySend(Unit)
}
awaitClose { contentResolver.unregisterContentObserver(contentObserver) }
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt
similarity index 91%
rename from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt
rename to packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt
index 8e28bf8..5d67f57 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBoolean.kt
@@ -22,13 +22,15 @@
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
fun Context.settingsGlobalBoolean(name: String, defaultValue: Boolean = false):
ReadWriteProperty<Any?, Boolean> = SettingsGlobalBooleanDelegate(this, name, defaultValue)
fun Context.settingsGlobalBooleanFlow(name: String, defaultValue: Boolean = false): Flow<Boolean> {
val value by settingsGlobalBoolean(name, defaultValue)
- return settingsGlobalFlow(name) { value }
+ return settingsGlobalChangeFlow(name).map { value }.distinctUntilChanged()
}
private class SettingsGlobalBooleanDelegate(
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt
similarity index 82%
rename from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
rename to packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt
index 4098987..675b2e5 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlow.kt
@@ -17,7 +17,9 @@
package com.android.settingslib.spaprivileged.settingsprovider
import android.content.Context
+import android.provider.Settings
+import com.android.settingslib.spaprivileged.database.contentChangeFlow
import kotlinx.coroutines.flow.Flow
fun Context.settingsGlobalChangeFlow(name: String, sendInitialValue: Boolean = true): Flow<Unit> =
- settingsGlobalFlow(name, sendInitialValue) { }
+ contentChangeFlow(Settings.Global.getUriFor(name), sendInitialValue)
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt
similarity index 67%
copy from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt
copy to packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt
index 8e28bf8..25090a4 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepository.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBoolean.kt
@@ -19,19 +19,22 @@
import android.content.ContentResolver
import android.content.Context
import android.provider.Settings
+import com.android.settingslib.spaprivileged.database.contentChangeFlow
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.map
-fun Context.settingsGlobalBoolean(name: String, defaultValue: Boolean = false):
- ReadWriteProperty<Any?, Boolean> = SettingsGlobalBooleanDelegate(this, name, defaultValue)
+fun Context.settingsSecureBoolean(name: String, defaultValue: Boolean = false):
+ ReadWriteProperty<Any?, Boolean> = SettingsSecureBooleanDelegate(this, name, defaultValue)
-fun Context.settingsGlobalBooleanFlow(name: String, defaultValue: Boolean = false): Flow<Boolean> {
- val value by settingsGlobalBoolean(name, defaultValue)
- return settingsGlobalFlow(name) { value }
+fun Context.settingsSecureBooleanFlow(name: String, defaultValue: Boolean = false): Flow<Boolean> {
+ val value by settingsSecureBoolean(name, defaultValue)
+ return contentChangeFlow(Settings.Secure.getUriFor(name)).map { value }.distinctUntilChanged()
}
-private class SettingsGlobalBooleanDelegate(
+private class SettingsSecureBooleanDelegate(
context: Context,
private val name: String,
private val defaultValue: Boolean = false,
@@ -40,9 +43,9 @@
private val contentResolver: ContentResolver = context.contentResolver
override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean =
- Settings.Global.getInt(contentResolver, name, if (defaultValue) 1 else 0) != 0
+ Settings.Secure.getInt(contentResolver, name, if (defaultValue) 1 else 0) != 0
override fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) {
- Settings.Global.putInt(contentResolver, name, if (value) 1 else 0)
+ Settings.Secure.putInt(contentResolver, name, if (value) 1 else 0)
}
}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
index 45295b0..f306918 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt
@@ -89,7 +89,7 @@
@Composable
fun FooterAppVersion(showPackageName: Boolean = rememberIsDevelopmentSettingsEnabled()) {
val context = LocalContext.current
- val footer = remember(showPackageName) {
+ val footer = remember(packageInfo, showPackageName) {
val list = mutableListOf<String>()
packageInfo.versionNameBidiWrapped?.let {
list += context.getString(R.string.version_text, it)
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt
index 626c913..7a4f81c 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt
@@ -37,7 +37,7 @@
@Composable
fun ApplicationInfo.getStorageSize(): State<String> {
val context = LocalContext.current
- return remember {
+ return remember(this) {
flow {
val sizeBytes = calculateSizeBytes(context)
this.emit(if (sizeBytes != null) Formatter.formatFileSize(context, sizeBytes) else "")
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
index 44973a7..f292231 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppListRepositoryTest.kt
@@ -126,10 +126,7 @@
val flags = argumentCaptor<ApplicationInfoFlags> {
verify(packageManager).getInstalledApplicationsAsUser(capture(), eq(ADMIN_USER_ID))
}.firstValue
- assertThat(flags.value).isEqualTo(
- PackageManager.MATCH_DISABLED_COMPONENTS or
- PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
- )
+ assertThat(flags.value and PackageManager.MATCH_ANY_USER.toLong()).isEqualTo(0L)
}
@Test
@@ -276,21 +273,6 @@
}
@Test
- fun loadApps_archivedAppsDisabled() = runTest {
- mockInstalledApplications(listOf(NORMAL_APP), ADMIN_USER_ID)
- val appList = repository.loadApps(userId = ADMIN_USER_ID)
-
- assertThat(appList).containsExactly(NORMAL_APP)
- val flags = argumentCaptor<ApplicationInfoFlags> {
- verify(packageManager).getInstalledApplicationsAsUser(capture(), eq(ADMIN_USER_ID))
- }.firstValue
- assertThat(flags.value).isEqualTo(
- PackageManager.MATCH_DISABLED_COMPONENTS or
- PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
- )
- }
-
- @Test
fun showSystemPredicate_showSystem() = runTest {
val app = SYSTEM_APP
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt
similarity index 98%
rename from packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt
rename to packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt
index 996c2d5..70b38fe 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanTest.kt
@@ -30,7 +30,7 @@
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-class SettingsGlobalBooleanRepositoryTest {
+class SettingsGlobalBooleanTest {
private val context: Context = ApplicationProvider.getApplicationContext()
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
similarity index 95%
rename from packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt
rename to packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
index 37e00e6..2e6a396 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeFlowTest.kt
@@ -29,7 +29,7 @@
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-class SettingsGlobalChangeRepositoryTest {
+class SettingsGlobalChangeFlowTest {
private val context: Context = ApplicationProvider.getApplicationContext()
@@ -52,7 +52,7 @@
var value by context.settingsGlobalBoolean(TEST_NAME)
value = false
- val flow = context.settingsGlobalBooleanFlow(TEST_NAME)
+ val flow = context.settingsGlobalChangeFlow(TEST_NAME)
value = true
assertThat(flow.toListWithTimeout()).hasSize(1)
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt
similarity index 67%
copy from packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt
copy to packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt
index 996c2d5..29a89be 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalBooleanRepositoryTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsSecureBooleanTest.kt
@@ -30,74 +30,74 @@
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
-class SettingsGlobalBooleanRepositoryTest {
+class SettingsSecureBooleanTest {
private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun getValue_setTrue_returnTrue() {
- Settings.Global.putInt(context.contentResolver, TEST_NAME, 1)
+ Settings.Secure.putInt(context.contentResolver, TEST_NAME, 1)
- val value by context.settingsGlobalBoolean(TEST_NAME)
+ val value by context.settingsSecureBoolean(TEST_NAME)
assertThat(value).isTrue()
}
@Test
fun getValue_setFalse_returnFalse() {
- Settings.Global.putInt(context.contentResolver, TEST_NAME, 0)
+ Settings.Secure.putInt(context.contentResolver, TEST_NAME, 0)
- val value by context.settingsGlobalBoolean(TEST_NAME)
+ val value by context.settingsSecureBoolean(TEST_NAME)
assertThat(value).isFalse()
}
@Test
fun setValue_setTrue_returnTrue() {
- var value by context.settingsGlobalBoolean(TEST_NAME)
+ var value by context.settingsSecureBoolean(TEST_NAME)
value = true
- assertThat(Settings.Global.getInt(context.contentResolver, TEST_NAME, 0)).isEqualTo(1)
+ assertThat(Settings.Secure.getInt(context.contentResolver, TEST_NAME, 0)).isEqualTo(1)
}
@Test
fun setValue_setFalse_returnFalse() {
- var value by context.settingsGlobalBoolean(TEST_NAME)
+ var value by context.settingsSecureBoolean(TEST_NAME)
value = false
- assertThat(Settings.Global.getInt(context.contentResolver, TEST_NAME, 1)).isEqualTo(0)
+ assertThat(Settings.Secure.getInt(context.contentResolver, TEST_NAME, 1)).isEqualTo(0)
}
@Test
- fun settingsGlobalBooleanFlow_valueNotChanged() = runBlocking {
- var value by context.settingsGlobalBoolean(TEST_NAME)
+ fun settingsSecureBooleanFlow_valueNotChanged() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
value = false
- val flow = context.settingsGlobalBooleanFlow(TEST_NAME)
+ val flow = context.settingsSecureBooleanFlow(TEST_NAME)
assertThat(flow.firstWithTimeoutOrNull()).isFalse()
}
@Test
- fun settingsGlobalBooleanFlow_collectAfterValueChanged_onlyKeepLatest() = runBlocking {
- var value by context.settingsGlobalBoolean(TEST_NAME)
+ fun settingsSecureBooleanFlow_collectAfterValueChanged_onlyKeepLatest() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
value = false
- val flow = context.settingsGlobalBooleanFlow(TEST_NAME)
+ val flow = context.settingsSecureBooleanFlow(TEST_NAME)
value = true
assertThat(flow.firstWithTimeoutOrNull()).isTrue()
}
@Test
- fun settingsGlobalBooleanFlow_collectBeforeValueChanged_getBoth() = runBlocking {
- var value by context.settingsGlobalBoolean(TEST_NAME)
+ fun settingsSecureBooleanFlow_collectBeforeValueChanged_getBoth() = runBlocking {
+ var value by context.settingsSecureBoolean(TEST_NAME)
value = false
val listDeferred = async {
- context.settingsGlobalBooleanFlow(TEST_NAME).toListWithTimeout()
+ context.settingsSecureBooleanFlow(TEST_NAME).toListWithTimeout()
}
delay(100)
value = true
diff --git a/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig b/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
index 4936f88..f3e537b 100644
--- a/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
+++ b/packages/SettingsLib/aconfig/settingslib_media_flag_declarations.aconfig
@@ -12,4 +12,11 @@
namespace: "tv_system_ui"
description: "Gates all the changes for the tv specific media output dialog"
bug: "303205631"
-}
\ No newline at end of file
+}
+
+flag {
+ name: "enable_output_switcher_for_system_routing"
+ namespace: "media_solutions"
+ description: "Enable Output Switcher when no media is playing."
+ bug: "284227163"
+}
diff --git a/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml b/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
index 31e9696..bee9e20 100644
--- a/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
+++ b/packages/SettingsLib/res/layout-v33/restricted_switch_preference.xml
@@ -53,7 +53,7 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxLines="2"
+ android:maxLines="10"
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
android:textAppearance="?android:attr/textAppearanceListItem"
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index d282520..3a25838 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Gekoppel deur ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Gekoppel deur eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV-verstek"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-uitset"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne luidsprekers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en terugvoer"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index f047648..c2be887 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI ኢኤአርሲ"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"በኤአርሲ በኩል ተገናኝቷል"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"በኢኤአርሲ በኩል ተገናኝቷል"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"የቲቪ ነባሪ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"የHDMI ውጽዓት"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ውስጣዊ ድምፅ ማውጫዎች"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"የቲቪ ነባሪ"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"የHDMI ውጤት"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"ውስጣዊ ድምፅ ማውጫዎች"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string>
<string name="help_label" msgid="3528360748637781274">"እገዛ እና ግብረመልስ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 7fa5c03..6dd70fa 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"متّصل من خلال ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"متّصل من خلال eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"الجهاز التلقائي لإخراج صوت التلفزيون"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"إخراج الصوت من خلال HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"مكبّرات الصوت الداخلية"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string>
<string name="help_label" msgid="3528360748637781274">"المساعدة والملاحظات"</string>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
index a2d6955..c8eeee3 100644
--- a/packages/SettingsLib/res/values-as/strings.xml
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARCৰ জৰিয়তে সংযুক্ত"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARCৰ জৰিয়তে সংযুক্ত"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"টিভি ডিফ’ল্ট"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI আউটপুট"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"অভ্যন্তৰীণ স্পীকাৰ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string>
<string name="help_label" msgid="3528360748637781274">"সহায় আৰু মতামত"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 99af557..34f506e 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Chrome-da Tətbiqin İşləmə Müddəti vasitəsilə qoşulub"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC vasitəsilə qoşulub"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Defoltu"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Çıxışı"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Daxili Dinamiklər"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım və rəy"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index cca8315..ee75df2 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano preko ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano preko eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Podrazumevana vrednost za TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Unutrašnji zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index de703e9..c17d7236 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Падключана праз ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Падключана праз eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартны (тэлевізар)"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Выхад HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Унутраныя дынамікі"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string>
<string name="help_label" msgid="3528360748637781274">"Даведка і водгукі"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index fd173c1..222e758 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Свързано посредством ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Свързано посредством eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартна настройка за телевизора"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI изход"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Вградени високоговорители"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string>
<string name="help_label" msgid="3528360748637781274">"Помощ и отзиви"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 2290c09..a7c95df 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC-এর মাধ্যমে কানেক্ট করা হয়েছে"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC-এর মাধ্যমে কানেক্ট করা হয়েছে"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"টিভির ডিফল্ট অডিও আউটপুট"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI আউটপুট"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ইন্টার্নাল স্পিকার"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string>
<string name="help_label" msgid="3528360748637781274">"সহায়তা ও মতামত"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 7057619..31ea4d4 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano je putem ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano je putem eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV je zadan"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interni zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 00c31dc..1bb02c2 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connectat mitjançant ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connectat mitjançant eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Valor predeterminat per al televisor"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortida HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altaveus interns"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda i suggeriments"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 47ed7e9..53b7c70 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Připojeno přes ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Připojeno přes eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Výchozí nastavení televize"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Výstup HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interní reproduktory"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Výchozí nastavení televize"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Výstup HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Interní reproduktory"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string>
<string name="help_label" msgid="3528360748637781274">"Nápověda a zpětná vazba"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 6e12771..7ab6669 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Forbundet via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Forbundet via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Fjernsyn som standard"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-udgang"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne højttalere"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjælp og feedback"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 4a7f786..7936478 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Per ARC verbunden"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Per eARC verbunden"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Standardeinstellung: Fernseher"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-Ausgang"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne Lautsprecher"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Standardeinstellung: Fernseher"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI-Ausgang"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Interne Lautsprecher"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus & und wieder ein."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string>
<string name="help_label" msgid="3528360748637781274">"Hilfe und Feedback"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 532e380..65f1f77 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Συνδέθηκε μέσω ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Συνδέθηκε μέσω eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Προεπιλογή τηλεόρασης"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Έξοδος HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Εσωτερικά ηχεία"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Προεπιλογή τηλεόρασης"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Έξοδος HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Εσωτερικά ηχεία"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string>
<string name="help_label" msgid="3528360748637781274">"Βοήθεια και σχόλια"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 27f2fc5..29038bc 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index b59f765..1c51ea5 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal Speakers"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"TV default"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI output"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Internal speakers"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 27f2fc5..29038bc 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 27f2fc5..29038bc 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help and feedback"</string>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 15946f4..2ff386c 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connected via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connected via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Internal Speakers"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"TV default"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI output"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Internal speakers"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Help & feedback"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index a76cf86..780a45d 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Se estableció conexión con un cable ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Se estableció conexión con un cable eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Configuración predeterminada de la TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Salida de HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Bocinas internas"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Configuración predeterminada de la TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Salida de HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Bocinas internas"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 90476b6..82cd2bf 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado mediante ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado mediante eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predeterminado de la televisión"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Salida HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altavoces internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index e5c8242..35ae73e 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ühendatud ARC-i kaudu"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ühendatud eARC-i kaudu"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Teleri vaikeseade"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-väljund"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Sisemised kõlarid"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string>
<string name="help_label" msgid="3528360748637781274">"Abi ja tagasiside"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 65a88d3..7ebad68 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC bidez konektatuta"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC bidez konektatuta"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Telebistaren audio-irteera lehenetsia"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI irteera"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Barneko bozgorailuak"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string>
<string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index b01bcbc..51fd626 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"متصل ازطریق ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"متصل ازطریق eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"پیشفرض تلویزیون"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"خروجی HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"بلندگوهای داخلی"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string>
<string name="help_label" msgid="3528360748637781274">"راهنما و بازخورد"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 58e87a6..f8c9054 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Yhdistetty ARC:n kautta"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Yhdistetty eARC:n kautta"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV:n oletusasetus"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-toisto"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Sisäiset kaiuttimet"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string>
<string name="help_label" msgid="3528360748637781274">"Ohje ja palaute"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index c889d3d..2a7266d 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connecté par ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connecté par eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sortie audio par défaut de la télévision"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortie HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Haut-parleurs internes"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 8a9bedf..e30a4ab 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connecté via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connecté via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sortie audio par défaut de la TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Sortie HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Haut-parleurs internes"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Sortie par défaut de la TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Sortie HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Haut-parleurs internes"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string>
<string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 3258db0..7b79386 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado mediante ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado mediante eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Saída predeterminada da televisión"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altofalantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string>
<string name="help_label" msgid="3528360748637781274">"Axuda e comentarios"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 0dd9bfe..ec534da 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC મારફતે કનેક્ટેડ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC મારફતે કનેક્ટેડ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ટીવીમાંથી ડિફૉલ્ટ ઑડિયો આઉટપુટ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI આઉટપુટ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"આંતરિક સ્પીકર"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string>
<string name="help_label" msgid="3528360748637781274">"સહાય અને પ્રતિસાદ"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index ea5c5ba..092c729 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"एचडीएमआई eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC से कनेक्ट किए गए डिवाइस"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC से कनेक्ट किए गए डिवाइस"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टीवी का डिफ़ॉल्ट ऑडियो आउटपुट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"एचडीएमआई आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"इंटरनल स्पीकर"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string>
<string name="help_label" msgid="3528360748637781274">"सहायता और सुझाव"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 346b602..eaebfc9 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano putem ARC-a"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano putem eARC-a"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Zadano za TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izlaz"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Unutarnji zvučnici"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index 186b42b..d287ce3 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Csatlakoztatva ARC-n keresztül"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Csatlakoztatva eARC-n keresztül"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Alapértelmezett tévé"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-kimenet"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Belső hangszóró"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string>
<string name="help_label" msgid="3528360748637781274">"Súgó és visszajelzés"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index ff42a37..4d27099 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Միացված է ARC-ի միջոցով"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Միացված է eARC-ի միջոցով"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Հեռուստացույցի կանխադրված կարգավորումներ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ելք"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ներքին բարձրախոսներ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string>
<string name="help_label" msgid="3528360748637781274">"Օգնություն և հետադարձ կապ"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 7159d87..ce770af 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Terhubung melalui ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Terhubung melalui eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV sebagai Default"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Output HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Speaker Internal"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat & aktifkan kembali"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan & masukan"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 53f9045..09587ee 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Tengt með ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Tengt með eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Sjálfgefið í sjónvarpi"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-úttak"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Innri hátalarar"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Sjálfgefið í sjónvarpi"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"HDMI-úttak"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Innri hátalarar"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string>
<string name="help_label" msgid="3528360748637781274">"Hjálp og ábendingar"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index f83594df..fd68d14 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"eARC HDMI"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Connessione tramite ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Connessione tramite eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Valore predefinito: TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Uscita HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Speaker interni"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string>
<string name="help_label" msgid="3528360748637781274">"Guida e feedback"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 755e8ce..fbd715a 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"חיבור דרך ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"חיבור דרך eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ברירת המחדל של הטלוויזיה"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"פלט HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"רמקולים פנימיים"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"ברירת המחדל של הטלוויזיה"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"פלט HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"רמקולים פנימיים"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string>
<string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index d9f76fd..58d4f0e 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC 経由で接続済み"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC 経由で接続済み"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"テレビのデフォルト"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 出力"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"内蔵スピーカー"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string>
<string name="help_label" msgid="3528360748637781274">"ヘルプとフィードバック"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index fb58973..eb89b19 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"დაკავშირებულია ARC-ის მეშვეობით"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"დაკავშირებულია eARC-ის მეშვეობით"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ნაგულისხმევი ტელევიზორი"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"გამომავალი HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"შიდა დინამიკები"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"ტელევიზორის ნაგულისხმევი"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"გამომავალი HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"შიდა დინამიკები"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string>
<string name="help_label" msgid="3528360748637781274">"დახმარება და გამოხმაურება"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index c991133..0d31dde 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC арқылы жалғанған."</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC арқылы жалғанған."</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Әдепкі теледидар"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI шығыс құрылғысы"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ішкі динамиктер"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string>
<string name="help_label" msgid="3528360748637781274">"Анықтама және пікір"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 7ad4e53..8ee7987 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"បានភ្ជាប់តាមរយៈ ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"បានភ្ជាប់តាមរយៈ eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"លំនាំដើមទូរទស្សន៍"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"ធាតុចេញ HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ឧបករណ៍បំពងសំឡេងខាងក្នុង"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មានបញ្ហាក្នុងការភ្ជាប់។ បិទ រួចបើកឧបករណ៍វិញ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍សំឡេងប្រើខ្សែ"</string>
<string name="help_label" msgid="3528360748637781274">"ជំនួយ និងមតិកែលម្អ"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 8f5c042..73f7a20 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ಟಿವಿ ಡೀಫಾಲ್ಟ್"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ಔಟ್ಪುಟ್"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ಆಂತರಿಕ ಸ್ಪೀಕರ್ಗಳು"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string>
<string name="help_label" msgid="3528360748637781274">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index b2564a0..418e47e 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC를 통해 연결됨"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC를 통해 연결됨"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV 기본값"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 출력"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"내부 스피커"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string>
<string name="help_label" msgid="3528360748637781274">"고객센터"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 18f792c..182e912 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC аркылуу туташты"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC аркылуу туташты"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV\'нин демейки параметрлери"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Аудио түзмөгү"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ички динамиктер"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string>
<string name="help_label" msgid="3528360748637781274">"Жардам/Пикир билдирүү"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index c75326e..5f8ba5f 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ເຊື່ອມຕໍ່ຜ່ານ ARC ແລ້ວ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"ເຊື່ອມຕໍ່ຜ່ານ eARC ແລ້ວ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ຄ່າເລີ່ມຕົ້ນສຳລັບໂທລະທັດ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"ເອົ້າພຸດ HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ລຳໂພງຂອງເຄື່ອງ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string>
<string name="help_label" msgid="3528360748637781274">"ຊ່ວຍເຫຼືອ ແລະ ຕິຊົມ"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 37a3576..5294f4a 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI „eARC“"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Prisijungta per ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Prisijungta per „eARC“"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV numatytasis"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI išvesti"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Vidiniai garsiakalbiai"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string>
<string name="help_label" msgid="3528360748637781274">"Pagalba ir atsiliepimai"</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 6cd9c57..7ea01e7 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -266,9 +266,9 @@
<string name="keep_screen_on_summary" msgid="1510731514101925829">"Uzlādes laikā ekrāns nekad nepārslēgsies miega režīmā"</string>
<string name="bt_hci_snoop_log" msgid="7291287955649081448">"Iespējot Bluetooth HCI analizētāja žurnālu"</string>
<string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"Tvert Bluetooth paketes. (Pārslēgt Bluetooth pēc šī iestatījuma mainīšanas.)"</string>
- <string name="oem_unlock_enable" msgid="5334869171871566731">"OEM atbloķēšana"</string>
+ <string name="oem_unlock_enable" msgid="5334869171871566731">"OAR atbloķēšana"</string>
<string name="oem_unlock_enable_summary" msgid="5857388174390953829">"Atļaut palaišanas ielādētāja atbloķēšanu"</string>
- <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Vai atļaut OEM atbloķēšanu?"</string>
+ <string name="confirm_enable_oem_unlock_title" msgid="8249318129774367535">"Vai atļaut OAR atbloķēšanu?"</string>
<string name="confirm_enable_oem_unlock_text" msgid="854131050791011970">"BRĪDINĀJUMS. Kamēr šis iestatījums būs ieslēgts, ierīces aizsardzības funkcijas nedarbosies."</string>
<string name="mock_location_app" msgid="6269380172542248304">"Atlasīt imitētas atrašanās vietas lietotni"</string>
<string name="mock_location_app_not_set" msgid="6972032787262831155">"Nav iestatīta imitētas atrašanās vietas lietotne"</string>
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Savienojums izveidots, izmantojot ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Savienojums izveidots, izmantojot eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Noklusējuma iestatījums televizorā"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI izvade"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Iekšējie skaļruņi"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string>
<string name="help_label" msgid="3528360748637781274">"Palīdzība un atsauksmes"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 75dbbf1..d38f42c 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Поврзано преку ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Поврзано преку eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандардни поставки за телевизор"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Излез за HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внатрешни звучници"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string>
<string name="help_label" msgid="3528360748637781274">"Помош и повратни информации"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 2cb4da1..8b6150d 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC വഴി കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC വഴി കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ടിവി ഡിഫോൾട്ട്"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ഔട്ട്പുട്ട്"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ആന്തരിക സ്പീക്കറുകൾ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്റ്റ് ചെയ്യുന്നതിൽ പ്രശ്നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string>
<string name="help_label" msgid="3528360748637781274">"സഹായവും ഫീഡ്ബാക്കും"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 0a99650..e7c83a8 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC-р холбогдсон"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC-р холбогдсон"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ТВ-ийн өгөгдмөл"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI гаралт"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Дотоод чанга яригч"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string>
<string name="help_label" msgid="3528360748637781274">"Тусламж, санал хүсэлт"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index dca07e2..381d0b8 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC द्वारे कनेक्ट केलेली"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC द्वारे कनेक्ट केलेली"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टीव्ही डीफॉल्ट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"अंतर्गत स्पीकर"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करण्यात समस्या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string>
<string name="help_label" msgid="3528360748637781274">"मदत आणि फीडबॅक"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index ad29abc..3e7d901 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Disambungkan melalui ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Disambungkan melalui eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Tetapan Lalai TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Output HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Pembesar Suara Dalaman"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan & hidupkan kembali peranti"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string>
<string name="help_label" msgid="3528360748637781274">"Bantuan & maklum balas"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index d538dc8..68ae549 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC မှတစ်ဆင့် ချိတ်ဆက်ထားသည်"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV မူရင်း"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI အထွက်"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"စက်ရှိ စပီကာများ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string>
<string name="help_label" msgid="3528360748637781274">"အကူအညီနှင့် အကြံပြုချက်"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index ae46b68..a11bfff 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Tilkoblet via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Tilkoblet via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV-ens standardinnstilling"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-utdata"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne høyttalere"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string>
<string name="help_label" msgid="3528360748637781274">"Hjelp og tilbakemelding"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index f73cd0b..b833c14 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC मार्फत कनेक्ट गरिएका"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC मार्फत कनेक्ट गरिएका"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"टिभीको डिफल्ट अडियो आउटपुट"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI आउटपुट"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"आन्तरिक स्पिकरहरू"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि अन गर्नुहोस्"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string>
<string name="help_label" msgid="3528360748637781274">"मद्दत र प्रतिक्रिया"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 2a47d7e..f9215e5 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Verbonden via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Verbonden via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Tv-standaard"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-uitvoer"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interne speakers"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string>
<string name="help_label" msgid="3528360748637781274">"Hulp en feedback"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 185870a..c4ed005 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ମାଧ୍ୟମରେ କନେକ୍ଟ କରାଯାଇଛି"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ମାଧ୍ୟମରେ କନେକ୍ଟ କରାଯାଇଛି"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ଟିଭିର ଡିଫଲ୍ଟ ଅଡିଓ ଆଉଟପୁଟ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ଆଉଟପୁଟ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ଇଣ୍ଟର୍ନଲ ସ୍ପିକର"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string>
<string name="help_label" msgid="3528360748637781274">"ସାହାଯ୍ୟ ଓ ମତାମତ"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 4a72574..b7a67fd 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤੇ ਗਏ ਡੀਵਾਈਸ"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ਰਾਹੀਂ ਕਨੈਕਟ ਕੀਤੇ ਗਏ ਡੀਵਾਈਸ"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ਟੀਵੀ ਦਾ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਆਊਟਪੁੱਟ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ਆਊਟਪੁੱਟ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ਅੰਦਰੂਨੀ ਸਪੀਕਰ"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string>
<string name="help_label" msgid="3528360748637781274">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 61ae709..3ef8fd7e 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Połączono przez ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Połączono przez eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Wyjście domyślne telewizora"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Wyjście HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Głośniki wewnętrzne"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoc i opinie"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 20c0460..b76b37b 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Padrão da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Alto-falantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 8c8482f..1a81f2d 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ligado através de ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ligado através de eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predefinição da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altifalantes internos"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Predefinição da TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Saída HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Altifalantes internos"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e comentários"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 20c0460..b76b37b 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectado via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectado via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Padrão da TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Saída HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Alto-falantes internos"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string>
<string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 4b4c075..5956d63 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Conectat prin ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Conectat prin eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Prestabilită pentru televizor"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Ieșire HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Difuzoare interne"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Prestabilit pentru televizor"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Ieșire HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Difuzoare interne"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Oprește și repornește dispozitivul."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string>
<string name="help_label" msgid="3528360748637781274">"Ajutor și feedback"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 53f2729..862e3d4 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Подключено через ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Подключено через eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартный выход на телевизоре"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Выход HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внутренние динамики"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string>
<string name="help_label" msgid="3528360748637781274">"Справка/отзыв"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index d7dd1d09..795abec 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC හරහා සම්බන්ධ කර ඇත"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC හරහා සම්බන්ධ කර ඇත"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"රූපවාහිනී පෙරනිමිය"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI ප්රතිදානය"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"අභ්යන්තර ස්පීකර්"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්රියාවිරහිත කර & ආපසු ක්රියාත්මක කරන්න"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string>
<string name="help_label" msgid="3528360748637781274">"උදවු & ප්රතිපෝෂණ"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 4b83ba0..00c0bc1 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Pripojené prostredníctvom rozhrania ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Pripojené prostredníctvom rozhrania eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Predvolené nastavenie televízora"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Výstup HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Vnútorné reproduktory"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string>
<string name="help_label" msgid="3528360748637781274">"Pomocník a spätná väzba"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index c70716d..ddf0f71 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Povezano prek zvočnega kanala ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Povezano prek zvočnega kanala eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Privzeti izhod televizorja"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Izhod HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Notranji zvočniki"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Privzeti izhod televizorja"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Izhod HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Notranji zvočniki"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string>
<string name="help_label" msgid="3528360748637781274">"Pomoč in povratne informacije"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index a02ca5a..f204017 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Lidhur përmes ARC-së"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Lidhur përmes eARC-së"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Parazgjedhja e televizorit"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Dalja HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Altoparlantët e brendshëm"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string>
<string name="help_label" msgid="3528360748637781274">"Ndihma dhe komentet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index bc0114f..b83986a 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Повезано преко ARC-а"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Повезано преко eARC-а"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Подразумевана вредност за ТВ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI излаз"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Унутрашњи звучници"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string>
<string name="help_label" msgid="3528360748637781274">"Помоћ и повратне информације"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 51e00b7..58e3705 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ansluten via ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ansluten via eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Standardinställning för tv:n"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI-utgång"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Interna högtalare"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string>
<string name="help_label" msgid="3528360748637781274">"Hjälp och feedback"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 6bacc32..5870cde 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -567,9 +567,9 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Imeunganishwa kupitia ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Imeunganishwa kupitia eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Mipangilio Chaguomsingi ya Televisheni"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Kutoa Sauti Kupitia HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Spika za Ndani"</string>
+ <string name="tv_media_transfer_default" msgid="5403053145185843843">"Mipangilio Chaguomsingi ya TV"</string>
+ <string name="tv_media_transfer_hdmi" msgid="692569220956829921">"Kutoa sauti kupitia HDMI"</string>
+ <string name="tv_media_transfer_internal_speakers" msgid="8181494402866565865">"Spika za ndani"</string>
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string>
<string name="help_label" msgid="3528360748637781274">"Usaidizi na maoni"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 07bdaf2..2a2536b 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC மூலம் இணைக்கப்பட்டுள்ளவை"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC மூலம் இணைக்கப்பட்டுள்ளவை"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"டிவி இயல்புநிலை"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI அவுட்புட்"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"உட்புற ஸ்பீக்கர்கள்"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string>
<string name="help_label" msgid="3528360748637781274">"உதவியும் கருத்தும்"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 81739b3..303d310 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ద్వారా కనెక్ట్ చేయబడింది"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ద్వారా కనెక్ట్ చేయబడింది"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"టీవీ ఆటోమేటిక్ సెట్టింగ్"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI అవుట్పుట్"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"అంతర్గత స్పీకర్లు"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string>
<string name="help_label" msgid="3528360748637781274">"సహాయం & ఫీడ్బ్యాక్"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 001af01..0ac8cb8 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"เชื่อมต่อผ่าน ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"เชื่อมต่อผ่าน eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"ค่าเริ่มต้นของทีวี"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"เอาต์พุต HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"ลำโพงของเครื่อง"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string>
<string name="help_label" msgid="3528360748637781274">"ความช่วยเหลือและความคิดเห็น"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 9ccc801..4f92e1d 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Nakakonekta sa pamamagitan ng ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Nakakonekta sa pamamagitan ng eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Naka-default sa TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Output"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Mga Internal na Speaker"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string>
<string name="help_label" msgid="3528360748637781274">"Tulong at feedback"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index a49f3ab..795bb30 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC ile bağlandı"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC ile bağlandı"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV Varsayılanı"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI Çıkışı"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Dahili Hoparlörler"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string>
<string name="help_label" msgid="3528360748637781274">"Yardım ve geri bildirim"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index eba7926..beb2c91 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Підключено через ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Підключено через eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Стандартні налаштування телевізора"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Вихід HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Внутрішні динаміки"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string>
<string name="help_label" msgid="3528360748637781274">"Довідка й відгуки"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index ce5ed31..13718d9 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC کے ذریعے منسلک ہے"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC کے ذریعے منسلک ہے"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"TV ڈیفالٹ"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI آؤٹ پٹ"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"اندرونی اسپیکرز"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string>
<string name="help_label" msgid="3528360748637781274">"مدد اور تاثرات"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 5d23a93..7559a3d 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"ARC orqali ulangan"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"eARC orqali ulangan"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Televizorda birlamchi"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI chiqishi"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Ichki karnaylar"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string>
<string name="help_label" msgid="3528360748637781274">"Yordam/fikr-mulohaza"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index e96c49f..ccdc0bc 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Đã kết nối qua ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Đã kết nối qua eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"Chế độ mặc định của TV"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Đầu ra HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Loa trong"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string>
<string name="help_label" msgid="3528360748637781274">"Trợ giúp và phản hồi"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 2174e12..6b3e061 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"已通过 ARC 连接"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"已通过 eARC 连接"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"电视默认设置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 输出"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"内置扬声器"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string>
<string name="help_label" msgid="3528360748637781274">"帮助和反馈"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index dc490ee..3517109 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"已透過 ARC 連接"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"已透過 eARC 連接"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"電視預設的音訊輸出裝置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 輸出"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"內置喇叭"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見反映"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 5049011..eeed9f3 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"透過 ARC 連線"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"透過 eARC 連線"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"電視預設的音訊輸出裝置"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"HDMI 輸出裝置"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"內建喇叭"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string>
<string name="help_label" msgid="3528360748637781274">"說明與意見回饋"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 7c82c19..e94b929 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -567,9 +567,12 @@
<string name="tv_media_transfer_earc_fallback_title" msgid="3098685494578519940">"I-HDMI eARC"</string>
<string name="tv_media_transfer_arc_subtitle" msgid="1040017851325069082">"Ixhunywe nge-ARC"</string>
<string name="tv_media_transfer_earc_subtitle" msgid="645191413103303077">"Ixhunywe nge-eARC"</string>
- <string name="tv_media_transfer_default" msgid="38102257053315304">"I-TV Ezenzakalelayo"</string>
- <string name="tv_media_transfer_hdmi" msgid="2229000864416329818">"Okukhishwayo kwe-HDMI"</string>
- <string name="tv_media_transfer_internal_speakers" msgid="2433193551482972117">"Izipikha Zangaphakathi"</string>
+ <!-- no translation found for tv_media_transfer_default (5403053145185843843) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_hdmi (692569220956829921) -->
+ <skip />
+ <!-- no translation found for tv_media_transfer_internal_speakers (8181494402866565865) -->
+ <skip />
<string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string>
<string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string>
<string name="help_label" msgid="3528360748637781274">"Usizo nempendulo"</string>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index ed5654d..ec50323 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2432,9 +2432,7 @@
R.bool.def_auto_time_zone); // Sync timezone to NITZ
loadSetting(stmt, Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
- ("1".equals(SystemProperties.get("ro.boot.qemu"))
- || res.getBoolean(R.bool.def_stay_on_while_plugged_in))
- ? 1 : 0);
+ res.getBoolean(R.bool.def_stay_on_while_plugged_in) ? 1 : 0);
loadIntegerSetting(stmt, Settings.Global.WIFI_SLEEP_POLICY,
R.integer.def_wifi_sleep_policy);
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 650319f..b6a0c7b 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -442,6 +442,9 @@
<uses-permission android:name="android.permission.MANAGE_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" />
+ <!-- Permission required for CTS test - CtsNfcResolverDerviceTest -->
+ <uses-permission android:name="android.permission.SHOW_CUSTOMIZED_RESOLVER" />
+
<!-- Permission needed for CTS test - MusicRecognitionManagerTest -->
<uses-permission android:name="android.permission.MANAGE_MUSIC_RECOGNITION" />
diff --git a/packages/SoundPicker/res/values-ro/strings.xml b/packages/SoundPicker/res/values-ro/strings.xml
index 58b5aeb..01a2a1a 100644
--- a/packages/SoundPicker/res/values-ro/strings.xml
+++ b/packages/SoundPicker/res/values-ro/strings.xml
@@ -19,7 +19,7 @@
<string name="ringtone_default" msgid="798836092118824500">"Ton de apel prestabilit"</string>
<string name="notification_sound_default" msgid="8133121186242636840">"Sunet de notificare prestabilit"</string>
<string name="alarm_sound_default" msgid="4787646764557462649">"Sunet de alarmă prestabilit"</string>
- <string name="add_ringtone_text" msgid="6642389991738337529">"Adaugă un ton de sonerie"</string>
+ <string name="add_ringtone_text" msgid="6642389991738337529">"Adaugă un ton de apel"</string>
<string name="add_alarm_text" msgid="3545497316166999225">"Adaugă o alarmă"</string>
<string name="add_notification_text" msgid="4431129543300614788">"Adaugă o notificare"</string>
<string name="delete_ringtone_text" msgid="201443984070732499">"Șterge"</string>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 0a71cda..f1029a3 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -512,15 +512,6 @@
</intent-filter>
</activity-alias>
- <activity
- android:name="com.android.wm.shell.legacysplitscreen.ForcedResizableInfoActivity"
- android:theme="@style/ForcedResizableTheme"
- android:excludeFromRecents="true"
- android:stateNotNeeded="true"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
- android:exported="false">
- </activity>
-
<!-- Springboard for launching the share and edit activity. This needs to be in the main
system ui process since we need to notify the status bar to dismiss the keyguard -->
<receiver android:name=".screenshot.ActionProxyReceiver"
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index 3e84597..d8d3f87 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -68,6 +68,16 @@
}
flag {
+ name: "notification_background_tint_optimization"
+ namespace: "systemui"
+ description: "Re-enable the codepath that removed tinting of notifications when the"
+ " standard background color is desired. This was the behavior before we discovered"
+ " a resources threading issue, which we worked around by tinting the notification"
+ " backgrounds and footer buttons."
+ bug: "294347738"
+}
+
+flag {
name: "scene_container"
namespace: "systemui"
description: "Enables the scene container framework go/flexiglass."
@@ -165,8 +175,22 @@
}
flag {
+ name: "rest_to_unlock"
+ namespace: "systemui"
+ description: "Require prolonged touch for fingerprint authentication"
+ bug: "303672286"
+}
+
+flag {
name: "record_issue_qs_tile"
namespace: "systemui"
description: "Replace Record Trace QS Tile with expanded Record Issue QS Tile"
bug: "305049544"
}
+
+flag {
+ name: "fast_unlock_transition"
+ namespace: "systemui"
+ description: "Faster wallpaper unlock transition"
+ bug: "298186160"
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
index ba80a8d..1a653c3 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
@@ -34,9 +34,9 @@
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
-import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
@@ -66,6 +66,7 @@
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
@@ -97,7 +98,7 @@
fun BouncerContent(
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
- modifier: Modifier
+ modifier: Modifier = Modifier,
) {
val isFullScreenUserSwitcherEnabled = viewModel.isUserSwitcherVisible
val isSideBySideSupported by viewModel.isSideBySideSupported.collectAsState()
@@ -142,6 +143,7 @@
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
modifier: Modifier = Modifier,
+ layout: BouncerSceneLayout = BouncerSceneLayout.STANDARD,
outputOnly: Boolean = false,
) {
val foldPosture: FoldPosture by foldPosture()
@@ -161,6 +163,7 @@
FoldSplittable(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = layout,
outputOnly = outputOnly,
isSplit = false,
)
@@ -170,6 +173,7 @@
FoldSplittable(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = layout,
outputOnly = outputOnly,
isSplit = true,
)
@@ -193,6 +197,7 @@
private fun SceneScope.FoldSplittable(
viewModel: BouncerViewModel,
dialogFactory: BouncerDialogFactory,
+ layout: BouncerSceneLayout,
outputOnly: Boolean,
isSplit: Boolean,
modifier: Modifier = Modifier,
@@ -210,13 +215,21 @@
// Content above the fold, when split on a foldable device in a "table top" posture:
Box(
modifier =
- Modifier.element(SceneElements.AboveFold).fillMaxWidth().thenIf(isSplit) {
- Modifier.weight(splitRatio)
- },
+ Modifier.element(SceneElements.AboveFold)
+ .fillMaxWidth()
+ .then(
+ if (isSplit) {
+ Modifier.weight(splitRatio)
+ } else if (outputOnly) {
+ Modifier.fillMaxHeight()
+ } else {
+ Modifier
+ }
+ ),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
- modifier = Modifier.fillMaxWidth().padding(top = 92.dp),
+ modifier = Modifier.fillMaxWidth().padding(top = layout.topPadding),
) {
Crossfade(
targetState = message,
@@ -230,11 +243,23 @@
)
}
- Spacer(Modifier.heightIn(min = 21.dp, max = 48.dp))
+ if (!outputOnly) {
+ Spacer(Modifier.height(layout.spacingBetweenMessageAndEnteredInput))
+ UserInputArea(
+ viewModel = viewModel,
+ visibility = UserInputAreaVisibility.OUTPUT_ONLY,
+ layout = layout,
+ )
+ }
+ }
+
+ if (outputOnly) {
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.OUTPUT_ONLY,
+ layout = layout,
+ modifier = Modifier.align(Alignment.Center),
)
}
}
@@ -242,25 +267,32 @@
// Content below the fold, when split on a foldable device in a "table top" posture:
Box(
modifier =
- Modifier.element(SceneElements.BelowFold).fillMaxWidth().thenIf(isSplit) {
- Modifier.weight(1 - splitRatio)
- },
+ Modifier.element(SceneElements.BelowFold)
+ .fillMaxWidth()
+ .weight(
+ if (isSplit) {
+ 1 - splitRatio
+ } else {
+ 1f
+ }
+ ),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
- modifier = Modifier.fillMaxWidth(),
+ modifier = Modifier.fillMaxSize()
) {
if (!outputOnly) {
Box(Modifier.weight(1f)) {
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.INPUT_ONLY,
- modifier = Modifier.align(Alignment.Center),
+ layout = layout,
+ modifier = Modifier.align(Alignment.BottomCenter),
)
}
}
- Spacer(Modifier.heightIn(min = 21.dp, max = 48.dp))
+ Spacer(Modifier.height(48.dp))
val actionButtonModifier = Modifier.height(56.dp)
@@ -275,7 +307,7 @@
}
}
- Spacer(Modifier.height(48.dp))
+ Spacer(Modifier.height(layout.bottomPadding))
}
}
@@ -311,6 +343,7 @@
private fun UserInputArea(
viewModel: BouncerViewModel,
visibility: UserInputAreaVisibility,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
val authMethodViewModel: AuthMethodBouncerViewModel? by
@@ -327,6 +360,7 @@
UserInputAreaVisibility.INPUT_ONLY ->
PinPad(
viewModel = nonNullViewModel,
+ layout = layout,
modifier = modifier,
)
}
@@ -341,7 +375,8 @@
if (visibility == UserInputAreaVisibility.INPUT_ONLY) {
PatternBouncer(
viewModel = nonNullViewModel,
- modifier = modifier.aspectRatio(1f, matchHeightConstraintsFirst = false)
+ layout = layout,
+ modifier = modifier.aspectRatio(1f, matchHeightConstraintsFirst = false),
)
}
else -> Unit
@@ -449,7 +484,7 @@
}
/**
- * Renders the dropdown menu that displays the actual users and/or user actions that can be
+ * Renders the dropdowm menu that displays the actual users and/or user actions that can be
* selected.
*/
@Composable
@@ -519,6 +554,7 @@
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.SPLIT,
outputOnly = true,
modifier = startContentModifier,
)
@@ -527,10 +563,12 @@
UserInputArea(
viewModel = viewModel,
visibility = UserInputAreaVisibility.INPUT_ONLY,
+ layout = BouncerSceneLayout.SPLIT,
modifier = endContentModifier,
)
},
- modifier = modifier
+ layout = BouncerSceneLayout.SPLIT,
+ modifier = modifier,
)
}
@@ -542,6 +580,7 @@
private fun SwappableLayout(
startContent: @Composable (Modifier) -> Unit,
endContent: @Composable (Modifier) -> Unit,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
val layoutDirection = LocalLayoutDirection.current
@@ -597,7 +636,7 @@
alpha = animatedAlpha(animatedOffset)
}
) {
- endContent(Modifier.widthIn(max = 400.dp).align(Alignment.BottomCenter))
+ endContent(Modifier.align(layout.swappableEndContentAlignment).widthIn(max = 400.dp))
}
}
}
@@ -635,9 +674,11 @@
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.SIDE_BY_SIDE,
modifier = endContentModifier,
)
},
+ layout = BouncerSceneLayout.SIDE_BY_SIDE,
modifier = modifier,
)
}
@@ -663,6 +704,7 @@
StandardLayout(
viewModel = viewModel,
dialogFactory = dialogFactory,
+ layout = BouncerSceneLayout.STACKED,
modifier = Modifier.fillMaxWidth().weight(1f),
)
}
@@ -732,3 +774,48 @@
private val SceneTransitions = transitions {
from(SceneKeys.ContiguousSceneKey, to = SceneKeys.SplitSceneKey) { spec = tween() }
}
+
+/** Whether a more compact size should be used for various spacing dimensions. */
+internal val BouncerSceneLayout.isUseCompactSize: Boolean
+ get() =
+ when (this) {
+ BouncerSceneLayout.SIDE_BY_SIDE -> true
+ BouncerSceneLayout.SPLIT -> true
+ else -> false
+ }
+
+/** Amount of space to place between the message and the entered input UI elements, in dips. */
+private val BouncerSceneLayout.spacingBetweenMessageAndEnteredInput: Dp
+ get() =
+ when {
+ this == BouncerSceneLayout.STACKED -> 24.dp
+ isUseCompactSize -> 96.dp
+ else -> 128.dp
+ }
+
+/** Amount of space to place above the topmost UI element, in dips. */
+private val BouncerSceneLayout.topPadding: Dp
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ 40.dp
+ } else {
+ 92.dp
+ }
+
+/** Amount of space to place below the bottommost UI element, in dips. */
+private val BouncerSceneLayout.bottomPadding: Dp
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ 40.dp
+ } else {
+ 48.dp
+ }
+
+/** The in-a-box alignment for the content on the "end" side of a swappable layout. */
+private val BouncerSceneLayout.swappableEndContentAlignment: Alignment
+ get() =
+ if (this == BouncerSceneLayout.SPLIT) {
+ Alignment.Center
+ } else {
+ Alignment.BottomCenter
+ }
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
index eb06889..2799959 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PasswordBouncer.kt
@@ -18,8 +18,6 @@
import android.view.ViewTreeObserver
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.height
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.LocalTextStyle
@@ -31,7 +29,6 @@
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
@@ -64,10 +61,6 @@
focusRequester.requestFocus()
}
}
- val (isTextFieldFocused, onTextFieldFocusChanged) = remember { mutableStateOf(false) }
- LaunchedEffect(isTextFieldFocused) {
- viewModel.onTextFieldFocusChanged(isFocused = isTextFieldFocused)
- }
val password: String by viewModel.password.collectAsState()
val isInputEnabled: Boolean by viewModel.isInputEnabled.collectAsState()
@@ -113,7 +106,7 @@
),
modifier =
Modifier.focusRequester(focusRequester)
- .onFocusChanged { onTextFieldFocusChanged(it.isFocused) }
+ .onFocusChanged { viewModel.onTextFieldFocusChanged(it.isFocused) }
.drawBehind {
drawLine(
color = color,
@@ -123,8 +116,6 @@
)
},
)
-
- Spacer(Modifier.height(100.dp))
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
index ff1cbd6..a4b1955 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PatternBouncer.kt
@@ -48,6 +48,7 @@
import com.android.compose.animation.Easings
import com.android.compose.modifiers.thenIf
import com.android.internal.R
+import com.android.systemui.bouncer.ui.helper.BouncerSceneLayout
import com.android.systemui.bouncer.ui.viewmodel.PatternBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.PatternDotViewModel
import kotlin.math.min
@@ -64,6 +65,7 @@
@Composable
internal fun PatternBouncer(
viewModel: PatternBouncerViewModel,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
DisposableEffect(Unit) {
@@ -190,6 +192,8 @@
// This is the position of the input pointer.
var inputPosition: Offset? by remember { mutableStateOf(null) }
var gridCoordinates: LayoutCoordinates? by remember { mutableStateOf(null) }
+ var offset: Offset by remember { mutableStateOf(Offset.Zero) }
+ var scale: Float by remember { mutableStateOf(1f) }
Canvas(
modifier
@@ -224,21 +228,42 @@
},
) { change, _ ->
inputPosition = change.position
- viewModel.onDrag(
- xPx = change.position.x,
- yPx = change.position.y,
- containerSizePx = size.width,
- )
+ change.position.minus(offset).div(scale).let {
+ viewModel.onDrag(
+ xPx = it.x,
+ yPx = it.y,
+ containerSizePx = size.width,
+ )
+ }
}
}
}
) {
gridCoordinates?.let { nonNullCoordinates ->
val containerSize = nonNullCoordinates.size
+ if (containerSize.width <= 0 || containerSize.height <= 0) {
+ return@let
+ }
+
val horizontalSpacing = containerSize.width.toFloat() / colCount
val verticalSpacing = containerSize.height.toFloat() / rowCount
val spacing = min(horizontalSpacing, verticalSpacing)
- val verticalOffset = containerSize.height - spacing * rowCount
+ val horizontalOffset =
+ offset(
+ availableSize = containerSize.width,
+ spacingPerDot = spacing,
+ dotCount = colCount,
+ isCentered = true,
+ )
+ val verticalOffset =
+ offset(
+ availableSize = containerSize.height,
+ spacingPerDot = spacing,
+ dotCount = rowCount,
+ isCentered = layout.isCenteredVertically,
+ )
+ offset = Offset(horizontalOffset, verticalOffset)
+ scale = (colCount * spacing) / containerSize.width
if (isAnimationEnabled) {
// Draw lines between dots.
@@ -248,8 +273,9 @@
val lineFadeOutAnimationProgress =
lineFadeOutAnimatables[previousDot]!!.value
val startLerp = 1 - lineFadeOutAnimationProgress
- val from = pixelOffset(previousDot, spacing, verticalOffset)
- val to = pixelOffset(dot, spacing, verticalOffset)
+ val from =
+ pixelOffset(previousDot, spacing, horizontalOffset, verticalOffset)
+ val to = pixelOffset(dot, spacing, horizontalOffset, verticalOffset)
val lerpedFrom =
Offset(
x = from.x + (to.x - from.x) * startLerp,
@@ -270,7 +296,7 @@
// position.
inputPosition?.let { lineEnd ->
currentDot?.let { dot ->
- val from = pixelOffset(dot, spacing, verticalOffset)
+ val from = pixelOffset(dot, spacing, horizontalOffset, verticalOffset)
val lineLength =
sqrt((from.y - lineEnd.y).pow(2) + (from.x - lineEnd.x).pow(2))
drawLine(
@@ -288,7 +314,7 @@
// Draw each dot on the grid.
dots.forEach { dot ->
drawCircle(
- center = pixelOffset(dot, spacing, verticalOffset),
+ center = pixelOffset(dot, spacing, horizontalOffset, verticalOffset),
color = dotColor,
radius = dotRadius * (dotScalingAnimatables[dot]?.value ?: 1f),
)
@@ -301,10 +327,11 @@
private fun pixelOffset(
dot: PatternDotViewModel,
spacing: Float,
+ horizontalOffset: Float,
verticalOffset: Float,
): Offset {
return Offset(
- x = dot.x * spacing + spacing / 2,
+ x = dot.x * spacing + spacing / 2 + horizontalOffset,
y = dot.y * spacing + spacing / 2 + verticalOffset,
)
}
@@ -371,6 +398,35 @@
}
}
+/**
+ * Returns the amount of offset along the axis, in pixels, that should be applied to all dots.
+ *
+ * @param availableSize The size of the container, along the axis of interest.
+ * @param spacingPerDot The amount of pixels that each dot should take (including the area around
+ * that dot).
+ * @param dotCount The number of dots along the axis (e.g. if the axis of interest is the
+ * horizontal/x axis, this is the number of columns in the dot grid).
+ * @param isCentered Whether the dots should be centered along the axis of interest; if `false`, the
+ * dots will be pushed towards to end/bottom of the axis.
+ */
+private fun offset(
+ availableSize: Int,
+ spacingPerDot: Float,
+ dotCount: Int,
+ isCentered: Boolean = false,
+): Float {
+ val default = availableSize - spacingPerDot * dotCount
+ return if (isCentered) {
+ default / 2
+ } else {
+ default
+ }
+}
+
+/** Whether the UI should be centered vertically. */
+private val BouncerSceneLayout.isCenteredVertically: Boolean
+ get() = this == BouncerSceneLayout.SPLIT
+
private const val DOT_DIAMETER_DP = 16
private const val SELECTED_DOT_DIAMETER_DP = 24
private const val SELECTED_DOT_REACTION_ANIMATION_DURATION_MS = 83
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
index 59617c9..8f5d9f4 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/PinBouncer.kt
@@ -52,6 +52,7 @@
import com.android.compose.animation.Easings
import com.android.compose.grid.VerticalGrid
import com.android.compose.modifiers.thenIf
+import com.android.systemui.bouncer.ui.helper.BouncerSceneLayout
import com.android.systemui.bouncer.ui.viewmodel.ActionButtonAppearance
import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel
import com.android.systemui.common.shared.model.ContentDescription
@@ -65,9 +66,11 @@
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
+/** Renders the PIN button pad. */
@Composable
fun PinPad(
viewModel: PinBouncerViewModel,
+ layout: BouncerSceneLayout,
modifier: Modifier = Modifier,
) {
DisposableEffect(Unit) {
@@ -92,9 +95,9 @@
}
VerticalGrid(
- columns = 3,
- verticalSpacing = 12.dp,
- horizontalSpacing = 20.dp,
+ columns = columns,
+ verticalSpacing = layout.verticalSpacing,
+ horizontalSpacing = calculateHorizontalSpacingBetweenColumns(layout.gridWidth),
modifier = modifier,
) {
repeat(9) { index ->
@@ -254,7 +257,7 @@
val cornerRadius: Dp by
animateDpAsState(
- if (isAnimationEnabled && isPressed) 24.dp else pinButtonSize / 2,
+ if (isAnimationEnabled && isPressed) 24.dp else pinButtonMaxSize / 2,
label = "PinButton round corners",
animationSpec = tween(animDurationMillis, easing = animEasing)
)
@@ -284,7 +287,7 @@
contentAlignment = Alignment.Center,
modifier =
modifier
- .sizeIn(maxWidth = pinButtonSize, maxHeight = pinButtonSize)
+ .sizeIn(maxWidth = pinButtonMaxSize, maxHeight = pinButtonMaxSize)
.aspectRatio(1f)
.drawBehind {
drawRoundRect(
@@ -345,10 +348,32 @@
}
}
-private val pinButtonSize = 84.dp
-private val pinButtonErrorShrinkFactor = 67.dp / pinButtonSize
+/** Returns the amount of horizontal spacing between columns, in dips. */
+private fun calculateHorizontalSpacingBetweenColumns(
+ gridWidth: Dp,
+): Dp {
+ return (gridWidth - (pinButtonMaxSize * columns)) / (columns - 1)
+}
+
+/** The width of the grid of PIN pad buttons, in dips. */
+private val BouncerSceneLayout.gridWidth: Dp
+ get() = if (isUseCompactSize) 292.dp else 300.dp
+
+/** The spacing between rows of PIN pad buttons, in dips. */
+private val BouncerSceneLayout.verticalSpacing: Dp
+ get() = if (isUseCompactSize) 8.dp else 12.dp
+
+/** Number of columns in the PIN pad grid. */
+private const val columns = 3
+/** Maximum size (width and height) of each PIN pad button. */
+private val pinButtonMaxSize = 84.dp
+/** Scale factor to apply to buttons when animating the "error" animation on them. */
+private val pinButtonErrorShrinkFactor = 67.dp / pinButtonMaxSize
+/** Animation duration of the "shrink" phase of the error animation, on each PIN pad button. */
private const val pinButtonErrorShrinkMs = 50
+/** Amount of time to wait between application of the "error" animation to each row of buttons. */
private const val pinButtonErrorStaggerDelayMs = 33
+/** Animation duration of the "revert" phase of the error animation, on each PIN pad button. */
private const val pinButtonErrorRevertMs = 617
// Pin button motion spec: http://shortn/_9TTIG6SoEa
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
new file mode 100644
index 0000000..735c433
--- /dev/null
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt
@@ -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 com.android.systemui.media.controls.ui.composable
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.viewinterop.AndroidView
+import com.android.compose.animation.scene.ElementKey
+import com.android.compose.animation.scene.SceneScope
+import com.android.systemui.media.controls.ui.MediaCarouselController
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.util.animation.MeasurementInput
+
+private object MediaCarousel {
+ object Elements {
+ internal val Content = ElementKey("MediaCarouselContent")
+ }
+}
+
+@Composable
+fun SceneScope.MediaCarousel(
+ mediaHost: MediaHost,
+ modifier: Modifier = Modifier,
+ layoutWidth: Int,
+ layoutHeight: Int,
+ carouselController: MediaCarouselController,
+) {
+ // Notify controller to size the carousel for the current space
+ mediaHost.measurementInput = MeasurementInput(layoutWidth, layoutHeight)
+ carouselController.setSceneContainerSize(layoutWidth, layoutHeight)
+
+ AndroidView(
+ modifier = modifier.element(MediaCarousel.Elements.Content),
+ factory = { _ -> carouselController.mediaFrame },
+ )
+}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
index 7654683..f3cde53 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
@@ -17,11 +17,7 @@
package com.android.systemui.qs.ui.composable
import android.view.ContextThemeWrapper
-import android.view.View
-import android.view.ViewGroup
-import android.widget.FrameLayout
import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@@ -30,7 +26,6 @@
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
@@ -38,9 +33,15 @@
import androidx.compose.ui.viewinterop.AndroidView
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.SceneScope
+import com.android.compose.animation.scene.TransitionState
import com.android.compose.theme.colorAttr
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Expanding
import com.android.systemui.res.R
+import com.android.systemui.scene.ui.composable.Gone
+import com.android.systemui.scene.ui.composable.QuickSettings as QuickSettingsSceneKey
+import com.android.systemui.scene.ui.composable.Shade
object QuickSettings {
object Elements {
@@ -59,21 +60,45 @@
CompositionLocalProvider(LocalContext provides themedContext) { content() }
}
+private fun SceneScope.stateForQuickSettingsContent(): QSSceneAdapter.State {
+ return when (val transitionState = layoutState.transitionState) {
+ is TransitionState.Idle -> {
+ when (transitionState.currentScene) {
+ Shade -> QSSceneAdapter.State.QQS
+ QuickSettingsSceneKey -> QSSceneAdapter.State.QS
+ else -> QSSceneAdapter.State.CLOSED
+ }
+ }
+ is TransitionState.Transition ->
+ with(transitionState) {
+ when {
+ fromScene == Shade && toScene == QuickSettingsSceneKey -> Expanding(progress)
+ fromScene == QuickSettingsSceneKey && toScene == Shade -> Collapsing(progress)
+ toScene == Shade -> QSSceneAdapter.State.QQS
+ toScene == QuickSettingsSceneKey -> QSSceneAdapter.State.QS
+ toScene == Gone -> QSSceneAdapter.State.CLOSED
+ else -> error("Bad transition for QuickSettings: $transitionState")
+ }
+ }
+ }
+}
+
+/**
+ * This composable will show QuickSettingsContent in the correct state (as determined by its
+ * [SceneScope]).
+ */
@Composable
fun SceneScope.QuickSettings(
modifier: Modifier = Modifier,
qsSceneAdapter: QSSceneAdapter,
- state: QSSceneAdapter.State
) {
- // TODO(b/272780058): implement.
- Column(
- modifier =
- modifier
- .element(QuickSettings.Elements.Content)
- .fillMaxWidth()
- .defaultMinSize(minHeight = 300.dp)
+ val contentState = stateForQuickSettingsContent()
+
+ MovableElement(
+ key = QuickSettings.Elements.Content,
+ modifier = modifier.fillMaxWidth().defaultMinSize(minHeight = 300.dp)
) {
- QuickSettingsContent(qsSceneAdapter = qsSceneAdapter, state)
+ QuickSettingsContent(qsSceneAdapter = qsSceneAdapter, contentState)
}
}
@@ -87,37 +112,20 @@
QuickSettingsTheme {
val context = LocalContext.current
- val frame by remember(context) { mutableStateOf(FrameLayout(context)) }
-
LaunchedEffect(key1 = context) {
if (qsView == null) {
- qsSceneAdapter.inflate(context, frame)
+ qsSceneAdapter.inflate(context)
}
}
- qsView?.let {
- it.attachToParent(frame)
+ qsView?.let { view ->
AndroidView(
modifier = modifier.fillMaxSize().background(colorAttr(R.attr.underSurface)),
factory = { _ ->
qsSceneAdapter.setState(state)
- frame
+ view
},
- onRelease = { frame.removeAllViews() },
update = { qsSceneAdapter.setState(state) }
)
}
}
}
-
-private fun View.attachToParent(parent: ViewGroup) {
- if (this.parent != null && this.parent != parent) {
- (this.parent as ViewGroup).removeView(this)
- }
- if (this.parent != parent) {
- parent.addView(
- this,
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT,
- )
- }
-}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 871d9f9..d8c7290 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -46,7 +46,6 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.notifications.ui.composable.HeadsUpNotificationSpace
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneViewModel
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.ui.composable.ComposableScene
@@ -156,7 +155,6 @@
QuickSettings(
modifier = Modifier.fillMaxHeight(),
viewModel.qsSceneAdapter,
- QSSceneAdapter.State.QS
)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 2df151b..9c0f1fe 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -23,23 +23,33 @@
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.dp
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.media.controls.ui.MediaCarouselController
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.media.controls.ui.composable.MediaCarousel
+import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL
import com.android.systemui.notifications.ui.composable.NotificationStack
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.composable.QuickSettings
+import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Direction
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
@@ -49,7 +59,9 @@
import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager
import com.android.systemui.statusbar.phone.StatusBarLocation
+import com.android.systemui.util.animation.MeasurementInput
import javax.inject.Inject
+import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -59,6 +71,7 @@
object Shade {
object Elements {
val QuickSettings = ElementKey("ShadeQuickSettings")
+ val MediaCarousel = ElementKey("ShadeMediaCarousel")
val Scrim = ElementKey("ShadeScrim")
val ScrimBackground = ElementKey("ShadeScrimBackground")
}
@@ -87,6 +100,8 @@
private val tintedIconManagerFactory: TintedIconManager.Factory,
private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
private val statusBarIconController: StatusBarIconController,
+ private val mediaCarouselController: MediaCarouselController,
+ @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost,
) : ComposableScene {
override val key = SceneKey.Shade
@@ -108,6 +123,8 @@
createTintedIconManager = tintedIconManagerFactory::create,
createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
statusBarIconController = statusBarIconController,
+ mediaCarouselController = mediaCarouselController,
+ mediaHost = mediaHost,
modifier = modifier,
)
@@ -127,8 +144,12 @@
createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
statusBarIconController: StatusBarIconController,
+ mediaCarouselController: MediaCarouselController,
+ mediaHost: MediaHost,
modifier: Modifier = Modifier,
) {
+ val layoutWidth = remember { mutableStateOf(0) }
+
Box(modifier.element(Shade.Elements.Scrim)) {
Spacer(
modifier =
@@ -157,8 +178,35 @@
QuickSettings(
modifier = Modifier.wrapContentHeight(),
viewModel.qsSceneAdapter,
- QSSceneAdapter.State.QQS
)
+
+ if (viewModel.isMediaVisible()) {
+ val mediaHeight = dimensionResource(R.dimen.qs_media_session_height_expanded)
+ MediaCarousel(
+ modifier =
+ Modifier.height(mediaHeight).fillMaxWidth().layout { measurable, constraints
+ ->
+ val placeable = measurable.measure(constraints)
+
+ // Notify controller to size the carousel for the current space
+ mediaHost.measurementInput =
+ MeasurementInput(placeable.width, placeable.height)
+ mediaCarouselController.setSceneContainerSize(
+ placeable.width,
+ placeable.height
+ )
+
+ layout(placeable.width, placeable.height) {
+ placeable.placeRelative(0, 0)
+ }
+ },
+ mediaHost = mediaHost,
+ layoutWidth = layoutWidth.value,
+ layoutHeight = with(LocalDensity.current) { mediaHeight.toPx() }.toInt(),
+ carouselController = mediaCarouselController,
+ )
+ }
+
Spacer(modifier = Modifier.height(16.dp))
NotificationStack(
viewModel = viewModel.notifications,
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
index 42ba643..5375591 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt
@@ -53,6 +53,7 @@
private val resources: Resources,
private val settings: ClockSettings?,
private val hasStepClockAnimation: Boolean = false,
+ private val migratedClocks: Boolean = false,
) : ClockController {
override val smallClock: DefaultClockFaceController
override val largeClock: LargeClockFaceController
@@ -195,6 +196,10 @@
}
override fun recomputePadding(targetRegion: Rect?) {
+ // TODO(b/310989341): remove after changing migrate_clocks_to_blueprint to aconfig
+ if (migratedClocks) {
+ return
+ }
// We center the view within the targetRegion instead of within the parent
// view by computing the difference and adding that to the padding.
val lp = view.getLayoutParams() as FrameLayout.LayoutParams
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
index dd52e39..f819da5 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt
@@ -32,7 +32,8 @@
val ctx: Context,
val layoutInflater: LayoutInflater,
val resources: Resources,
- val hasStepClockAnimation: Boolean = false
+ val hasStepClockAnimation: Boolean = false,
+ val migratedClocks: Boolean = false
) : ClockProvider {
override fun getClocks(): List<ClockMetadata> = listOf(ClockMetadata(DEFAULT_CLOCK_ID))
@@ -47,6 +48,7 @@
resources,
settings,
hasStepClockAnimation,
+ migratedClocks,
)
}
diff --git a/packages/SystemUI/docs/qs-tiles.md b/packages/SystemUI/docs/qs-tiles.md
index bd0b4ab..ee388ec 100644
--- a/packages/SystemUI/docs/qs-tiles.md
+++ b/packages/SystemUI/docs/qs-tiles.md
@@ -4,25 +4,37 @@
## About this document
-This document is a more or less comprehensive summary of the state and infrastructure used by Quick Settings tiles. It provides descriptions about the lifecycle of a tile, how to create new tiles and how SystemUI manages and displays tiles, among other topics.
+This document is a more or less comprehensive summary of the state and infrastructure used by Quick
+Settings tiles. It provides descriptions about the lifecycle of a tile, how to create new tiles and
+how SystemUI manages and displays tiles, among other topics.
## What are Quick Settings Tiles?
-Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to toggle many settings. This is opened by expanding the notification drawer twice (or once when phone is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications before expanding twice and contains some of the toggles with no secondary line.
+Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to
+toggle many settings. This is opened by expanding the notification drawer twice (or once when phone
+is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications
+before expanding twice and contains some of the toggles with no secondary line.
-Each of these toggles that appear either in QS or QQS are called Quick Settings Tiles (or tiles for short). They allow the user to enable or disable settings quickly and sometimes provides access to more comprehensive settings pages.
+Each of these toggles that appear either in QS or QQS are called Quick Settings Tiles (or tiles for
+short). They allow the user to enable or disable settings quickly and sometimes provides access to
+more comprehensive settings pages.
The following image shows QQS on the left and QS on the right, with the tiles highlighted.

-QS Tiles usually depend on one or more Controllers that bind the tile with the necessary service. Controllers are obtained by the backend and used for communication between the user and the device.
+QS Tiles usually depend on one or more Controllers that bind the tile with the necessary service.
+Controllers are obtained by the backend and used for communication between the user and the device.
### A note on multi-user support
-All the classes described in this document that live inside SystemUI are only instantiated in the process of user 0. The different controllers that back the QS Tiles (also instantiated just in user 0) are user aware and provide an illusion of different instances for different users.
+All the classes described in this document that live inside SystemUI are only instantiated in the
+process of user 0. The different controllers that back the QS Tiles (also instantiated just in user
+0) are user aware and provide an illusion of different instances for different users.
-For an example on this, see [`RotationLockController`](/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java). This controller for the `RotationLockTile` listens to changes in all users.
+For an example on this,
+see [`RotationLockController`](/packages/SystemUI/src/com/android/systemui/statusbar/policy/RotationLockControllerImpl.java).
+This controller for the `RotationLockTile` listens to changes in all users.
## What are tiles made of?
@@ -30,104 +42,161 @@
QS Tiles are composed of the following backend classes.
-* [`QSTile`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java): Interface providing common behavior for all Tiles. This class also contains some useful utility classes needed for the tiles.
- * `Icon`: Defines the basic interface for an icon as used by the tiles.
- * `State`: Encapsulates the state of the Tile in order to communicate between the backend and the UI.
-* [`QSTileImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java): Abstract implementation of `QSTile`, providing basic common behavior for all tiles. Also implements extensions for different types of `Icon`. All tiles currently defined in SystemUI subclass from this implementation.
-* [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles): Each tile from SystemUI is defined here by a class that extends `QSTileImpl`. These implementations connect to corresponding controllers. The controllers serve two purposes:
- * track the state of the device and notify the tile when a change has occurred (for example, bluetooth connected to a device)
- * accept actions from the tiles to modify the state of the phone (for example, enablind and disabling wifi).
-* [`CustomTile`](/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java): Equivalent to the tiles in the previous item, but used for 3rd party tiles. In depth information to be found in [`CustomTile`](#customtile)
+* [`QSTile`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java): Interface
+ providing common behavior for all Tiles. This class also contains some useful utility classes
+ needed for the tiles.
+ * `Icon`: Defines the basic interface for an icon as used by the tiles.
+ * `State`: Encapsulates the state of the Tile in order to communicate between the backend and
+ the UI.
+* [`QSTileImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java): Abstract
+ implementation of `QSTile`, providing basic common behavior for all tiles. Also implements
+ extensions for different types of `Icon`. All tiles currently defined in SystemUI subclass from
+ this implementation.
+* [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles):
+ Each tile from SystemUI is defined here by a class that extends `QSTileImpl`. These
+ implementations connect to corresponding controllers. The controllers serve two purposes:
+ * track the state of the device and notify the tile when a change has occurred (for example,
+ bluetooth connected to a device)
+ * accept actions from the tiles to modify the state of the phone (for example, enablind and
+ disabling wifi).
+* [`CustomTile`](/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java):
+ Equivalent to the tiles in the previous item, but used for 3rd party tiles. In depth information
+ to be found in [`CustomTile`](#customtile)
-All the elements in SystemUI that work with tiles operate on `QSTile` or the interfaces defined in it. However, all the current implementations of tiles in SystemUI subclass from `QSTileImpl`, as it takes care of many common situations. Throughout this document, we will focus on `QSTileImpl` as examples of tiles.
+All the elements in SystemUI that work with tiles operate on `QSTile` or the interfaces defined in
+it. However, all the current implementations of tiles in SystemUI subclass from `QSTileImpl`, as it
+takes care of many common situations. Throughout this document, we will focus on `QSTileImpl` as
+examples of tiles.
-The interfaces in `QSTile` as well as other interfaces described in this document can be used to implement plugins to add additional tiles or different behavior. For more information, see [plugins.md](plugins.md)
+The interfaces in `QSTile` as well as other interfaces described in this document can be used to
+implement plugins to add additional tiles or different behavior. For more information,
+see [plugins.md](plugins.md)
#### Tile State
-Each tile has an associated `State` object that is used to communicate information to the corresponding view. The base class `State` has (among others) the following fields:
+Each tile has an associated `State` object that is used to communicate information to the
+corresponding view. The base class `State` has (among others) the following fields:
* **`state`**: one of `Tile#STATE_UNAVAILABLE`, `Tile#STATE_ACTIVE`, `Tile#STATE_INACTIVE`.
* **`icon`**; icon to display. It may depend on the current state.
* **`label`**: usually the name of the tile.
* **`secondaryLabel`**: text to display in a second line. Usually extra state information.
* **`contentDescription`**
-* **`expandedAccessibilityClassName`**: usually `Switch.class.getName()` for boolean Tiles. This will make screen readers read the current state of the tile as well as the new state when it's toggled. For this, the Tile has to use `BooleanState`.
-* **`handlesLongClick`**: whether the Tile will handle long click. If it won't, it should be set to `false` so it will not be announced for accessibility.
+* **`expandedAccessibilityClassName`**: usually `Switch.class.getName()` for boolean Tiles. This
+ will make screen readers read the current state of the tile as well as the new state when it's
+ toggled. For this, the Tile has to use `BooleanState`.
+* **`handlesLongClick`**: whether the Tile will handle long click. If it won't, it should be set
+ to `false` so it will not be announced for accessibility.
Setting any of these fields during `QSTileImpl#handleUpdateState` will update the UI after it.
-Additionally. `BooleanState` has a `value` boolean field that usually would be set to `state == Tile#STATE_ACTIVE`. This is used by accessibility services along with `expandedAccessibilityClassName`.
+Additionally. `BooleanState` has a `value` boolean field that usually would be set
+to `state == Tile#STATE_ACTIVE`. This is used by accessibility services along
+with `expandedAccessibilityClassName`.
#### SystemUI tiles
-Each tile defined in SystemUI extends `QSTileImpl`. This abstract class implements some common functions and leaves others to be implemented by each tile, in particular those that determine how to handle different events (refresh, click, etc.).
+Each tile defined in SystemUI extends `QSTileImpl`. This abstract class implements some common
+functions and leaves others to be implemented by each tile, in particular those that determine how
+to handle different events (refresh, click, etc.).
-For more information on how to implement a tile in SystemUI, see [Implementing a SystemUI tile](#implementing-a-systemui-tile).
+For more information on how to implement a tile in SystemUI,
+see [Implementing a SystemUI tile](#implementing-a-systemui-tile).
### Tile views
-Each Tile has a couple of associated views for displaying it in QS and QQS. These views are updated after the backend updates the `State` using `QSTileImpl#handleUpdateState`.
+Each Tile has a couple of associated views for displaying it in QS and QQS. These views are updated
+after the backend updates the `State` using `QSTileImpl#handleUpdateState`.
-* **[`QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**: Abstract class that provides basic Tile functionality. These allows external [Factories](#qsfactory) to create Tiles.
-* **[`QSTileViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.java)**: Implementation of `QSTileView`. It takes care of the following:
- * Holding the icon
- * Background color and shape
- * Ripple
- * Click listening
- * Labels
+* **[`QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**:
+ Abstract class that provides basic Tile functionality. These allows
+ external [Factories](#qsfactory) to create Tiles.
+* **[`QSTileViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.java)**:
+ Implementation of `QSTileView`. It takes care of the following:
+ * Holding the icon
+ * Background color and shape
+ * Ripple
+ * Click listening
+ * Labels
* **[`QSIconView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSIconView.java)**
* **[`QSIconViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java)**
#### QSIconView and QSIconViewImpl
-`QSIconView` is an interface that define the basic actions that icons have to respond to. Its base implementation in SystemUI is `QSIconViewImpl` and it and its subclasses are used by all QS tiles.
+`QSIconView` is an interface that define the basic actions that icons have to respond to. Its base
+implementation in SystemUI is `QSIconViewImpl` and it and its subclasses are used by all QS tiles.
-This `ViewGroup` is a container for the icon used in each tile. It has methods to apply the current `State` of the tile, modifying the icon (color and animations). Classes that inherit from this can add other details that are modified when the `State` changes.
+This `ViewGroup` is a container for the icon used in each tile. It has methods to apply the
+current `State` of the tile, modifying the icon (color and animations). Classes that inherit from
+this can add other details that are modified when the `State` changes.
-Each `QSTileImpl` can specify that they use a particular implementation of this class when creating an icon.
+Each `QSTileImpl` can specify that they use a particular implementation of this class when creating
+an icon.
### How are the backend and the views related?
-The backend of the tiles (all the implementations of `QSTileImpl`) communicate with the views by using a `State`. The backend populates the state, and then the view maps the state to a visual representation.
+The backend of the tiles (all the implementations of `QSTileImpl`) communicate with the views by
+using a `State`. The backend populates the state, and then the view maps the state to a visual
+representation.
-It's important to notice that the state of the tile (internal or visual) is not directly modified by a user action like clicking on the tile. Instead, acting on a tile produces internal state changes on the device, and those trigger the changes on the tile state and UI.
+It's important to notice that the state of the tile (internal or visual) is not directly modified by
+a user action like clicking on the tile. Instead, acting on a tile produces internal state changes
+on the device, and those trigger the changes on the tile state and UI.
-When a container for tiles (`QuickQSPanel` or `QSPanel`) has to display tiles, they create a [`TileRecord`](/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java). This associates the corresponding `QSTile` with its `QSTileView`, doing the following:
+When a container for tiles (`QuickQSPanel` or `QSPanel`) has to display tiles, they create
+a [`TileRecord`](/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java). This associates the
+corresponding `QSTile` with its `QSTileView`, doing the following:
* Create the corresponding `QSTileView` to display in that container.
-* Create a callback for `QSTile` to call when its state changes. Note that a single tile will normally have up to two callbacks: one for QS and one for QQS.
+* Create a callback for `QSTile` to call when its state changes. Note that a single tile will
+ normally have up to two callbacks: one for QS and one for QQS.
#### Life of a tile click
-This is a brief run-down of what happens when a user clicks on a tile. Internal changes on the device (for example, changes from Settings) will trigger this process starting in step 3. Throughout this section, we assume that we are dealing with a `QSTileImpl`.
+This is a brief run-down of what happens when a user clicks on a tile. Internal changes on the
+device (for example, changes from Settings) will trigger this process starting in step 3. Throughout
+this section, we assume that we are dealing with a `QSTileImpl`.
1. User clicks on tile. The following calls happen in sequence:
- 1. `QSTileViewImpl#onClickListener`.
- 2. `QSTile#click`.
- 3. `QSTileImpl#handleClick`. This last call sets the new state for the device by using the associated controller.
+ 1. `QSTileViewImpl#onClickListener`.
+ 2. `QSTile#click`.
+ 3. `QSTileImpl#handleClick`. This last call sets the new state for the device by using the
+ associated controller.
2. State in the device changes. This is normally outside of SystemUI's control.
-3. Controller receives a callback (or `Intent`) indicating the change in the device. The following calls happen:
- 1. `QSTileImpl#refreshState`, maybe passing an object with necessary information regarding the new state.
- 2. `QSTileImpl#handleRefreshState`
-4. `QSTileImpl#handleUpdateState` is called to update the state with the new information. This information can be obtained both from the `Object` passed to `refreshState` as well as from the controller.
-5. If the state has changed (in at least one element), `QSTileImpl#handleStateChanged` is called. This will trigger a call to all the associated `QSTile.Callback#onStateChanged`, passing the new `State`.
-6. `QSTileView#onStateChanged` is called and this calls `QSTileView#handleStateChanged`. This method maps the state into the view:
- * The tile colors change to match the new state.
- * `QSIconView.setIcon` is called to apply the correct state to the icon and the correct icon to the view.
- * The tile labels change to match the new state.
+3. Controller receives a callback (or `Intent`) indicating the change in the device. The following
+ calls happen:
+ 1. `QSTileImpl#refreshState`, maybe passing an object with necessary information regarding the
+ new state.
+ 2. `QSTileImpl#handleRefreshState`
+4. `QSTileImpl#handleUpdateState` is called to update the state with the new information. This
+ information can be obtained both from the `Object` passed to `refreshState` as well as from the
+ controller.
+5. If the state has changed (in at least one element), `QSTileImpl#handleStateChanged` is called.
+ This will trigger a call to all the associated `QSTile.Callback#onStateChanged`, passing the
+ new `State`.
+6. `QSTileView#onStateChanged` is called and this calls `QSTileView#handleStateChanged`. This method
+ maps the state into the view:
+ * The tile colors change to match the new state.
+ * `QSIconView.setIcon` is called to apply the correct state to the icon and the correct icon to
+ the view.
+ * The tile labels change to match the new state.
## Third party tiles (TileService)
-A third party tile is any Quick Settings tile that is provided by an app (that's not SystemUI). This is implemented by developers subclassing [`TileService`](/core/java/android/service/quicksettings/TileService.java) and interacting with its API.
+A third party tile is any Quick Settings tile that is provided by an app (that's not SystemUI). This
+is implemented by developers
+subclassing [`TileService`](/core/java/android/service/quicksettings/TileService.java) and
+interacting with its API.
### API classes
-The classes that define the public API are in [core/java/android/service/quicksettings](/core/java/android/service/quicksettings).
+The classes that define the public API are
+in [core/java/android/service/quicksettings](/core/java/android/service/quicksettings).
#### Tile
-Parcelable class used to communicate information about the state between the external app and SystemUI. The class supports the following fields:
+Parcelable class used to communicate information about the state between the external app and
+SystemUI. The class supports the following fields:
* Label
* Subtitle
@@ -135,18 +204,25 @@
* State (`Tile#STATE_ACTIVE`, `Tile#STATE_INACTIVE`, `Tile#STATE_UNAVAILABLE`)
* Content description
-Additionally, it provides a method to notify SystemUI that the information may have changed and the tile should be refreshed.
+Additionally, it provides a method to notify SystemUI that the information may have changed and the
+tile should be refreshed.
#### TileService
-This is an abstract Service that needs to be implemented by the developer. The Service manifest must have the permission `android.permission.BIND_QUICK_SETTINGS_TILE` and must respond to the action `android.service.quicksettings.action.QS_TILE`. This will allow SystemUI to find the available tiles and display them to the user.
+This is an abstract Service that needs to be implemented by the developer. The Service manifest must
+have the permission `android.permission.BIND_QUICK_SETTINGS_TILE` and must respond to the
+action `android.service.quicksettings.action.QS_TILE`. This will allow SystemUI to find the
+available tiles and display them to the user.
-The implementer is responsible for creating the methods that will respond to the following calls from SystemUI:
+The implementer is responsible for creating the methods that will respond to the following calls
+from SystemUI:
* **`onTileAdded`**: called when the tile is added to QS.
* **`onTileRemoved`**: called when the tile is removed from QS.
-* **`onStartListening`**: called when QS is opened and the tile is showing. This marks the start of the window when calling `getQSTile` is safe and will provide the correct object.
-* **`onStopListening`**: called when QS is closed or the tile is no longer visible by the user. This marks the end of the window described in `onStartListening`.
+* **`onStartListening`**: called when QS is opened and the tile is showing. This marks the start of
+ the window when calling `getQSTile` is safe and will provide the correct object.
+* **`onStopListening`**: called when QS is closed or the tile is no longer visible by the user. This
+ marks the end of the window described in `onStartListening`.
* **`onClick`**: called when the user clicks on the tile.
Additionally, the following final methods are provided:
@@ -155,7 +231,8 @@
public final Tile getQsTile()
```
- Provides the tile object that can be modified. This should only be called in the window between `onStartListening` and `onStopListening`.
+ Provides the tile object that can be modified. This should only be called in the window
+ between `onStartListening` and `onStopListening`.
* ```java
public final boolean isLocked()
@@ -163,13 +240,15 @@
public final boolean isSecure()
```
- Provide information about the secure state of the device. This can be used by the tile to accept or reject actions on the tile.
+ Provide information about the secure state of the device. This can be used by the tile to accept
+ or reject actions on the tile.
* ```java
public final void unlockAndRun(Runnable)
```
- May prompt the user to unlock the device if locked. Once the device is unlocked, it runs the given `Runnable`.
+ May prompt the user to unlock the device if locked. Once the device is unlocked, it runs the
+ given `Runnable`.
* ```java
public final void showDialog(Dialog)
@@ -179,162 +258,272 @@
##### Binding
-When the Service is bound, a callback Binder is provided by SystemUI for all the callbacks, as well as an identifier token (`Binder`). This token is used in the callbacks to identify this `TileService` and match it to the corresponding tile.
+When the Service is bound, a callback Binder is provided by SystemUI for all the callbacks, as well
+as an identifier token (`Binder`). This token is used in the callbacks to identify
+this `TileService` and match it to the corresponding tile.
-The tiles are bound once immediately on creation. After that, the tile is bound whenever it should start listening. When the panels are closed, and the tile is set to stop listening, it will be unbound after a delay of `TileServiceManager#UNBIND_DELAY` (30s), if it's not set to listening again.
+The tiles are bound once immediately on creation. After that, the tile is bound whenever it should
+start listening. When the panels are closed, and the tile is set to stop listening, it will be
+unbound after a delay of `TileServiceManager#UNBIND_DELAY` (30s), if it's not set to listening
+again.
##### Active tile
-A `TileService` can be declared as an active tile by adding specific meta-data to its manifest (see [TileService#META_DATA_ACTIVE_TILE](https://developer.android.com/reference/android/service/quicksettings/TileService#META_DATA_ACTIVE_TILE)). In this case, it won't receive a call of `onStartListening` when QS is opened. Instead, the tile must request listening status by making a call to `TileService#requestListeningState` with its component name. This will initiate a window that will last until the tile is updated.
+A `TileService` can be declared as an active tile by adding specific meta-data to its manifest (
+see [TileService#META_DATA_ACTIVE_TILE](https://developer.android.com/reference/android/service/quicksettings/TileService#META_DATA_ACTIVE_TILE)).
+In this case, it won't receive a call of `onStartListening` when QS is opened. Instead, the tile
+must request listening status by making a call to `TileService#requestListeningState` with its
+component name. This will initiate a window that will last until the tile is updated.
The tile will also be granted listening status if it's clicked by the user.
### SystemUI classes
-The following sections describe the classes that live in SystemUI to support third party tiles. These classes live in [SystemUI/src/com/android/systemui/qs/external](/packages/SystemUI/src/com/android/systemui/qs/external/)
+The following sections describe the classes that live in SystemUI to support third party tiles.
+These classes live
+in [SystemUI/src/com/android/systemui/qs/external](/packages/SystemUI/src/com/android/systemui/qs/external/)
#### CustomTile
-This class is an subclass of `QSTileImpl` to be used with third party tiles. It provides similar behavior to SystemUI tiles as well as handling exclusive behavior like lifting default icons and labels from the application manifest.
+This class is an subclass of `QSTileImpl` to be used with third party tiles. It provides similar
+behavior to SystemUI tiles as well as handling exclusive behavior like lifting default icons and
+labels from the application manifest.
#### TileServices
-This class is the central controller for all tile services that are currently in Quick Settings as well as provides the support for starting new ones. It is also an implementation of the `Binder` that receives all calls from current `TileService` components and dispatches them to SystemUI or the corresponding `CustomTile`.
+This class is the central controller for all tile services that are currently in Quick Settings as
+well as provides the support for starting new ones. It is also an implementation of the `Binder`
+that receives all calls from current `TileService` components and dispatches them to SystemUI or the
+corresponding `CustomTile`.
-Whenever a binder call is made to this class, it matches the corresponding token assigned to the `TileService` with the `ComponentName` and verifies that the call comes from the right UID to prevent spoofing.
+Whenever a binder call is made to this class, it matches the corresponding token assigned to
+the `TileService` with the `ComponentName` and verifies that the call comes from the right UID to
+prevent spoofing.
-As this class is the only one that's aware of every `TileService` that's currently bound, it is also in charge of requesting some to be unbound whenever there is a low memory situation.
+As this class is the only one that's aware of every `TileService` that's currently bound, it is also
+in charge of requesting some to be unbound whenever there is a low memory situation.
#### TileLifecycleManager
-This class is in charge of binding and unbinding to a particular `TileService` when necessary, as well as sending the corresponding binder calls. It does not decide whether the tile should be bound or unbound, unless it's requested to process a message. It additionally handles errors in the `Binder` as well as changes in the corresponding component (like updates and enable/disable).
+This class is in charge of binding and unbinding to a particular `TileService` when necessary, as
+well as sending the corresponding binder calls. It does not decide whether the tile should be bound
+or unbound, unless it's requested to process a message. It additionally handles errors in
+the `Binder` as well as changes in the corresponding component (like updates and enable/disable).
-The class has a queue that stores requests while the service is not bound, to be processed as soon as the service is bound.
+The class has a queue that stores requests while the service is not bound, to be processed as soon
+as the service is bound.
-Each `TileService` gets assigned an exclusive `TileLifecycleManager` when its corresponding tile is added to the set of current ones and kept as long as the tile is available to the user.
+Each `TileService` gets assigned an exclusive `TileLifecycleManager` when its corresponding tile is
+added to the set of current ones and kept as long as the tile is available to the user.
#### TileServiceManager
-Each instance of this class is an intermediary between the `TileServices` controller and a `TileLifecycleManager` corresponding to a particular `TileService`.
+Each instance of this class is an intermediary between the `TileServices` controller and
+a `TileLifecycleManager` corresponding to a particular `TileService`.
This class handles management of the service, including:
* Deciding when to bind and unbind, requesting it to the `TileLifecycleManager`.
* Relaying messages to the `TileService` through the `TileLifecycleManager`.
* Determining the service's bind priority (to deal with OOM situations).
-* Detecting when the package/component has been removed in order to remove the tile and references to it.
+* Detecting when the package/component has been removed in order to remove the tile and references
+ to it.
## How are tiles created/instantiated?
-This section describes the classes that aid in the creation of each tile as well as the complete lifecycle of a tile. First we describe two important interfaces/classes.
+This section describes the classes that aid in the creation of each tile as well as the complete
+lifecycle of a tile. The current system makes use of flows to propagate information downstream.
-### QSTileHost
+First we describe three important interfaces/classes.
-This class keeps track of the tiles selected by the current user (backed in the Secure Setting `sysui_qs_tiles`) to be displayed in Quick Settings. Whenever the value of this setting changes (or on device start), the whole list of tiles is read. This is compared with the current tiles, destroying unnecessary ones and creating needed ones.
+### TileSpecRepository (and UserTileSpecRepository)
-It additionally provides a point of communication between the tiles and the StatusBar, for example to open it and collapse it. And a way for the StatusBar service to add tiles (only works for `CustomTile`).
+These classes keep track of the current tiles for each user, as a list of Tile specs. While the
+device is running, this is the source of truth of tiles for that user.
+
+The list is persisted to `Settings.Secure` every time it changes so it will be available upon
+restart or backup. In particular, any changes in the secure setting while this repository is
+tracking the list of tiles will be reverted.
+
+The class provides a `Flow<List<TileSpec>>` for each user that can be collected to keep track of the
+current list of tiles.
#### Tile specs
-Each single tile is identified by a spec, which is a unique String for that type of tile. The current tiles are stored as a Setting string of comma separated values of these specs. Additionally, the default tiles (that appear on a fresh system) configuration value is stored likewise.
+Each single tile is identified by a spec, which is a unique String for that type of tile. The
+current tiles are stored as a Setting string of comma separated values of these specs. Additionally,
+the default tiles (that appear on a fresh system) configuration value is stored likewise.
-SystemUI tile specs are usually a single simple word identifying the tile (like `wifi` or `battery`). Custom tile specs are always a string of the form `custom(...)` where the ellipsis is a flattened String representing the `ComponentName` for the corresponding `TileService`.
+SystemUI tile specs are usually a single simple word identifying the tile (like `wifi`
+or `battery`). Custom tile specs are always a string of the form `custom(...)` where the ellipsis is
+a flattened String representing the `ComponentName` for the corresponding `TileService`.
+
+We represent these internally using a `TileSpec` class that can distinguish between platform tiles
+and custom tiles.
+
+### CurrentTilesInteractor
+
+This class consumes the lists of specs provided by `TileSpecRepository` and produces a
+`Flow<List<Pair<TileSpec, QSTile>>>` with the current tiles for the current user.
+
+Internally, whenever the list of tiles changes, the following operation is performed:
+* Properly dispose of tiles that are no longer in the current list.
+* Properly dispose of tiles that are no longer available.
+* If the user has changed, relay the new user to the platform tiles and destroy any custom tiles.
+* Create new tiles as needed, disposing those that are not available or when the corresponding
+ service does not exist.
+* Reorder the tiles.
+
+Also, when this is completed, we pass the final list back to the repository so it matches the
+correct list of tiles.
### QSFactory
-This interface provides a way of creating tiles and views from a spec. It can be used in plugins to provide different definitions for tiles.
+This interface provides a way of creating tiles and views from a spec. It can be used in plugins to
+provide different definitions for tiles.
-In SystemUI there is only one implementation of this factory and that is the default factory (`QSFactoryImpl`) in `QSTileHost`.
+In SystemUI there is only one implementation of this factory and that is the default
+factory (`QSFactoryImpl`) in `CurrentTilesInteractorImpl`.
#### QSFactoryImpl
-This class implements two methods as specified in the `QSFactory` interface:
+This class implements the following method as specified in the `QSFactory` interface:
* ```java
public QSTile createTile(String)
```
- Creates a tile (backend) from a given spec. The factory has providers for all of the SystemUI tiles, returning one when the correct spec is used.
+ Creates a tile (backend) from a given spec. The factory has a map with providers for all of the
+ SystemUI tiles, returning one when the correct spec is used.
- If the spec is not recognized but it has the `custom(` prefix, the factory tries to create a `CustomTile` for the component in the spec. This could fail (the component is not a valid `TileService` or is not enabled) and will be detected later when the tile is polled to determine if it's available.
+ If the spec is not recognized but it has the `custom(` prefix, the factory tries to create
+ a `CustomTile` for the component in the spec.
-* ```java
- public QSTileView createTileView(QSTile, boolean)
- ```
-
- Creates a view for the corresponding `QSTile`. The second parameter determines if the view that is created should be a collapsed one (for using in QQS) or not (for using in QS).
+ As part of filtering not valid tiles, custom tiles that don't have a corresponding valid service
+ component are never instantiated.
### Lifecycle of a Tile
-We describe first the parts of the lifecycle that are common to SystemUI tiles and third party tiles. Following that, there will be a section with the steps that are exclusive to third party tiles.
+We describe first the parts of the lifecycle that are common to SystemUI tiles and third party
+tiles. Following that, there will be a section with the steps that are exclusive to third party
+tiles.
-1. The tile is added through the QS customizer by the user. This will immediately save the new list of tile specs to the Secure Setting `sysui_qs_tiles`. This step could also happend if `StatusBar` adds tiles (either through adb, or through its service interface as with the `DevelopmentTiles`).
-2. This triggers a "setting changed" that is caught by `QSTileHost`. This class processes the new value of the setting and finds out that there is a new spec in the list. Alternatively, when the device is booted, all tiles in the setting are considered as "new".
-3. `QSTileHost` calls all the available `QSFactory` classes that it has registered in order to find the first one that will be able to create a tile with that spec. Assume that `QSFactoryImpl` managed to create the tile, which is some implementation of `QSTile` (either a SystemUI subclass of `QSTileImpl` or a `CustomTile`). If the tile is available, it's stored in a map and things proceed forward.
-4. `QSTileHost` calls its callbacks indicating that the tiles have changed. In particular, `QSPanel` and `QuickQSPanel` receive this call with the full list of tiles. We will focus on these two classes.
-5. For each tile in this list, a `QSTileView` is created (collapsed or expanded) and attached to a `TileRecord` containing the tile backend and the view. Additionally:
- * a callback is attached to the tile to communicate between the backend and the view or the panel.
+1. The tile is added through the QS customizer by the user. This will send the new list of tiles to
+ `TileSpecRepository` which will update its internal state and also store the new value in the
+ secure setting `sysui_qs_tiles`. This step could also happen if `StatusBar` adds tiles (either
+ through adb, or through its service interface as with the `DevelopmentTiles`).
+2. This updates the flow that `CurrentTilesInteractor` is collecting from, triggering the process
+ described above.
+3. `CurrentTilesInteractor` calls the available `QSFactory` classes in order to find one that will
+ be able to create a tile with that spec. Assuming that `QSFactoryImpl` managed to create the
+ tile, which is some implementation of `QSTile` (either a SystemUI subclass
+ of `QSTileImpl` or a `CustomTile`) it will be added to the current list.
+ If the tile is available, it's stored in a map and things proceed forward.
+4. `CurrentTilesInteractor` updates its flow and classes collecting from it will be notified of the
+ change. In particular, `QSPanel` and `QuickQSPanel` receive this call with the full list of
+ tiles. We will focus on these two classes.
+5. For each tile in this list, a `QSTileView` is created (collapsed or expanded) and attached to
+ a `TileRecord` containing the tile backend and the view. Additionally:
+ * a callback is attached to the tile to communicate between the backend and the view or the
+ panel.
* the click listeners in the tile are attached to those of the view.
6. The tile view is added to the corresponding layout.
-When the tile is removed from the list of current tiles, all these classes are properly disposed including removing the callbacks and making sure that the backends remove themselves from the controllers they were listening to.
+When the tile is removed from the list of current tiles, all these classes are properly disposed
+including removing the callbacks and making sure that the backends remove themselves from the
+controllers they were listening to.
#### Lifecycle of a CustomTile
-In step 3 of the previous process, when a `CustomTile` is created, additional steps are taken to ensure the proper binding to the service as described in [Third party tiles (TileService)](#third-party-tiles-tileservice).
+In step 3 of the previous process, when a `CustomTile` is created, additional steps are taken to
+ensure the proper binding to the service as described
+in [Third party tiles (TileService)](#third-party-tiles-tileservice).
-1. The `CustomTile` obtains the `TileServices` class from the `QSTileHost` and request the creation of a `TileServiceManager` with its token. As the spec for the `CustomTile` contains the `ComponentName` of the associated service, this can be used to bind to it.
-2. The `TileServiceManager` creates its own `TileLifecycleManager` to take care of binding to the service.
-3. `TileServices` creates maps between the token, the `CustomTile`, the `TileServiceManager`, the token and the `ComponentName`.
+1. The `CustomTile` obtains the `TileServices` class from the `QSTileHost` and request the creation
+ of a `TileServiceManager` with its token. As the spec for the `CustomTile` contains
+ the `ComponentName` of the associated service, this can be used to bind to it.
+2. The `TileServiceManager` creates its own `TileLifecycleManager` to take care of binding to the
+ service.
+3. `TileServices` creates maps between the token, the `CustomTile`, the `TileServiceManager`, the
+ token and the `ComponentName`.
## Implementing a tile
-This section describes necessary and recommended steps when implementing a Quick Settings tile. Some of them are optional and depend on the requirements of the tile.
+This section describes necessary and recommended steps when implementing a Quick Settings tile. Some
+of them are optional and depend on the requirements of the tile.
### Implementing a SystemUI tile
-1. Create a class (preferably in [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles)) implementing `QSTileImpl` with a particular type of `State` as a parameter.
-2. Create an injectable constructor taking a `QSHost` and whichever classes are needed for the tile's operation. Normally this would be other SystemUI controllers.
-3. Implement the methods described in [Abstract methods in QSTileImpl](#abstract-methods-in-qstileimpl). Look at other tiles for help. Some considerations to have in mind:
- * If the tile will not support long click (like the `FlashlightTile`), set `state.handlesLongClick` to `false` (maybe in `newTileState`).
+1. Create a class (preferably
+ in [`SystemUI/src/com/android/systemui/qs/tiles`](/packages/SystemUI/src/com/android/systemui/qs/tiles))
+ implementing `QSTileImpl` with a particular type of `State` as a parameter.
+2. Create an injectable constructor taking a `QSHost` and whichever classes are needed for the
+ tile's operation. Normally this would be other SystemUI controllers.
+3. Implement the methods described
+ in [Abstract methods in QSTileImpl](#abstract-methods-in-qstileimpl). Look at other tiles for
+ help. Some considerations to have in mind:
+ * If the tile will not support long click (like the `FlashlightTile`),
+ set `state.handlesLongClick` to `false` (maybe in `newTileState`).
* Changes to the tile state (either from controllers or from clicks) should call `refreshState`.
- * Use only `handleUpdateState` to modify the values of the state to the new ones. This can be done by polling controllers or through the `arg` parameter.
- * If the controller is not a `CallbackController`, respond to `handleSetListening` by attaching/dettaching from controllers.
+ * Use only `handleUpdateState` to modify the values of the state to the new ones. This can be
+ done by polling controllers or through the `arg` parameter.
+ * If the controller is not a `CallbackController`, respond to `handleSetListening` by
+ attaching/dettaching from controllers.
* Implement `isAvailable` so the tile will not be created when it's not necessary.
-4. Either create a new feature module or find an existing related feature module and add the following binding method:
+4. Either create a new feature module or find an existing related feature module and add the
+ following binding method:
* ```kotlin
@Binds
@IntoMap
@StringKey(YourNewTile.TILE_SPEC) // A unique word that will map to YourNewTile
fun bindYourNewTile(yourNewTile: YourNewTile): QSTileImpl<*>
```
-5. In [SystemUI/res/values/config.xml](/packages/SystemUI/res/values/config.xml), modify `quick_settings_tiles_stock` and add the spec defined in the previous step. If necessary, add it also to `quick_settings_tiles_default`. The first one contains a list of all the tiles that SystemUI knows how to create (to show to the user in the customization screen). The second one contains only the default tiles that the user will experience on a fresh boot or after they reset their tiles.
-6. In [SystemUI/res/values/tiles_states_strings.xml](/packages/SystemUI/res/values/tiles_states_strings.xml), add a new array for your tile. The name has to be `tile_states_<spec>`. Use a good description to help the translators.
-7. In [`SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt), add a new element to the map in `SubtitleArrayMapping` corresponding to the resource created in the previous step.
+5. In [SystemUI/res/values/config.xml](/packages/SystemUI/res/values/config.xml),
+ modify `quick_settings_tiles_stock` and add the spec defined in the previous step. If necessary,
+ add it also to `quick_settings_tiles_default`. The first one contains a list of all the tiles
+ that SystemUI knows how to create (to show to the user in the customization screen). The second
+ one contains only the default tiles that the user will experience on a fresh boot or after they
+ reset their tiles.
+6. In [SystemUI/res/values/tiles_states_strings.xml](/packages/SystemUI/res/values/tiles_states_strings.xml),
+add a new array for your tile. The name has to be `tile_states_<spec>`. Use a good description to
+help the translators.
+7. In [`SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt),
+add a new element to the map in `SubtitleArrayMapping` corresponding to the resource created in the
+previous step.
#### Abstract methods in QSTileImpl
-Following are methods that need to be implemented when creating a new SystemUI tile. `TState` is a type variable of type `State`.
+Following are methods that need to be implemented when creating a new SystemUI tile. `TState` is a
+type variable of type `State`.
* ```java
public TState newTileState()
```
- Creates a new `State` for this tile to use. Each time the state changes, it is copied into a new one and the corresponding fields are modified. The framework provides `State`, `BooleanState` (has an on and off state and provides this as a content description), `SignalState` (`BooleanState` with `activityIn` and `activityOut`), and `SlashState` (can be rotated or slashed through).
+ Creates a new `State` for this tile to use. Each time the state changes, it is copied into a new
+ one and the corresponding fields are modified. The framework provides `State`, `BooleanState` (has
+ an on and off state and provides this as a content description), `SignalState` (`BooleanState`
+ with `activityIn` and `activityOut`), and `SlashState` (can be rotated or slashed through).
- If a tile has special behavior (no long click, no ripple), it can be set in its state here.
+ If a tile has special behavior (no long click, no ripple), it can be set in its state here.
* ```java
public void handleSetListening(boolean)
```
- Initiates or terminates listening behavior, like listening to Callbacks from controllers. This gets triggered when QS is expanded or collapsed (i.e., when the tile is visible and actionable). Most tiles (like `WifiTile`) do not implement this. Instead, Tiles are LifecycleOwner and are marked as `RESUMED` or `DESTROYED` in `QSTileImpl#handleListening` and handled as part of the lifecycle of [CallbackController](/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackController.java)
+ Initiates or terminates listening behavior, like listening to Callbacks from controllers. This
+ gets triggered when QS is expanded or collapsed (i.e., when the tile is visible and actionable).
+ Most tiles (like `WifiTile`) do not implement this. Instead, Tiles are LifecycleOwner and are
+ marked as `RESUMED` or `DESTROYED` in `QSTileImpl#handleListening` and handled as part of the
+ lifecycle
+ of [CallbackController](/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackController.java)
* ```java
public QSIconView createTileView(Context)
```
- Allows a Tile to use a `QSIconView` different from `QSIconViewImpl` (see [Tile views](#tile-views)), which is the default defined in `QSTileImpl`
+ Allows a Tile to use a `QSIconView` different from `QSIconViewImpl` (
+ see [Tile views](#tile-views)), which is the default defined in `QSTileImpl`
* ```java
public Intent getLongClickIntent()
@@ -350,36 +539,137 @@
protected void handleLongClick()
```
- Handles what to do when the Tile is clicked. In general, a Tile will make calls to its controller here and maybe update its state immediately (by calling `QSTileImpl#refreshState`). A Tile can also decide to ignore the click here, if it's `Tile#STATE_UNAVAILABLE`.
+ Handles what to do when the Tile is clicked. In general, a Tile will make calls to its controller
+ here and maybe update its state immediately (by calling `QSTileImpl#refreshState`). A Tile can
+ also decide to ignore the click here, if it's `Tile#STATE_UNAVAILABLE`.
- By default long click redirects to click and long click launches the intent defined in `getLongClickIntent`.
+ By default long click redirects to click and long click launches the intent defined
+ in `getLongClickIntent`.
* ```java
protected void handleUpdateState(TState, Object)
```
- Updates the `State` of the Tile based on the state of the device as provided by the respective controller. It will be called every time the Tile becomes visible, is interacted with or `QSTileImpl#refreshState` is called. After this is done, the updated state will be reflected in the UI.
+ Updates the `State` of the Tile based on the state of the device as provided by the respective
+ controller. It will be called every time the Tile becomes visible, is interacted with
+ or `QSTileImpl#refreshState` is called. After this is done, the updated state will be reflected in
+ the UI.
* ```java
@Deprecated
public int getMetricsCategory()
```
- ~~Identifier for this Tile, as defined in [proto/src/metrics_constants/metrics_constants.proto](/proto/src/metrics_constants/metrics_constants.proto). This is used to log events related to this Tile.~~
+ ~~Identifier for this Tile, as defined
+ in [proto/src/metrics_constants/metrics_constants.proto](/proto/src/metrics_constants/metrics_constants.proto).
+ This is used to log events related to this Tile.~~
This is now deprecated in favor of `UiEvent` that use the tile spec.
* ```java
public boolean isAvailable()
```
- Determines if a Tile is available to be used (for example, disable `WifiTile` in devices with no Wifi support). If this is false, the Tile will be destroyed upon creation.
+ Determines if a Tile is available to be used (for example, disable `WifiTile` in devices with no
+ Wifi support). If this is false, the Tile will be destroyed upon creation.
* ```java
public CharSequence getTileLabel()
```
- Provides a default label for this Tile. Used by the QS Panel customizer to show a name next to each available tile.
+ Provides a default label for this Tile. Used by the QS Panel customizer to show a name next to
+ each available tile.
### Implementing a third party tile
-For information about this, use the Android Developer documentation for [TileService](https://developer.android.com/reference/android/service/quicksettings/TileService).
\ No newline at end of file
+For information about this, use the Android Developer documentation
+for [TileService](https://developer.android.com/reference/android/service/quicksettings/TileService).
+
+## AutoAddable tiles
+
+AutoAddable tiles are tiles that are not part of the default set, but will be automatically added
+for the user, when the user enabled a feature for the first time. For example:
+* When the user creates a work profile, the work profile tile is automatically added.
+* When the user sets up a hotspot for the first time, the hotspot tile is automatically added.
+
+In order to declare a tile as auto-addable, there are two ways:
+
+* If the tile can be tied to a secure setting such that the tile should be auto added after that
+ setting has changed to a non-zero value for the first time, a new line can be added to the
+ string-array `config_quickSettingsAutoAdd` in [config.xml](/packages/SystemUI/res/values/config.xml).
+* If more specific behavior is needed, a new
+ [AutoAddable](/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/model/AutoAddable.kt)
+ can be added in the `autoaddables` package. This can have custom logic that produces a flow of
+ signals on when the tile should be auto-added (or auto-removed in special cases).
+
+ *Special case: If the data comes from a `CallbackController`, a special
+ `CallbackControllerAutoAddable` can be created instead that handles a lot of the common code.*
+
+### AutoAddRepository (and UserAutoAddRepository)
+
+These classes keep track of tiles that have been auto-added for each user, as a list of Tile specs.
+While the device is running, this is the source of truth of already auto-added tiles for that user.
+
+The list is persisted to `Settings.Secure` every time it changes so it will be available upon
+restart or backup. In particular, any changes in the secure setting while this repository is
+tracking the list of tiles will be reverted.
+
+The class provides a `Flow<Set<TileSpec>>` for each user that can be collected to keep track of the
+set of already auto added tiles.
+
+### AutoAddInteractor
+
+This class collects all registered (through Dagger) `AutoAddables` and merges all the signals for
+the current user. It will add/remove tiles as necessary and mark them as such in the
+`AutoAddRepository`.
+
+## Backup and restore
+
+It's important to point out that B&R of Quick Settings tiles only concerns itself with restoring,
+for each user, the list of current tiles and their order. The state of the tiles (or other things
+that can be accessed from them like list of WiFi networks) is the concern of each feature team and
+out of the scope of Quick Settings.
+
+In order to provide better support to restoring Quick Settings tiles and prevent overwritten or
+inconsistent data, the system has the following steps:
+
+1. When `Settings.Secure.SYSUI_QS_TILES` and `Settings.Secure.QS_AUTO_TILES` are restored, a
+ broadcast is sent to SystemUI. This is handled by
+ [SettingsHelper](/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java).
+ The broadcasts are received by [QSSettingsRestoredRepository](/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/QSSettingsRestoredRepository.kt)
+ and grouped by user into a data object. As described above, the change performed by the restore in
+ settings is overriden by the corresponding repositories.
+2. Once both settings have been restored, the data is reconciled with the current data, to account
+ for tiles that may have been auto-added between the start of SystemUI and the time the restore
+ happened. The guiding principles for the reconciliation are as follows:
+ * We assume that the user expects the restored tiles to be the ones to be present after restore,
+ so those are taken as the basis for the reconciliation.
+ * Any tile that was auto-added before the restore, but had not been auto-added in the source
+ device, is auto-added again (preferably in a similar position).
+ * Any tile that was auto-added before the restore, and it was also auto-added in the source
+ device, but not present in the restored tiles, is considered removed by the user and therefore
+ not restored.
+ * Every tile that was marked as auto-added (all tiles in source + tiles added before restore)
+ are set as auto-added.
+
+## Logs for debugging
+
+The following log buffers are used for Quick Settings debugging purposes:
+
+### QSLog
+
+Logs events in the individual tiles, like listening state, clicks, and status updates.
+
+### QSTileListLog
+
+Logs changes in the current set of tiles for each user, including when tiles are created or
+destroyed, and the reason for that. It also logs what operation caused the tiles to change
+(add, remove, change, restore).
+
+### QSAutoAddLog
+
+Logs operations of auto-add (or auto-remove) of tiles.
+
+### QSRestoreLog
+
+Logs the data obtained after a successful restore of the settings. This is the data that will be
+used for reconciliation.
\ No newline at end of file
diff --git a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
index 80d45bc..78b854e 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt
@@ -22,8 +22,11 @@
import androidx.constraintlayout.widget.ConstraintSet
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.internal.logging.UiEventLogger
import com.android.internal.util.LatencyTracker
import com.android.internal.widget.LockPatternUtils
+import com.android.internal.widget.LockscreenCredential
+import com.android.keyguard.KeyguardPinViewController.PinBouncerUiEvent
import com.android.keyguard.KeyguardSecurityModel.SecurityMode
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
@@ -91,6 +94,7 @@
@Mock lateinit var passwordTextView: PasswordTextView
@Mock lateinit var deleteButton: NumPadButton
@Mock lateinit var enterButton: View
+ @Mock lateinit var uiEventLogger: UiEventLogger
@Captor lateinit var postureCallbackCaptor: ArgumentCaptor<DevicePostureController.Callback>
@@ -137,6 +141,7 @@
postureController,
featureFlags,
mSelectedUserInteractor,
+ uiEventLogger
)
}
@@ -251,4 +256,21 @@
verify(lockPatternUtils).getCurrentFailedPasswordAttempts(anyInt())
}
+
+ @Test
+ fun onUserInput_autoConfirmation_attemptsUnlock() {
+ val pinViewController = constructPinViewController(mockKeyguardPinView)
+ whenever(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true)
+ whenever(lockPatternUtils.getPinLength(anyInt())).thenReturn(6)
+ whenever(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true)
+ whenever(passwordTextView.text).thenReturn("000000")
+ whenever(enterButton.visibility).thenReturn(View.INVISIBLE)
+ whenever(mockKeyguardPinView.enteredCredential)
+ .thenReturn(LockscreenCredential.createPin("000000"))
+
+ pinViewController.onUserInput()
+
+ verify(uiEventLogger).log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE)
+ verify(keyguardUpdateMonitor).setCredentialAttempted()
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
index 602f3dc..da97a12 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/AuthControllerTest.java
@@ -1041,8 +1041,9 @@
mExecution, mCommandQueue, mActivityTaskManager, mWindowManager,
mFingerprintManager, mFaceManager, () -> mUdfpsController,
() -> mSideFpsController, mDisplayManager, mWakefulnessLifecycle,
- mPanelInteractionDetector, mUserManager, mLockPatternUtils, mUdfpsLogger,
- mLogContextInteractor, () -> mBiometricPromptCredentialInteractor,
+ mPanelInteractionDetector, mUserManager, mLockPatternUtils, () -> mUdfpsLogger,
+ () -> mLogContextInteractor,
+ () -> mBiometricPromptCredentialInteractor,
() -> mPromptSelectionInteractor, () -> mCredentialViewModel,
() -> mPromptViewModel, mInteractionJankMonitor, mHandler, mBackgroundExecutor,
mUdfpsUtils, mVibratorHelper);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index f5b6f14..90d36e7 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -23,7 +23,6 @@
import android.hardware.biometrics.BiometricOverlayConstants.REASON_AUTH_SETTINGS
import android.hardware.biometrics.BiometricOverlayConstants.REASON_ENROLL_ENROLLING
import android.hardware.biometrics.BiometricOverlayConstants.ShowReason
-import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.IUdfpsOverlayControllerCallback
import android.testing.TestableLooper.RunWithLooper
import android.view.LayoutInflater
@@ -40,6 +39,8 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dump.DumpManager
@@ -67,8 +68,8 @@
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
-import org.mockito.junit.MockitoJUnit
import org.mockito.Mockito.`when` as whenever
+import org.mockito.junit.MockitoJUnit
private const val REQUEST_ID = 2L
@@ -86,7 +87,6 @@
@JvmField @Rule var rule = MockitoJUnit.rule()
- @Mock private lateinit var fingerprintManager: FingerprintManager
@Mock private lateinit var inflater: LayoutInflater
@Mock private lateinit var windowManager: WindowManager
@Mock private lateinit var accessibilityManager: AccessibilityManager
@@ -98,8 +98,8 @@
@Mock private lateinit var transitionController: LockscreenShadeTransitionController
@Mock private lateinit var configurationController: ConfigurationController
@Mock private lateinit var keyguardStateController: KeyguardStateController
- @Mock private lateinit var unlockedScreenOffAnimationController:
- UnlockedScreenOffAnimationController
+ @Mock
+ private lateinit var unlockedScreenOffAnimationController: UnlockedScreenOffAnimationController
@Mock private lateinit var udfpsDisplayMode: UdfpsDisplayModeProvider
@Mock private lateinit var secureSettings: SecureSettings
@Mock private lateinit var controllerCallback: IUdfpsOverlayControllerCallback
@@ -110,8 +110,12 @@
@Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
@Mock private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor
@Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor
- @Mock private lateinit var udfpsKeyguardAccessibilityDelegate:
- UdfpsKeyguardAccessibilityDelegate
+ @Mock
+ private lateinit var deviceEntryUdfpsTouchOverlayViewModel:
+ DeviceEntryUdfpsTouchOverlayViewModel
+ @Mock private lateinit var defaultUdfpsTouchOverlayViewModel: DefaultUdfpsTouchOverlayViewModel
+ @Mock
+ private lateinit var udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate
@Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
@Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>
@@ -121,28 +125,28 @@
@Before
fun setup() {
- whenever(inflater.inflate(R.layout.udfps_view, null, false))
- .thenReturn(udfpsView)
+ whenever(inflater.inflate(R.layout.udfps_view, null, false)).thenReturn(udfpsView)
whenever(inflater.inflate(R.layout.udfps_bp_view, null))
- .thenReturn(mock(UdfpsBpView::class.java))
+ .thenReturn(mock(UdfpsBpView::class.java))
whenever(inflater.inflate(R.layout.udfps_keyguard_view_legacy, null))
- .thenReturn(mUdfpsKeyguardViewLegacy)
+ .thenReturn(mUdfpsKeyguardViewLegacy)
whenever(inflater.inflate(R.layout.udfps_fpm_empty_view, null))
- .thenReturn(mock(UdfpsFpmEmptyView::class.java))
+ .thenReturn(mock(UdfpsFpmEmptyView::class.java))
}
private fun withReason(
- @ShowReason reason: Int,
- isDebuggable: Boolean = false,
- enableDeviceEntryUdfpsRefactor: Boolean = false,
- block: () -> Unit,
+ @ShowReason reason: Int,
+ isDebuggable: Boolean = false,
+ enableDeviceEntryUdfpsRefactor: Boolean = false,
+ block: () -> Unit,
) {
if (enableDeviceEntryUdfpsRefactor) {
mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
} else {
mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
}
- controllerOverlay = UdfpsControllerOverlay(
+ controllerOverlay =
+ UdfpsControllerOverlay(
context,
inflater,
windowManager,
@@ -168,108 +172,106 @@
udfpsKeyguardAccessibilityDelegate,
keyguardTransitionInteractor,
mSelectedUserInteractor,
- )
+ { deviceEntryUdfpsTouchOverlayViewModel },
+ { defaultUdfpsTouchOverlayViewModel },
+ )
block()
}
- @Test
- fun showUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { showUdfpsOverlay() }
+ @Test fun showUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { showUdfpsOverlay() }
@Test
- fun showUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) {
- showUdfpsOverlay()
- verify(mUdfpsKeyguardViewLegacy).updateSensorLocation(eq(overlayParams.sensorBounds))
- }
+ fun showUdfpsOverlay_keyguard() =
+ withReason(REASON_AUTH_KEYGUARD) {
+ showUdfpsOverlay()
+ verify(mUdfpsKeyguardViewLegacy).updateSensorLocation(eq(overlayParams.sensorBounds))
+ }
- @Test
- fun showUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { showUdfpsOverlay() }
+ @Test fun showUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { showUdfpsOverlay() }
private fun withRotation(@Rotation rotation: Int, block: () -> Unit) {
// Sensor that's in the top left corner of the display in natural orientation.
val sensorBounds = Rect(0, 0, SENSOR_WIDTH, SENSOR_HEIGHT)
val overlayBounds = Rect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT)
- overlayParams = UdfpsOverlayParams(
+ overlayParams =
+ UdfpsOverlayParams(
sensorBounds,
overlayBounds,
DISPLAY_WIDTH,
DISPLAY_HEIGHT,
scaleFactor = 1f,
rotation
- )
+ )
block()
}
@Test
- fun showUdfpsOverlay_withRotation0() = withRotation(Surface.ROTATION_0) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
+ fun showUdfpsOverlay_withRotation0() =
+ withRotation(Surface.ROTATION_0) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
- // ROTATION_0 is the native orientation. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ // ROTATION_0 is the native orientation. Sensor should stay in the top left corner.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
+ assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation180() = withRotation(Surface.ROTATION_180) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
+ fun showUdfpsOverlay_withRotation180() =
+ withRotation(Surface.ROTATION_180) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
- // ROTATION_180 is not supported. Sensor should stay in the top left corner.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
- assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ // ROTATION_180 is not supported. Sensor should stay in the top left corner.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_WIDTH)
+ assertThat(lp.height).isEqualTo(DISPLAY_HEIGHT)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation90() = withRotation(Surface.ROTATION_90) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
+ fun showUdfpsOverlay_withRotation90() =
+ withRotation(Surface.ROTATION_90) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
- // Sensor should be in the bottom left corner in ROTATION_90.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ // Sensor should be in the bottom left corner in ROTATION_90.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
+ assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ }
}
- }
@Test
- fun showUdfpsOverlay_withRotation270() = withRotation(Surface.ROTATION_270) {
- withReason(REASON_AUTH_BP) {
- controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
+ fun showUdfpsOverlay_withRotation270() =
+ withRotation(Surface.ROTATION_270) {
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
- // Sensor should be in the top right corner in ROTATION_270.
- val lp = layoutParamsCaptor.value
- assertThat(lp.x).isEqualTo(0)
- assertThat(lp.y).isEqualTo(0)
- assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
- assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ // Sensor should be in the top right corner in ROTATION_270.
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.x).isEqualTo(0)
+ assertThat(lp.y).isEqualTo(0)
+ assertThat(lp.width).isEqualTo(DISPLAY_HEIGHT)
+ assertThat(lp.height).isEqualTo(DISPLAY_WIDTH)
+ }
}
- }
private fun showUdfpsOverlay() {
val didShow = controllerOverlay.show(udfpsController, overlayParams)
@@ -285,17 +287,13 @@
assertThat(controllerOverlay.getTouchOverlay()).isNotNull()
}
- @Test
- fun hideUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_bp() = withReason(REASON_AUTH_BP) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_keyguard() = withReason(REASON_AUTH_KEYGUARD) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_settings() = withReason(REASON_AUTH_SETTINGS) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_settings() = withReason(REASON_AUTH_SETTINGS) { hideUdfpsOverlay() }
- @Test
- fun hideUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { hideUdfpsOverlay() }
+ @Test fun hideUdfpsOverlay_other() = withReason(REASON_AUTH_OTHER) { hideUdfpsOverlay() }
private fun hideUdfpsOverlay() {
val didShow = controllerOverlay.show(udfpsController, overlayParams)
@@ -313,53 +311,54 @@
}
@Test
- fun canNotHide() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.hide()).isFalse()
- }
+ fun canNotHide() = withReason(REASON_AUTH_BP) { assertThat(controllerOverlay.hide()).isFalse() }
@Test
- fun canNotReshow() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isTrue()
- assertThat(controllerOverlay.show(udfpsController, overlayParams)).isFalse()
- }
+ fun canNotReshow() =
+ withReason(REASON_AUTH_BP) {
+ assertThat(controllerOverlay.show(udfpsController, overlayParams)).isTrue()
+ assertThat(controllerOverlay.show(udfpsController, overlayParams)).isFalse()
+ }
@Test
- fun cancels() = withReason(REASON_AUTH_BP) {
- controllerOverlay.cancel()
- verify(controllerCallback).onUserCanceled()
- }
+ fun cancels() =
+ withReason(REASON_AUTH_BP) {
+ controllerOverlay.cancel()
+ verify(controllerCallback).onUserCanceled()
+ }
@Test
- fun unconfigureDisplayOnHide() = withReason(REASON_AUTH_BP) {
- whenever(udfpsView.isDisplayConfigured).thenReturn(true)
-
- controllerOverlay.show(udfpsController, overlayParams)
- controllerOverlay.hide()
- verify(udfpsView).unconfigureDisplay()
- }
-
- @Test
- fun matchesRequestIds() = withReason(REASON_AUTH_BP) {
- assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
- assertThat(controllerOverlay.matchesRequestId(REQUEST_ID + 1)).isFalse()
- }
-
- @Test
- fun smallOverlayOnEnrollmentWithA11y() = withRotation(Surface.ROTATION_0) {
- withReason(REASON_ENROLL_ENROLLING) {
- // When a11y enabled during enrollment
- whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
+ fun unconfigureDisplayOnHide() =
+ withReason(REASON_AUTH_BP) {
+ whenever(udfpsView.isDisplayConfigured).thenReturn(true)
controllerOverlay.show(udfpsController, overlayParams)
- verify(windowManager).addView(
- eq(controllerOverlay.getTouchOverlay()),
- layoutParamsCaptor.capture()
- )
-
- // Layout params should use sensor bounds
- val lp = layoutParamsCaptor.value
- assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
- assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
+ controllerOverlay.hide()
+ verify(udfpsView).unconfigureDisplay()
}
- }
+
+ @Test
+ fun matchesRequestIds() =
+ withReason(REASON_AUTH_BP) {
+ assertThat(controllerOverlay.matchesRequestId(REQUEST_ID)).isTrue()
+ assertThat(controllerOverlay.matchesRequestId(REQUEST_ID + 1)).isFalse()
+ }
+
+ @Test
+ fun smallOverlayOnEnrollmentWithA11y() =
+ withRotation(Surface.ROTATION_0) {
+ withReason(REASON_ENROLL_ENROLLING) {
+ // When a11y enabled during enrollment
+ whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(true)
+
+ controllerOverlay.show(udfpsController, overlayParams)
+ verify(windowManager)
+ .addView(eq(controllerOverlay.getTouchOverlay()), layoutParamsCaptor.capture())
+
+ // Layout params should use sensor bounds
+ val lp = layoutParamsCaptor.value
+ assertThat(lp.width).isEqualTo(overlayParams.sensorBounds.width())
+ assertThat(lp.height).isEqualTo(overlayParams.sensorBounds.height())
+ }
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index e2cab29..97ee526 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -81,6 +81,8 @@
import com.android.systemui.biometrics.udfps.NormalizedTouchData;
import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessorResult;
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel;
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.dump.DumpManager;
@@ -106,6 +108,8 @@
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.SystemClock;
+import dagger.Lazy;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -241,6 +245,10 @@
private FpsUnlockTracker mFpsUnlockTracker;
@Mock
private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
+ @Mock
+ private Lazy<DeviceEntryUdfpsTouchOverlayViewModel> mDeviceEntryUdfpsTouchOverlayViewModel;
+ @Mock
+ private Lazy<DefaultUdfpsTouchOverlayViewModel> mDefaultUdfpsTouchOverlayViewModel;
@Before
public void setUp() {
@@ -334,7 +342,10 @@
mUdfpsKeyguardViewModels,
mSelectedUserInteractor,
mFpsUnlockTracker,
- mKeyguardTransitionInteractor
+ mKeyguardTransitionInteractor,
+ mDeviceEntryUdfpsTouchOverlayViewModel,
+ mDefaultUdfpsTouchOverlayViewModel
+
);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
index 2ea803c..ac16c13 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerBaseTest.java
@@ -24,6 +24,7 @@
import android.content.Context;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
@@ -94,6 +95,7 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mSetFlagsRule.disableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR);
when(mView.getContext()).thenReturn(mResourceContext);
when(mResourceContext.getString(anyInt())).thenReturn("test string");
when(mKeyguardViewMediator.isAnimatingScreenOff()).thenReturn(false);
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
index 79f0625..cbb772f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacyControllerWithCoroutinesTest.kt
@@ -396,7 +396,7 @@
.onDozeAmountChanged(
eq(.3f),
eq(.3f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF)
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
)
transitionRepository.sendTransitionStep(
@@ -413,9 +413,130 @@
.onDozeAmountChanged(
eq(1f),
eq(1f),
- eq(UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF)
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
)
job.cancel()
}
+
+ @Test
+ fun aodToOccluded_dozeAmountChanged() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForAodToOccludedTransitions(this)
+
+ // WHEN transitioning from aod to occluded
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.OCCLUDED,
+ value = .3f,
+ transitionState = TransitionState.RUNNING
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(eq(.7f), eq(.7f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.OCCLUDED,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(eq(0f), eq(0f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+
+ job.cancel()
+ }
+
+ @Test
+ fun occludedToAod_dozeAmountChanged() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForOccludedToAodTransition(this)
+
+ // WHEN transitioning from occluded to aod
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.OCCLUDED,
+ to = KeyguardState.AOD,
+ value = .3f,
+ transitionState = TransitionState.RUNNING
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(
+ eq(.3f),
+ eq(.3f),
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
+ )
+
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.OCCLUDED,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ )
+ )
+ runCurrent()
+ // THEN doze amount is updated
+ verify(mView)
+ .onDozeAmountChanged(
+ eq(1f),
+ eq(1f),
+ eq(UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF)
+ )
+
+ job.cancel()
+ }
+
+ @Test
+ fun cancelledAodToLockscreen_dozeAmountChangedToZero() =
+ testScope.runTest {
+ // GIVEN view is attached
+ mController.onViewAttached()
+ Mockito.reset(mView)
+
+ val job = mController.listenForLockscreenAodTransitions(this)
+ // WHEN aod to lockscreen transition is cancelled
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 1f,
+ transitionState = TransitionState.CANCELED
+ )
+ )
+ runCurrent()
+ // ... and WHEN the next transition is from lockscreen => occluded
+ transitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.LOCKSCREEN,
+ to = KeyguardState.OCCLUDED,
+ value = .4f,
+ transitionState = TransitionState.STARTED
+ )
+ )
+ runCurrent()
+
+ // THEN doze amount is updated to zero
+ verify(mView)
+ .onDozeAmountChanged(eq(0f), eq(0f), eq(UdfpsKeyguardViewLegacy.ANIMATION_NONE))
+ job.cancel()
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
index f0d26b6..0870122 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractorTest.kt
@@ -37,6 +37,7 @@
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Before
+import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
@@ -166,6 +167,7 @@
}
@Test
+ @Ignore("b/287599719")
fun canShowAlternateBouncerForFingerprint_rearFps() {
mSetFlagsRule.enableFlags(Flags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR)
initializeUnderTest()
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
index 706f94e..11939c1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt
@@ -23,6 +23,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel
@@ -53,7 +54,6 @@
private val sceneInteractor = testUtils.sceneInteractor()
private val commandQueue = FakeCommandQueue()
private val bouncerRepository = FakeKeyguardBouncerRepository()
- private val configurationRepository = FakeConfigurationRepository()
private val shadeRepository = FakeShadeRepository()
private val transitionState: MutableStateFlow<ObservableTransitionState> =
MutableStateFlow(ObservableTransitionState.Idle(SceneKey.Gone))
@@ -65,7 +65,7 @@
powerInteractor = PowerInteractorFactory.create().powerInteractor,
sceneContainerFlags = testUtils.sceneContainerFlags,
bouncerRepository = bouncerRepository,
- configurationRepository = configurationRepository,
+ configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()),
shadeRepository = shadeRepository,
sceneInteractorProvider = { sceneInteractor },
)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
index fd125e0..53bca48 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelTest.kt
@@ -19,14 +19,11 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.coroutines.collectValues
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
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.DREAMING
@@ -38,16 +35,12 @@
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.android.systemui.util.mockito.mock
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -55,223 +48,201 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class DreamingToLockscreenTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: DreamingToLockscreenTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest =
- DreamingToLockscreenTransitionViewModel(
- interactor,
- mock(),
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = FakeBiometricSettingsRepository(),
- ),
- )
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ private val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ private val underTest = kosmos.dreamingToLockscreenTransitionViewModel
@Test
fun dreamOverlayTranslationY() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
-
+ testScope.runTest {
val pixels = 100
- val job =
- underTest.dreamOverlayTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
+ val values by collectValues(underTest.dreamOverlayTranslationY(pixels))
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.3f),
+ step(0.5f),
+ step(0.6f),
+ step(0.8f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(7)
values.forEach { assertThat(it).isIn(Range.closed(0f, 100f)) }
-
- job.cancel()
}
@Test
fun dreamOverlayFadeOut() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ val values by collectValues(underTest.dreamOverlayAlpha)
- val job = underTest.dreamOverlayAlpha.onEach { values.add(it) }.launchIn(this)
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ // Should start running here...
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.5f),
+ // ...up to here
+ step(1f),
+ ),
+ testScope,
+ )
- // Should start running here...
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.5f))
- // ...up to here
- repository.sendTransitionStep(step(1f))
-
- // Only two values should be present, since the dream overlay runs for a small fraction
- // of the overall animation time
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun lockscreenFadeIn() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ val values by collectValues(underTest.lockscreenAlpha)
- val job = underTest.lockscreenAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.2f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.2f),
+ step(0.3f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun deviceEntryParentViewFadeIn() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ val values by collectValues(underTest.deviceEntryParentViewAlpha)
- val job = underTest.deviceEntryParentViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.2f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.2f),
+ step(0.3f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun deviceEntryBackgroundViewAppear() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
fingerprintPropertyRepository.setProperties(
sensorId = 0,
strength = SensorStrength.STRONG,
sensorType = FingerprintSensorType.UDFPS_OPTICAL,
sensorLocations = emptyMap(),
)
- val values = mutableListOf<Float>()
+ val values by collectValues(underTest.deviceEntryBackgroundViewAlpha)
- val job =
- underTest.deviceEntryBackgroundViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.2f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.2f),
+ step(0.3f),
+ step(1f),
+ ),
+ testScope,
+ )
values.forEach { assertThat(it).isEqualTo(1f) }
-
- job.cancel()
}
@Test
fun deviceEntryBackground_noUdfps_noUpdates() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
fingerprintPropertyRepository.setProperties(
sensorId = 0,
strength = SensorStrength.STRONG,
sensorType = FingerprintSensorType.REAR,
sensorLocations = emptyMap(),
)
- val values = mutableListOf<Float>()
+ val values by collectValues(underTest.deviceEntryBackgroundViewAlpha)
- val job =
- underTest.deviceEntryBackgroundViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.2f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.2f),
+ step(0.3f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(0) // no updates
-
- job.cancel()
}
@Test
fun lockscreenTranslationY() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
-
+ testScope.runTest {
val pixels = 100
- val job =
- underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
+ val values by collectValues(underTest.lockscreenTranslationY(pixels))
- repository.sendTransitionStep(step(0f, STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.3f),
+ step(0.5f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(-100f, 0f)) }
-
- job.cancel()
}
@Test
fun transitionEnded() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<TransitionStep>()
+ testScope.runTest {
+ val values by collectValues(underTest.transitionEnded)
- val job = underTest.transitionEnded.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(TransitionStep(DOZING, DREAMING, 0.0f, STARTED))
- repository.sendTransitionStep(TransitionStep(DOZING, DREAMING, 1.0f, FINISHED))
-
- repository.sendTransitionStep(TransitionStep(DREAMING, LOCKSCREEN, 0.0f, STARTED))
- repository.sendTransitionStep(TransitionStep(DREAMING, LOCKSCREEN, 0.1f, RUNNING))
- repository.sendTransitionStep(TransitionStep(DREAMING, LOCKSCREEN, 1.0f, FINISHED))
-
- repository.sendTransitionStep(TransitionStep(LOCKSCREEN, DREAMING, 0.0f, STARTED))
- repository.sendTransitionStep(TransitionStep(LOCKSCREEN, DREAMING, 0.5f, RUNNING))
- repository.sendTransitionStep(TransitionStep(LOCKSCREEN, DREAMING, 1.0f, FINISHED))
-
- repository.sendTransitionStep(TransitionStep(DREAMING, GONE, 0.0f, STARTED))
- repository.sendTransitionStep(TransitionStep(DREAMING, GONE, 0.5f, RUNNING))
- repository.sendTransitionStep(TransitionStep(DREAMING, GONE, 1.0f, CANCELED))
-
- repository.sendTransitionStep(TransitionStep(DREAMING, AOD, 0.0f, STARTED))
- repository.sendTransitionStep(TransitionStep(DREAMING, AOD, 1.0f, FINISHED))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ TransitionStep(DOZING, DREAMING, 0.0f, STARTED),
+ TransitionStep(DOZING, DREAMING, 1.0f, FINISHED),
+ TransitionStep(DREAMING, LOCKSCREEN, 0.0f, STARTED),
+ TransitionStep(DREAMING, LOCKSCREEN, 0.1f, RUNNING),
+ TransitionStep(DREAMING, LOCKSCREEN, 1.0f, FINISHED),
+ TransitionStep(LOCKSCREEN, DREAMING, 0.0f, STARTED),
+ TransitionStep(LOCKSCREEN, DREAMING, 0.5f, RUNNING),
+ TransitionStep(LOCKSCREEN, DREAMING, 1.0f, FINISHED),
+ TransitionStep(DREAMING, GONE, 0.0f, STARTED),
+ TransitionStep(DREAMING, GONE, 0.5f, RUNNING),
+ TransitionStep(DREAMING, GONE, 1.0f, CANCELED),
+ TransitionStep(DREAMING, AOD, 0.0f, STARTED),
+ TransitionStep(DREAMING, AOD, 1.0f, FINISHED),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(3)
values.forEach {
assertThat(it.transitionState == FINISHED || it.transitionState == CANCELED)
.isTrue()
}
-
- job.cancel()
}
private fun step(value: Float, state: TransitionState = RUNNING): TransitionStep {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
index cf20129..3c07034 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelTest.kt
@@ -19,85 +19,73 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+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.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
class GoneToDreamingTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: GoneToDreamingTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest = GoneToDreamingTransitionViewModel(interactor)
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val underTest = kosmos.goneToDreamingTransitionViewModel
@Test
- fun lockscreenFadeOut() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ fun runTest() =
+ testScope.runTest {
+ val values by collectValues(underTest.lockscreenAlpha)
- val job = underTest.lockscreenAlpha.onEach { values.add(it) }.launchIn(this)
-
- // Should start running here...
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.2f))
- repository.sendTransitionStep(step(0.3f))
- // ...up to here
- repository.sendTransitionStep(step(1f))
+ repository.sendTransitionSteps(
+ listOf(
+ // Should start running here...
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.1f),
+ step(0.2f),
+ step(0.3f),
+ // ...up to here
+ step(1f),
+ ),
+ testScope,
+ )
// Only three values should be present, since the dream overlay runs for a small
// fraction of the overall animation time
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun lockscreenTranslationY() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
-
+ testScope.runTest {
val pixels = 100
- val job =
- underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
+ val values by collectValues(underTest.lockscreenTranslationY(pixels))
- // Should start running here...
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- // And a final reset event on CANCEL
- repository.sendTransitionStep(step(0.8f, TransitionState.CANCELED))
+ repository.sendTransitionSteps(
+ listOf(
+ // Should start running here...
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.3f),
+ step(0.5f),
+ // And a final reset event on CANCEL
+ step(0.8f, TransitionState.CANCELED)
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(0f, 100f)) }
-
- job.cancel()
}
private fun step(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
index ba72b4c..9226c0d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelTest.kt
@@ -27,7 +27,6 @@
import com.android.systemui.flags.featureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
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.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionState
@@ -55,11 +54,7 @@
private val repository = kosmos.fakeKeyguardTransitionRepository
private val shadeRepository = kosmos.shadeRepository
private val keyguardRepository = kosmos.fakeKeyguardRepository
- private val underTest =
- LockscreenToDreamingTransitionViewModel(
- interactor = kosmos.keyguardTransitionInteractor,
- shadeDependentFlows = kosmos.shadeDependentFlows,
- )
+ private val underTest = kosmos.lockscreenToDreamingTransitionViewModel
@Test
fun lockscreenFadeOut() =
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
index 3536d5c..bcad72b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
@@ -21,18 +21,19 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
+import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.flags.Flags
import com.android.systemui.flags.featureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
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.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.testKosmos
import com.google.common.collect.Range
@@ -46,7 +47,6 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class LockscreenToOccludedTransitionViewModelTest : SysuiTestCase() {
-
private val kosmos =
testKosmos().apply {
featureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
@@ -55,11 +55,8 @@
private val repository = kosmos.fakeKeyguardTransitionRepository
private val shadeRepository = kosmos.shadeRepository
private val keyguardRepository = kosmos.fakeKeyguardRepository
- private val underTest =
- LockscreenToOccludedTransitionViewModel(
- interactor = kosmos.keyguardTransitionInteractor,
- shadeDependentFlows = kosmos.shadeDependentFlows,
- )
+ private val configurationRepository = kosmos.fakeConfigurationRepository
+ private val underTest = kosmos.lockscreenToOccludedTransitionViewModel
@Test
fun lockscreenFadeOut() =
@@ -86,8 +83,11 @@
@Test
fun lockscreenTranslationY() =
testScope.runTest {
- val pixels = 100
- val values by collectValues(underTest.lockscreenTranslationY(pixels))
+ configurationRepository.setDimensionPixelSize(
+ R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y,
+ 100
+ )
+ val values by collectValues(underTest.lockscreenTranslationY)
repository.sendTransitionSteps(
steps =
listOf(
@@ -106,8 +106,11 @@
@Test
fun lockscreenTranslationYIsCanceled() =
testScope.runTest {
- val pixels = 100
- val values by collectValues(underTest.lockscreenTranslationY(pixels))
+ configurationRepository.setDimensionPixelSize(
+ R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y,
+ 100
+ )
+ val values by collectValues(underTest.lockscreenTranslationY)
repository.sendTransitionSteps(
steps =
listOf(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
index d077227..d419d4a 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelTest.kt
@@ -19,24 +19,21 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
+import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
+import com.android.systemui.coroutines.collectValues
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.res.R
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -44,163 +41,139 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class OccludedToLockscreenTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: OccludedToLockscreenTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- biometricSettingsRepository = FakeBiometricSettingsRepository()
- underTest =
- OccludedToLockscreenTransitionViewModel(
- interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor,
- deviceEntryUdfpsInteractor =
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = biometricSettingsRepository,
- ),
- )
- }
+ val biometricSettingsRepository = kosmos.biometricSettingsRepository
+ val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ val configurationRepository = kosmos.fakeConfigurationRepository
+ val underTest = kosmos.occludedToLockscreenTransitionViewModel
@Test
fun lockscreenFadeIn() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ val values by collectValues(underTest.lockscreenAlpha)
- val job = underTest.lockscreenAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- // Should start running here...
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- // ...up to here
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.1f),
+ // Should start running here...
+ step(0.3f),
+ step(0.4f),
+ step(0.5f),
+ step(0.6f),
+ // ...up to here
+ step(0.8f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun lockscreenTranslationY() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ configurationRepository.setDimensionPixelSize(
+ R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y,
+ 100
+ )
+ val values by collectValues(underTest.lockscreenTranslationY)
- val pixels = 100
- val job =
- underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0f),
+ step(0.3f),
+ step(0.5f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(-100f, 0f)) }
-
- job.cancel()
}
@Test
fun lockscreenTranslationYResettedAfterJobCancelled() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ configurationRepository.setDimensionPixelSize(
+ R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y,
+ 100
+ )
+ val values by collectValues(underTest.lockscreenTranslationY)
- val pixels = 100
- val job =
- underTest.lockscreenTranslationY(pixels).onEach { values.add(it) }.launchIn(this)
- repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))
assertThat(values.last()).isEqualTo(0f)
-
- job.cancel()
}
@Test
fun deviceEntryParentViewFadeIn() =
- runTest(UnconfinedTestDispatcher()) {
- val values = mutableListOf<Float>()
+ testScope.runTest {
+ val values by collectValues(underTest.deviceEntryParentViewAlpha)
- val job = underTest.deviceEntryParentViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- // Should start running here...
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- // ...up to here
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.1f),
+ // Should start running here...
+ step(0.3f),
+ step(0.4f),
+ step(0.5f),
+ step(0.6f),
+ // ...up to here
+ step(0.8f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(5)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
-
- job.cancel()
}
@Test
fun deviceEntryBackgroundViewShows() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
fingerprintPropertyRepository.supportsUdfps()
biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val values = mutableListOf<Float>()
+ val values by collectValues(underTest.deviceEntryBackgroundViewAlpha)
- val job =
- underTest.deviceEntryBackgroundViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(0.1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.3f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.4f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.6f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.8f))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
values.forEach { assertThat(it).isEqualTo(1f) }
-
- job.cancel()
}
@Test
fun deviceEntryBackgroundView_noUdfpsEnrolled_noUpdates() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
fingerprintPropertyRepository.supportsRearFps()
biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val values = mutableListOf<Float>()
+ val values by collectValues(underTest.deviceEntryBackgroundViewAlpha)
- val job =
- underTest.deviceEntryBackgroundViewAlpha.onEach { values.add(it) }.launchIn(this)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(0.1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.3f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.4f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.6f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.8f))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
assertThat(values).isEmpty() // no updates
-
- job.cancel()
}
private fun step(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
index 6cab023..78d87a6 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelTest.kt
@@ -19,80 +19,61 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
import com.android.systemui.coroutines.collectValues
-import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
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.statusbar.SysuiStatusBarStateController
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.whenever
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
-import dagger.Lazy
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
class PrimaryBouncerToGoneTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: PrimaryBouncerToGoneTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var featureFlags: FakeFeatureFlags
- @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
- @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
- @Mock private lateinit var bouncerToGoneFlows: BouncerToGoneFlows
- @Mock
- private lateinit var keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>
+ val kosmos =
+ testKosmos().apply {
+ featureFlagsClassic.apply {
+ set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
+ set(Flags.FULL_SCREEN_USER_SWITCHER, false)
+ }
+ }
+ val testScope = kosmos.testScope
- private val shadeExpansionStateFlow = MutableStateFlow(0.1f)
+ val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ val primaryBouncerInteractor = kosmos.primaryBouncerInteractor
+ val sysuiStatusBarStateController = kosmos.sysuiStatusBarStateController
+ val underTest = kosmos.primaryBouncerToGoneTransitionViewModel
@Before
fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- repository = FakeKeyguardTransitionRepository()
- val featureFlags =
- FakeFeatureFlags().apply { set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false) }
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest =
- PrimaryBouncerToGoneTransitionViewModel(
- interactor,
- statusBarStateController,
- primaryBouncerInteractor,
- keyguardDismissActionInteractor,
- featureFlags,
- bouncerToGoneFlows,
- )
-
whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(false)
- whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(false)
+ sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false)
}
@Test
fun bouncerAlpha() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.bouncerAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(3)
values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
@@ -100,14 +81,19 @@
@Test
fun bouncerAlpha_runDimissFromKeyguard() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.bouncerAlpha)
whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(3)
values.forEach { assertThat(it).isEqualTo(0f) }
@@ -115,11 +101,11 @@
@Test
fun lockscreenAlpha() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.lockscreenAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
assertThat(values.size).isEqualTo(2)
values.forEach { assertThat(it).isEqualTo(0f) }
@@ -127,13 +113,13 @@
@Test
fun lockscreenAlpha_runDimissFromKeyguard() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.lockscreenAlpha)
- whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)
+ sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
assertThat(values.size).isEqualTo(2)
values.forEach { assertThat(it).isEqualTo(1f) }
@@ -141,13 +127,13 @@
@Test
fun lockscreenAlpha_leaveShadeOpen() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.lockscreenAlpha)
- whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(true)
+ sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
assertThat(values.size).isEqualTo(2)
values.forEach { assertThat(it).isEqualTo(1f) }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
similarity index 89%
rename from packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
rename to packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
index c1c0126..d9b1ea1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterImplTest.kt
@@ -216,6 +216,37 @@
}
@Test
+ fun state_expanding() =
+ testScope.runTest {
+ val qsImpl by collectLastValue(underTest.qsImpl)
+ val progress = 0.34f
+
+ underTest.inflate(context)
+ runCurrent()
+ clearInvocations(qsImpl!!)
+
+ underTest.setState(QSSceneAdapter.State.Expanding(progress))
+ with(qsImpl!!) {
+ verify(this).setQsVisible(true)
+ verify(this)
+ .setQsExpansion(
+ /* expansion= */ progress,
+ /* panelExpansionFraction= */ 1f,
+ /* proposedTranslation= */ 0f,
+ /* squishinessFraction= */ 1f,
+ )
+ verify(this).setListening(true)
+ verify(this).setExpanded(true)
+ verify(this)
+ .setTransitionToFullShadeProgress(
+ /* isTransitioningToFullShade= */ false,
+ /* qsTransitionFraction= */ 1f,
+ /* qsSquishinessFraction = */ 1f,
+ )
+ }
+ }
+
+ @Test
fun customizing_QS() =
testScope.runTest {
val customizing by collectLastValue(underTest.isCustomizing)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.kt
new file mode 100644
index 0000000..18a7320
--- /dev/null
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/adapter/QSSceneAdapterTest.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.qs.ui.adapter
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class QSSceneAdapterTest : SysuiTestCase() {
+ @Test
+ fun expandingSpecialValues() {
+ assertThat(QSSceneAdapter.State.QQS).isEqualTo(QSSceneAdapter.State.Expanding(0f))
+ assertThat(QSSceneAdapter.State.QS).isEqualTo(QSSceneAdapter.State.Expanding(1f))
+ }
+
+ @Test
+ fun collapsing() {
+ val collapsingProgress = 0.3f
+ assertThat(Collapsing(collapsingProgress))
+ .isEqualTo(QSSceneAdapter.State.Expanding(1 - collapsingProgress))
+ }
+}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
index 42e27ba..6403ed1 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
@@ -52,7 +52,7 @@
private val sceneInteractor = utils.sceneInteractor()
private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
private val flags = FakeFeatureFlagsClassic().also { it.set(Flags.NEW_NETWORK_SLICE_UI, false) }
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { _, _ -> mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
private var mobileIconsViewModel: MobileIconsViewModel =
MobileIconsViewModel(
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
index 18b7168..c110de9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt
@@ -20,7 +20,6 @@
import android.telecom.TelecomManager
import android.telephony.TelephonyManager
-import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.R
@@ -37,6 +36,8 @@
import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.log.table.TableLogBuffer
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHost
import com.android.systemui.model.SysUiState
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
@@ -186,7 +187,10 @@
private var bouncerSceneJob: Job? = null
- private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { _, _ -> mock<View>() })
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { mock() })
+
+ @Mock private lateinit var mediaDataManager: MediaDataManager
+ @Mock private lateinit var mediaHost: MediaHost
@Before
fun setUp() {
@@ -240,6 +244,8 @@
shadeHeaderViewModel = shadeHeaderViewModel,
qsSceneAdapter = qsFlexiglassAdapter,
notifications = utils.notificationsPlaceholderViewModel(),
+ mediaDataManager = mediaDataManager,
+ mediaHost = mediaHost,
)
utils.deviceEntryRepository.setUnlocked(false)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
index e2640af..1d2497d 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
@@ -23,6 +23,8 @@
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.Flags
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHost
import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter
import com.android.systemui.scene.SceneTestUtils
import com.android.systemui.scene.shared.model.SceneKey
@@ -35,6 +37,7 @@
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
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
import kotlinx.coroutines.test.runCurrent
@@ -42,6 +45,8 @@
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -77,14 +82,18 @@
scope = testScope.backgroundScope,
)
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { _, _ -> mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel
private lateinit var underTest: ShadeSceneViewModel
+ @Mock private lateinit var mediaDataManager: MediaDataManager
+ @Mock private lateinit var mediaHost: MediaHost
+
@Before
fun setUp() {
+ MockitoAnnotations.initMocks(this)
shadeHeaderViewModel =
ShadeHeaderViewModel(
applicationScope = testScope.backgroundScope,
@@ -102,6 +111,8 @@
shadeHeaderViewModel = shadeHeaderViewModel,
qsSceneAdapter = qsFlexiglassAdapter,
notifications = utils.notificationsPlaceholderViewModel(),
+ mediaDataManager = mediaDataManager,
+ mediaHost = mediaHost,
)
}
@@ -174,4 +185,20 @@
assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer))
}
+
+ @Test
+ fun hasActiveMedia_mediaVisible() =
+ testScope.runTest {
+ whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true)
+
+ assertThat(underTest.isMediaVisible()).isTrue()
+ }
+
+ @Test
+ fun doesNotHaveActiveMedia_mediaNotVisible() =
+ testScope.runTest {
+ whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false)
+
+ assertThat(underTest.isMediaVisible()).isFalse()
+ }
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
index 0b922a8..de767e3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIDialogTest.java
@@ -65,7 +65,7 @@
@Mock
private BroadcastDispatcher mBroadcastDispatcher;
@Mock
- private DialogDelegate<SystemUIDialog> mDelegate;
+ private SystemUIDialog.Delegate mDelegate;
@Before
public void setup() {
diff --git a/packages/SystemUI/res/color/notification_overlay_color.xml b/packages/SystemUI/res/color/notification_overlay_color.xml
index c24bff9..a14a7ad 100644
--- a/packages/SystemUI/res/color/notification_overlay_color.xml
+++ b/packages/SystemUI/res/color/notification_overlay_color.xml
@@ -17,7 +17,9 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.15" />
+ <!-- Pressed state's alpha is set to 0.00 temporarily until this bug is resolved permanently
+ b/313920497 Design intended alpha is 0.15-->
+ <item android:state_pressed="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.00" />
<item android:state_hovered="true" android:color="?androidprv:attr/materialColorOnSurface" android:alpha="0.11" />
<item android:color="@color/transparent" />
</selector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 45a2e8a..09f3766 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knoppie <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Op"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Af"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Regs"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Middel"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spasie"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Kennisgewings"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortpadsleutels"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Wissel sleutelborduitleg"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vee teks uit"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kortpaaie"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Soek kortpaaie"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Geen kortpaaie gevind nie"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Invoer"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Maak apps oop"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Huidige app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Kry toegang tot kennisgewingskerm"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Neem ’n volle skermskoot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Kry toegang tot lys met stelsel-/appkortpaaie"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Terug: gaan terug na vorige staat (terugknoppie)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Kry toegang tot tuisskerm"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oorsig van oop apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Beweeg deur onlangse apps (vorentoe)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Beweeg deur onlangse apps (terug)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Kry toegang tot lys met alle apps en soektogte (d.w.s., Search/Lanseerder)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Versteek en wys (weer) taakbalk"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Kry toegang tot stelselinstellings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Kry toegang tot Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bekyk kennisgewings"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Neem skermskoot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Wys kortpaaie"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gaan terug"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gaan na tuisskerm"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Bekyk onlangse apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Beweeg vorentoe deur onlangse apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Beweeg terug deur onlangse apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Maak appslys oop"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Wys taakbalk"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Maak instellings oop"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Maak Assistent oop"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Sluit skerm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Haal Notas-app op vir vinnige memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Maak notas oop"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Verrig veelvuldige stelseltake"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skakel oor van verdeelde skerm na volskerm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gaan by verdeelde skerm in met huidige app aan die regterkant"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gaan by verdeelde skerm in met huidige app aan die linkerkant"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skakel oor van verdeelde skerm na volskerm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Wissel invoertaal (volgende taal)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Wissel invoertaal (vorige taal)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skakel oor na volgende taal"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skakel oor na vorige taal"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Kry toegang tot emosiekone"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Kry toegang tot steminvoer"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programme"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bystand"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Blaaier (Chrome as verstek)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Blaaier"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakte"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pos (Gmail as verstek)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pos"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index bac72bf..9c07491 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"አዝራር <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"መነሻ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ተመለስ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ላይ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ወደታች"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ግራ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ቀኝ"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"የላይ ቀስት"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"የታች ቀስት"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"የግራ ቀስት"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"የቀኝ ቀስት"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"መሃል"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ክፍተት"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ማሳወቂያዎች"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"የቁልፍ ሰሌዳ አቋራጮች"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"የቁልፍ ሰሌዳ ገጽታ ለውጥ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ጽሑፍን አጽዳ"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ወይም"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"የፍለጋ መጠይቅን አጽዳ"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"አቋራጮች"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"አቋራጮችን ይፈልጉ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ምንም አቋራጮች አልተገኙም"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ግቤት"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"መተግበሪያዎችን ይክፈቱ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"የአሁኑ መተግበሪያ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"የማሳወቂያ ጥላ መዳረሻ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገፅ ዕይታ ያነሳል"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"የሥርዓት / የመተግበሪያ አቋራጮች ዝርዝር መዳረሻ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ተመለስ፦ ወደ ቀዳሚው ሁኔታ ይመለሳል (ተመለስ አዝራር)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"የመነሻ ማያ ገፅ መዳረሻ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"የክፍት መተግበሪያዎች አጠቃላይ ዕይታ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ፊት)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ኋላ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"የሁሉም መተግበሪያዎች ዝርዝር እና ፍለጋ መዳረሻ (ማለትም ፍለጋ/ማስጀመሪያ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"የተግባር አሞሌን ይደብቃል እና (እንደገና) ያሳያል"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"የሥርዓት ቅንብሮች መዳረሻ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"የGoogle ረዳት መዳረሻ"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"የፍለጋ ውጤቶችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"የስርዓት አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"የግብዓት አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"መተግበሪያዎችን የሚከፍቱ አቋራጮችን በማሳየት ላይ"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"ለአሁኑ መተግበሪያ አቋራጮችን በማሳየት ላይ"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ማሳወቂያዎችን አሳይ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ቅጽበታዊ ገጽ ዕይታን አንሳ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"አቋራጮችን አሳይ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ወደኋላ ተመለስ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ወደ መነሻ ማያ ገጽ ሂድ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"የቅርብ ጊዜ መተግበሪያዎችን አሳይ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ፊት ዑደት ማድረግ።"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"የቅርብ ጊዜ መተግበሪያዎች ላይ ወደ ኋላ ዑደት ማድረግ።"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"የመተግበሪያ ዝርዝር ክፈት"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"የተግባር አሞሌን አሳይ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ቅንብሮችን ክፈት"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ረዳትን ክፈት"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገፅ ቁልፍ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ለፈጣን ማስታወሻ የማስታወሻዎች መተግበሪያን ያወጣል"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ማስታወሻዎችን ክፈት"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"የሥርዓት ብዙ ተግባራትን በተመሳሳይ ጊዜ ማከናወን"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ከየተከፈለ ማያ ገፅ ወደ ሙሉ ገፅ ዕይታ ይቀይራል"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"በተከፈለ ማያ ገፅ ወቅት፦ መተግበሪያን ከአንዱ ወደ ሌላው ይተካል"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ግባ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይግቡ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ቀይር"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ግቤት"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"የግቤት ቋንቋን ይቀይራል (ቀጣይ ቋንቋ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ግቤት ቋንቋን ይቀይራል (ቀዳሚ ቋንቋ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ወደ ቀጣዩ ቋንቋ ቀይር"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ወደ ቀዳሚ ቋንቋ ቀይር"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"የስሜት ገላጭ ምስል መዳረሻ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"የድምፅ ትየባ መዳረሻ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"መተግበሪያዎች"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ረዳት"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"አሳሸ (Chrome እንደ ነባሪ)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ረዳት"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"አሳሽ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"እውቂያዎች"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ኢሜይል (Gmail እንደ ነባሪ)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ኢሜይል"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ኤስኤምኤስ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ሙዚቃ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"የቀን መቁጠሪያ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index c188535..1c065bb 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"الزر <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"أعلى"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"أسفل"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"يسار"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"يمين"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"وسط"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"مسافة"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"الإشعارات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"اختصارات لوحة المفاتيح"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تبديل تنسيق لوحة المفاتيح"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"محو النص"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"الاختصارات"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"البحث في الاختصارات"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"لم يُعثَر على اختصارات."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"إدخال"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"فتح التطبيقات"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"التطبيق الحالي"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"الوصول إلى مركز الإشعارات"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"أخذ لقطة شاشة كاملة"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"الوصول إلى قائمة اختصارات التطبيقات والنظام"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"رجوع: العودة إلى الحالة السابقة (زر الرجوع)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"الوصول إلى الشاشة الرئيسية"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"نظرة عامة على التطبيقات المفتوحة"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"التنقّل بين التطبيقات المُستخدَمة مؤخرًا (للأمام)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"التنقّل بين التطبيقات الحديثة (للخلف)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"قائمة الوصول لجميع التطبيقات والبحث (أي البحث/مشغّل التطبيقات)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"إظهار أو إخفاء أو إعادة إظهار شريط التطبيقات"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"الوصول إلى إعدادات النظام"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"الوصول إلى \"مساعد Google\""</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"عرض الإشعارات"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"أخذ لقطة شاشة"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"عرض الاختصارات"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"رجوع"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"الانتقال إلى الشاشة الرئيسية"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"عرض التطبيقات المستخدمة مؤخرًا"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"التنقّل للأمام بين التطبيقات المُستخدَمة مؤخرًا"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"التنقّل للوراء بين التطبيقات المُستخدَمة مؤخرًا"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"فتح قائمة التطبيقات"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"عرض شريط التطبيقات"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"فتح الإعدادات"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"فتح \"مساعد Google\""</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"شاشة القفل"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"سحب تطبيق Notes لإضافة مذكّرة سريعة"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"فتح تطبيق تدوين الملاحظات"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"تعدُّد المهام في النظام"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"الدخول في وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"الدخول في وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"التبديل من وضع \"تقسيم الشاشة\" إلى \"ملء الشاشة\""</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"في وضع \"تقسيم الشاشة\": استبدِل التطبيقات من تطبيق إلى آخر"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يسار الشاشة"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"تفعيل وضع \"تقسيم الشاشة\" مع عرض التطبيق الحالي على يمين الشاشة"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"التبديل من وضع \"تقسيم الشاشة\" إلى وضع \"ملء الشاشة\""</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"إدخال"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"تبديل لغة الإدخال (اللغة التالية)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"تبديل لغة الإدخال (اللغة السابقة)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"التبديل إلى اللغة التالية"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"التبديل إلى اللغة السابقة"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"الوصول إلى الرموز التعبيرية"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"الوصول إلى ميزة \"الكتابة بالصوت\""</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"التطبيقات"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"التطبيق المساعد"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"المتصفّح (فتح Chrome تلقائيًا)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"مساعد Google"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"المتصفح"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"جهات الاتصال"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"البريد الإلكتروني (فتح Gmail تلقائيًا)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"البريد الإلكتروني"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"الرسائل القصيرة SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"الموسيقى"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"التقويم"</string>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 59eca3a..0c5f104 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> বুটাম"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"হ\'ম"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"উভতি যাওক"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ওপৰলৈ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"তললৈ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"বাওঁফালে"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"সোঁফালে"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"স্ক্ৰীনৰ মাজত"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"স্পেচ"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"জাননীসমূহ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীব\'ৰ্ড শ্বৰ্টকাটসমূহ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীব\'ৰ্ডৰ সজ্জা সলনি কৰক"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"পাঠ মচক"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"শ্বৰ্টকাট"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"সন্ধানৰ শ্বৰ্টকাট"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"কোনো শ্বৰ্টকাট বিচাৰি পোৱা নাই"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ইনপুট"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"এপ্ খোলক"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"বৰ্তমানৰ এপ্"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"জাননী পেনেল এক্সেছ কৰক"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"এটা সম্পূৰ্ণ স্ক্ৰীনশ্বট লওক"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ছিষ্টেম / এপৰ শ্বৰ্টকাটসমূহৰ সূচীখন এক্সেছ কৰক"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"উভতি যাওক: পূৰ্বৱৰ্তী অৱস্থালৈ উভতি যাওক (উভতি যাওক বুটাম)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"গৃহ স্ক্ৰীন এক্সেছ কৰক"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"খোলা এপৰ ৰূপৰেখা"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"শেহতীয়া এপ্সমূহ এটা এটাকৈ চাওক (আগলৈ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"শেহতীয়া এপ্সমূহ এটা এটাকৈ চাওক (পিছলৈ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"আটাইবোৰ এপ্ আৰু সন্ধানৰ এক্সেছৰ সূচী (যেনে, Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"টাস্কবাৰ লুকুৱাওক আৰু (পুনৰ) দেখুৱাওক"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ছিষ্টেমৰ ছেটিং এক্সেছ কৰক"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant এক্সেছ কৰক"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"জাননী চাওক"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"স্ক্ৰীনশ্বট লওক"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"শ্বৰ্টকাট দেখুৱাওক"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"উভতি যাওক"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"গৃহ স্ক্ৰীনলৈ যাওক"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"শেহতীয়া এপ্সমূহ চাওক"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"শেহতীয়া এপ্সমূহ আগলৈ এটা এটাকৈ চাওক"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"শেহতীয়া এপ্সমূহ পিছলৈ এটা এটাকৈ চাওক"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"এপৰ সূচী খোলক"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবাৰ দেখুৱাওক"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ছেটিং খোলক"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খোলক"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্ৰীন"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ক্ষিপ্ৰ মেম’ৰ বাবে Notes এপ্ উলিয়াওক"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes এপ্ খোলক"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ছিষ্টেম মাল্টিটাস্কিং"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ সোঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"বৰ্তমানৰ এপৰ জৰিয়তে বিভাজিত স্ক্ৰীনৰ বাওঁফালৰ স্ক্ৰীনখনত সোমাওক"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"বিভাজিত স্ক্ৰীনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ইনপুটৰ ভাষা সলনি কৰক (পৰৱৰ্তী ভাষা)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ইনপুটৰ ভাষা সলনি কৰক (পূৰ্বৱৰ্তী ভাষা)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"পৰৱৰ্তী ভাষাটোলৈ সলনি কৰক"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"পূৰ্বৰ ভাষালৈ সলনি কৰক"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ইম’জি এক্সেছ কৰক"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ভইচ টাইপিং এক্সেছ কৰক"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"এপ্লিকেশ্বনসমূহ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"সহায়"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ব্ৰাউজাৰ (ডিফ’ল্ট হিচাপে Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ব্ৰাউজাৰ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"সম্পৰ্কসূচী"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ইমেইল (ডিফ’ল্ট হিচাপে Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ইমেইল"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"এছএমএছ"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 121e276..b2ee455 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Düymə <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Əsas səhifə"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Geri"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Yuxarı"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Aşağı"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sol"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Sağ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Mərkəz"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Boşluq"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirişlər"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatura qısa yolları"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura düzümünü dəyişin"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Mətni silin"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Qısayollar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Qısayollar axtarın"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Qısayol tapılmadı"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Daxiletmə"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Açıq tətbiqlər"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Cari tətbiq"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildiriş göstərişinə giriş"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tam skrinşot çəkin"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Sistem siyahısına/tətbiq qısayollarına giriş"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Geri: əvvəlki vəziyyətə geri qayıdın (geri düyməsi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ana ekrana giriş"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Açıq tətbiqlərin icmalı"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Son tətbiqlər arasında keçid edin (irəli)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Son tətbiqlər arasında keçid edin (geri)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Tətbiqlər siyahısına və axtarışa (yəni Axtarış/Başladıcı) giriş"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"İşləmə panelini gizlədin və (yenidən) göstərin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Sistem ayarlarına giriş"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistentə giriş"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirişlərə baxın"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Skrinşot çəkin"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Qısayolları göstərin"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Geri qayıdın"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Əsas ekrana keçin"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Son tətbiqlərə baxın"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son tətbiqlər boyunca irəli keçin"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Son tətbiqlər boyunca geri keçin"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Tətbiq siyahısını açın"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"İşləmə panelini göstərin"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları açın"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistenti açın"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kilid ekranı"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Sürətli qeyd üçün Qeydlər tətbiqini yuxarı dartın"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Qeydləri açın"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistemdə çoxsaylı tapşırıq icrası"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Cari tətbiq sağda olmaqla Bölünmüş ekrana daxil olun"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Cari tətbiq solda olmaqla Bölünmüş ekrana daxil olun"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bölünmüş ekrandan tam ekrana dəyişin"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişdirin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Cari tətbiq sağda olmaqla bölünmüş ekrana daxil olun"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Cari tətbiq solda olmaqla bölünmüş ekrana daxil olun"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana keçin"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Daxiletmə"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Daxiletmə dilini dəyişin (növbəti dil)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Daxiletmə dilini dəyişin (əvvəlki dil)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Növbəti dilə keçin"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Əvvəlki dilə keçin"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojiyə giriş"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Səslə yazmaya giriş"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Tətbiqlər"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Yardım"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauzer (defolt olaraq Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauzer"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktlar"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-poçt (defolt olaraq Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-poçt"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqi"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Təqvim"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 4c535d8..ce734dc 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Taster Početna"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Taster Nazad"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Taster sa strelicom nagore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Taster sa strelicom nadole"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Taster sa strelicom nalevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Taster sa strelicom nadesno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Taster sa centralnom strelicom"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Razmak"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obaveštenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tasterske prečice"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promeni raspored tastature"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Obrišite tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretražite prečice"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nisu pronađene prečice"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvaranje aplik"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuelna aplik"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristup traci sa obaveštenjima"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Snimanje ekrana"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristup listi prečica za sistem/aplikacije"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazad: nazad na prethodno stanje (dugme Nazad)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristup početnom ekranu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregled nedavnih aplikacija (napred)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregled nedavnih aplikacija (nazad)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristup listi svih alpikacija i pretraga (npr. Pretraga/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrivanje i ponovno prikazivanje trake zadataka"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristup podešavanjima sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristup Google pomoćniku"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaži obaveštenja"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Napravi snimak ekrana"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaži prečice"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazad"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Idi na početni ekran"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Pregledaj nedavno korišćene aplikacije"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pregledaj nedavno korišćene aplikacije unapred"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pregledaj nedavno korišćene aplikacije unazad"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori listu aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaži traku zadataka"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori podešavanja"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori pomoćnika"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otvaranje aplikacije Beleške za brzo pravljenje beleške"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvori beleške"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Obavljanje više zadataka sistema istovremeno"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Pokretanje podeljenog ekrana za aktuelnu aplikaciju na desnoj strani"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Pokretanje podeljenog ekrana za aktuelnu aplikaciju na levoj strani"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prelazak sa podeljenog ekrana na ceo ekran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tokom podeljenog ekrana: zamena jedne aplikacije drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pokreni podeljeni ekran za aktuelnu aplikaciju na desnoj strani"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pokreni podeljeni ekran za aktuelnu aplikaciju na levoj strani"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pređi sa podeljenog ekrana na ceo ekran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"U režimu podeljenog ekrana: zamena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Promena jezika unosa (sledeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Promena jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pređi na sledeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Pređi na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristup emodžijima"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristup unosu teksta glasom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Aplikacija za pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Pregledač (podrazumevano Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Pomoćnik"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Pregledač"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Imejl (Gmail kao podrazumevani)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Imejl"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index ffde20e..74e46fc 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Уверх"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Уніз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Улева"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Управа"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Цэнтр"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Прабел"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Апавяшчэнні"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Спалучэнні клавіш"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пераключыць раскладку клавіятуры"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Выдаліць тэкст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Ярлыкі"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пошук ярлыкоў"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ярлыкі не знойдзены"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Увод"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Адкрытыя праграмы"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Бягучая праграма"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Перайсці да шчытка апавяшчэнняў"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Зрабіць здымак усяго экрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Перайсці да спіса сістэмных ярлыкоў і ярлыкоў праграм"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Вярнуцца ў папярэдні стан (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Перайсці на галоўны экран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Агляд адкрытых праграм"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Перайсці да нядаўніх праграм (пераключэнне ўперад)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Перайсці да нядаўніх праграм (пераключэнне назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Перайсці да спісу ўсіх праграм і пошуку (Пошук/Панэль запуску)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Схаваць і (зноў) паказаць панэль задач"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Перайсці да налад сістэмы"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Выклік Памочніка Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Праглядзець апавяшчэнні"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Зрабіць здымак экрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Паказаць спалучэнні клавіш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Перайсці назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перайсці на галоўны экран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Праглядзець нядаўнія праграмы"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся ўперад"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Пераходзіць паміж нядаўнімі праграмамі, перамяшчаючыся назад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Адкрыць спіс праграм"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Паказаць панэль задач"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Адкрыць налады"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Выклікаць Памочніка"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экран блакіроўкі"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Выклікаць праграму \"Нататкі\", каб зрабіць запіс"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Адкрыць нататкі"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Шматзадачнасць сістэмы"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай справа"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Перайсці ў рэжым падзеленага экрана з бягучай праграмай злева"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пераключыцца з рэжыму падзеленага экрана на поўнаэкранны рэжым"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"У рэжыме падзеленага экрана замяніць адну праграму на іншую"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Увод"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Пераключыць мову ўводу (наступная мова)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Пераключыць мову ўводу (папярэдняя мова)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пераключыцца на наступную мову"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Пераключыцца на папярэднюю мову"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Перайсці да эмодзі"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Актываваць галасавы ўвод"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Праграмы"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Памочнік"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браўзер (стандартна выкарыстоўваецца Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Памочнік"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браўзер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Кантакты"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электронная пошта (стандартна выкарыстоўваецца Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электронная пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-паведамленні"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Каляндар"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index ad690e6..7a00ded 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Бутон „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Начало"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Надолу"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Наляво"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Надясно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Център"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Интервал"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известия"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Клавишни комбинации"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Превкл. на клавиат. подредба"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Изчистване на текста"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Клавишни комбинации"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Търсете комбинации"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Няма клавишни комбинации"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Въвеждане"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отворени прил."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Текущо прилож."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Достъп до падащия панел с известия"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Заснемане на целия екран"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Достъп до списъка с клавишни комбинации за системата/приложенията"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: връщане към предишното състояние (бутон за връщане назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Достъп до началния екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Общ преглед на отворените приложения"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Преглед на скорошните приложения (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Преглед на скорошните приложения (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Достъп до списъка с прилож. и търсене (т.е. Търсене/стартов панел)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скриване и (повторно) показване на лентата на задачите"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Достъп до системните настройки"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Достъп до Google Асистент"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Преглед на известията"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Създаване на екранна снимка"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показване на клавишните комбинации"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Отваряне на началния екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Преглед на скорошните приложения"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Превъртане напред през скорошните приложения"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Превъртане назад през скорошните приложения"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отваряне на списъка с приложения"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показване на лентата на задачите"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отваряне на настройките"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отваряне на Асистент"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заключване на екрана"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отваряне на приложението за бележки с цел бързо записване"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отваряне на бележките"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Едновременно изпълняване на няколко задачи в системата"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Преминаване към разделен екран с текущото приложение отдясно"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Преминаване към разделен екран с текущото приложение отляво"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Превключване от разделен към цял екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"При разделен екран: замяна на дадено приложение с друго"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Преминаване към разделен екран с текущото приложение отдясно"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Преминаване към разделен екран с текущото приложение отляво"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Превключване от разделен към цял екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"При разделен екран: замяна на дадено приложение с друго"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Въвеждане"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Превключване към следващия език на въвеждане"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Превключване към предишния език на въвеждане"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Превключване към следващия език"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Превключване към предишния език"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Достъп до емоджи"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Достъп до функцията за печатане с глас"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Приложения"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помощно приложение"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузър (по подразбиране е Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Асистент"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузър"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Електронна поща (по подразбиране е Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Електронна поща"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 1383776..9954fbd 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> বোতাম"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"হোম"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ফিরুন"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"উপরে"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"নিচে"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"বাঁ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ডান"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"কেন্দ্র"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"বিজ্ঞপ্তি"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"কীবোর্ড শর্টকাট"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"কীবোর্ড লে-আউট পাল্টান"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"টেক্সট মুছুন"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"শর্টকাট"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"শর্টকাট সার্চ করুন"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"কোনও শর্টকার্ট পাওয়া যায়নি"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ইনপুট"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"খুলে রাখা অ্যাপ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"বর্তমান অ্যাপ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"বিজ্ঞপ্তি শেড অ্যাক্সেস করুন"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"সম্পূর্ণ স্ক্রিনশট নিন"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"সিস্টেমের তালিকা / অ্যাপ শর্টকাটের তালিকা অ্যাক্সেস করুন"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ফিরে আসা: আগের স্ট্যাটাসে ফিরে আসুন (ফিরে যাওয়ার বোতাম)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"হোম স্ক্রিন অ্যাক্সেস করুন"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"এক নজরে অফিসের অ্যাপ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"সাম্প্রতিক অ্যাপ দেখুন (পরবর্তীতে যান)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"সাম্প্রতিক অ্যাপ দেখুন (আগে ফিরে যান)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"সব অ্যাপ ও সার্চের ফলাফলের তালিকা অ্যাক্সেস করুন (যেমন, সার্চ/লঞ্চার)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"টাস্কবার লুকান এবং (আবার)দেখুন"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"সিস্টেমের সেটিংস অ্যাক্সেস করুন"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant অ্যাক্সেস করুন"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"বিজ্ঞপ্তি দেখুন"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"স্ক্রিনশট নিন"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"শর্টকাট দেখুন"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ফিরে যান"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"হোম স্ক্রিনে যান"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"সাম্প্রতিক অ্যাপের মাধ্যমে পরবর্তী জায়গায় যান"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"সাম্প্রতিক অ্যাপের মাধ্যমে আগের জায়গায় ফিরুন"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"অ্যাপের তালিকা খুলুন"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"টাস্কবার দেখুন"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"সেটিংস খুলুন"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant খুলুন"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"লক স্ক্রিন"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"দ্রুত মেমোর জন্য Notes অ্যাপ উপরের দিকে তুলুন"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"নোট খুলুন"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"সিস্টেম মাল্টিটাস্কিং"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ডান দিকে থাকা বর্তমান অ্যাপ ব্যবহার করে স্প্লিট স্ক্রিন যোগ করুন"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে স্প্লিট স্ক্রিন যোগ করুন"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"স্প্লিট স্ক্রিন থেকে ফুল স্ক্রিনে পাল্টান"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"স্প্লিট স্ক্রিন থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পরিবর্তন করুন"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ডানদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"বাঁদিকে থাকা বর্তমান অ্যাপ ব্যবহার করে \'স্প্লিট স্ক্রিন\' যোগ করুন"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"\'স্প্লিট স্ক্রিন\' থেকে ফুল স্ক্রিনে পাল্টান"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ইনপুট"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"লেখার ভাষা পাল্টান (পরবর্তী ভাষা)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"লেখার ভাষা পাল্টান (আগের ভাষা)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"পরবর্তী ভাষায় পাল্টান"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"আগের ভাষায় পাল্টান"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ইমোজি অ্যাক্সেস করুন"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ভয়েস টাইপিং অ্যাক্সেস করুন"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"অ্যাপ্লিকেশন"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"সহযোগিতা"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ব্রাউজার (ডিফল্ট হিসেবে Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ব্রাউজার"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"পরিচিতি"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ইমেল (ডিফল্ট হিসেবে Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ইমেল"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"সংগীত"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 0481288..041e3b6 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Dugme <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Tipka za početak"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nazad"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolje"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Lijevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tipka za razmak"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavještenja"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Prečice tastature"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Zamijeni raspored tastature"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Brisanje teksta"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretraživanje prečica"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nisu pronađene prečice"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvorene aplik."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutna aplik."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristup lokaciji za obavještenja"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Snimanje cijelog ekrana"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristup listi prečica sistema/aplikacija"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazad: vraćanje na prethodno stanje (dugme za nazad)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristup početnom ekranu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregled nedavnih aplikacija (unaprijed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregled nedavnih aplikacija (unazad)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristup listi svih aplikacija i pretraživanje (Pretraživanje/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sakrivanje i (ponovno) prikazivanje trake zadataka"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristup postavkama sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristup Google Asistentu"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaz obavještenja"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Pravljenje snimka ekrana"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaz prečica"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazad"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Odlazak na početni ekran"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Prikaz nedavnih aplikacija"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruženje kroz nedavne aplikacije unaprijed"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruženje kroz nedavne aplikacije unazad"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvaranje liste aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz trake zadataka"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvaranje postavki"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvaranje Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje ekrana"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Preuzimanje aplikacije Bilješke za brzi podsjetnik"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvaranje Bilješki"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na desnoj strani"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvaranje podijeljenog ekrana s trenutnom aplikacijom na lijevoj strani"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prebacivanje s podijeljenog ekrana na prikaz preko cijelog ekrana"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Promjena jezika unosa (sljedeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Promjena jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prebacivanje na sljedeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prebacivanje na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristup emoji sličicama"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristup pisanju govorom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Preglednik (Chrome kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Preglednik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (Gmail kao zadana)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 03ef98d..eb652a1 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botó <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inici"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Enrere"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Amunt"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Avall"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dreta"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espai"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacions"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tecles de drecera"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Canvia disposició de teclat"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Esborra el text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Dreceres"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cerca dreceres"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No s\'ha trobat cap drecera"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Obre aplicacions"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplicació actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accedeix a l\'àrea de notificacions"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Fes una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accedeix a la llista de dreceres d\'aplicacions i del sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Enrere: torna a l\'estat anterior (botó Enrere)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accedeix a la pantalla d\'inici"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Informació general sobre les aplicacions obertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Recorre les aplicacions recents (endavant)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Recorre les aplicacions recents (enrere)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accedeix a la llista de totes les apps i a la cerca (Cerca/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Amaga i torna a mostrar la barra de tasques"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accedeix a la configuració del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accedeix a l\'Assistent de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostra les notificacions"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fes una captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostra les dreceres"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Torna"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ves a la pantalla d\'inici"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Mostra les aplicacions recents"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplaça\'t cap endavant per les aplicacions recents"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplaça\'t cap enrere per les aplicacions recents"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Obre la llista d\'aplicacions"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra la barra de tasques"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Obre la configuració"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Obre l\'Assistent"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueig"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Obre l\'aplicació Notes per prendre notes ràpides"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Obre les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasques del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Canvia de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Entra al mode de pantalla dividida amb l\'aplicació actual a la dreta"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Entra al mode de pantalla dividida amb l\'aplicació actual a l\'esquerra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Canvia de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durant el mode de pantalla dividida: substitueix una app per una altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Canvia l\'idioma d\'introducció (idioma següent)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Canvia l\'idioma d\'introducció (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Canvia a l\'idioma següent"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Caniva a l\'idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accedeix als emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accedeix a l\'escriptura per veu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicacions"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistència"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome com a predeterminat)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactes"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correu electrònic (Gmail com a predeterminat)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correu electrònic"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 8b75a3e..05a20c1 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tlačítko <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Zpět"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nahoru"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolů"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vlevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Vpravo"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Šipka nahoru"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Šipka dolů"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Šipka vlevo"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Šipka doprava"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Střed"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"TAB"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mezerník"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Oznámení"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové zkratky"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Přepnout rozložení klávesnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vymazat text"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"nebo"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Vymazat vyhledávaný dotaz"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Zkratky"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Vyhledat zkratky"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Žádné zkratky nenalezeny"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vstup"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otevřené aplikace"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuální aplikace"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Otevřít panel oznámení"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Pořídit snímek celé obrazovky"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Otevřít seznam zkratek do systému / aplikací"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Zpět: vrátit se k předchozímu stavu (tlačítko zpět)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Přejít na plochu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Přehled otevřených aplikací"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Procházet nedávné aplikace (vpřed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Procházet nedávné aplikace (zpět)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Otevřít seznam všech aplikací a vyhledávání (např. Vyhledávání/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrýt a (znovu) zobrazit panel aplikací"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Otevřít systémová nastavení"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Otevřít Asistenta Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Zobrazují se výsledky vyhledávání"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Zobrazují se systémové zkratky"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Zobrazují se zkratky pro zadávání"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Zobrazují se zkratky, které otevírají aplikace"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Zobrazují se zkratky pro aktuální aplikaci"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Zobrazit oznámení"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Pořídit snímek obrazovky"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Zobrazit zkratky"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Zpět"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Přejít na plochu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Zobrazit nedávné aplikace"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Procházet nedávné aplikace směrem vpřed"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Procházet nedávné aplikace směrem zpět"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otevřít seznam aplikací"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazit panel aplikací"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otevřít nastavení"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otevřít Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Uzamknout obrazovku"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Spustit aplikaci Poznámky a udělat rychlý zápis"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otevřít poznámky"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systémový multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi napravo"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Přepnout na rozdělenou obrazovku s aktuálními aplikacemi nalevo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Přepnout z rozdělené obrazovky na celou obrazovku"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Přepnout jazyk vstupu (další jazyk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Přepnout jazyk vstupu (předchozí jazyk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Přepnout na další jazyk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Přepnout na předchozí jazyk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Otevřít smajlíky"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Otevřít hlasové zadávání"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikace"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistence"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Prohlížeč (výchozí je Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Prohlížeč"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (výchozí je Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendář"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9f5b600..1cfb005 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>-knap"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tilbage"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Op"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Venstre"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Højre"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midtertast"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mellemrumstast"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikationer"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastaturgenveje"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skift tastaturlayout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ryd tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Genveje"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Søg efter genveje"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ingen genveje blev fundet"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Åbn apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuel app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Åbn notifikationspanel"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tag et screenshot af hele skærmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Åbn liste over system-/appgenveje"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Forrige: Gå tilbage til den forrige tilstand (knappen Tilbage)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Åbn startskærm"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oversigt over åbne apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Gennemgå seneste apps (næste)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Gennemgå seneste apps (forrige)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Åbn liste over alle apps, og søg (dvs. Søg/Starter)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skjul, og vis proceslinjen (igen)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Åbn systemindstillinger"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Åbn Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se notifikationer"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Tag et screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Vis genveje"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gå tilbage"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gå til startskærm"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se seneste apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå frem i dine seneste apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå tilbage i dine seneste apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åbn appfortegnelse"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis proceslinje"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åbn indstillinger"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åbn Assistent"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skærm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Åbn appen Notes for at skrive et hurtigt notat"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Åbn noter"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systemmultitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Start opdelt skærm med aktuel app til højre"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Start opdelt skærm med aktuel app til venstre"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skift fra opdelt skærm til fuld skærm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ved opdelt skærm: Erstat en app med en anden app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Start opdelt skærm med aktuel app til højre"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Start opdelt skærm med aktuel app til venstre"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skift fra opdelt skærm til fuld skærm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ved opdelt skærm: Udskift én app med en anden"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Skift inputsprog (næste sprog)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Skift inputsprog (forrige sprog)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skift til næste sprog"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skift til forrige sprog"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Find emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Åbn indtaling"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applikationer"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Mail (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 25d7202..5ce500d 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Taste <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Pos1"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Zurück"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nach oben"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Nach unten"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Nach links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Nach rechts"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Aufwärtspfeil"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Abwärtspfeil"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Linkspfeil"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Rechtspfeil"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Zentrieren"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulatortaste"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Leertaste"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Benachrichtigungen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tastenkürzel"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tastaturlayout wechseln"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Text löschen"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"oder"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Suchanfrage löschen"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Tastenkombinationen"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tastenkombinationen suchen"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Keine gefunden"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Eingabe"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Geöffnete Apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuelle App"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Auf Benachrichtigungsleiste zugreifen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Vollbild-Screenshot aufnehmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Auf Liste mit System-/App-Verknüpfungen zugreifen"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Zurück: Vorherigen Zustand wiederherstellen (Schaltfläche „Zurück“)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Auf Startbildschirm zugreifen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Übersicht über geöffnete Apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Zuletzt verwendete Apps vorwärts durchgehen"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Zuletzt verwendete Apps rückwärts durchgehen"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Auf Liste mit Apps und Suchmaschinen zugreifen, z. B. Google Suche / Google Now Launcher"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Taskleiste ausblenden und (wieder) einblenden"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Auf Systemeinstellungen zugreifen"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Auf Google Assistant zugreifen"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Suchergebnisse werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Tastenkombinationen des Systems werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Tastenkombinationen für die Eingabe werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Tastenkombinationen zum Öffnen von Apps werden angezeigt"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Tastenkombinationen für die aktuelle App werden angezeigt"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Benachrichtigungen ansehen"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot erstellen"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tastenkombinationen anzeigen"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Zurück"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Zum Startbildschirm wechseln"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Letzte Apps aufrufen"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zuletzt verwendete Apps vorwärts durchgehen"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Zuletzt verwendete Apps rückwärts durchgehen"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Liste der Apps öffnen"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskleiste anzeigen"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Einstellungen öffnen"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant öffnen"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Sperrbildschirm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Notizen-App für schnelles Memo aufrufen"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notizen öffnen"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System-Multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Splitscreen aktivieren, aktuelle App rechts"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Splitscreen aktivieren, aktuelle App links"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vom Splitscreen zum Vollbild wechseln"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Splitscreen aktivieren, aktuelle App rechts"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Splitscreen aktivieren, aktuelle App links"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vom Splitscreen zum Vollbild wechseln"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Im Splitscreen: eine App durch eine andere ersetzen"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Eingabe"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Eingabesprache ändern (nächste Sprache)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Eingabesprache ändern (vorherige Sprache)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Zur nächsten Sprache wechseln"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Zu vorheriger Sprache wechseln"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Auf Emoji zugreifen"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Auf Spracheingabe zugreifen"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistent"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome ist Standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakte"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-Mail-Programm (Gmail ist Standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-Mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 9bd246a..fe8a07f 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Κουμπί <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Πίσω"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Πάνω"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Κάτω"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Αριστερά"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Δεξιά"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Επάνω βέλος"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Κάτω βέλος"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Αριστερό βέλος"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Δεξί βέλος"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Κέντρο"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Πλήκτρο διαστήματος"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ειδοποιήσεις"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Συντομεύσεις πληκτρολογίου"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Αλλαγή διάταξης πληκτρολογίου"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Διαγραφή κειμένου"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ή"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Διαγραφή ερωτήματος αναζήτησης"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Συντομεύσεις"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Αναζήτηση συντομεύσεων"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Δεν βρέθηκαν συντομεύσεις"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Είσοδος"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ανοιχτές εφαρμ."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Τρέχ. εφαρμογή"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Πρόσβαση στο πλαίσιο σκίασης ειδοποιήσεων"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Λήψη πλήρους στιγμιότυπου οθόνης"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Πρόσβαση σε λίστα συντομεύσεων συστήματος / εφαρμογών"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Πίσω: επιστροφή στην προηγούμενη κατάσταση (κουμπί πίσω)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Πρόσβαση στην αρχική οθόνη"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Επισκόπηση ανοιχτών εφαρμογών"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Περιήγηση σε πρόσφατες εφαρμογές (εμπρός)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Περιήγηση σε πρόσφατες εφαρμογές (πίσω)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Πρόσβαση σε λίστα εφαρμογών και αναζήτησης (Αναζήτηση/Εφ. εκκίνησης)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Απόκρυψη και (επαν)εμφάνιση της γραμμής εργαλείων"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Πρόσβαση στις ρυθμίσεις συστήματος"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Πρόσβαση στον Βοηθό Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Εμφάνιση αποτελεσμάτων αναζήτησης"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Εμφάνιση συντομεύσεων συστήματος"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Εμφάνιση συντομεύσεων εισόδου"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Εμφάνιση συντομεύσεων για το άνοιγμα εφαρμογών"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Εμφάνιση συντομεύσεων για την τρέχουσα εφαρμογή"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Προβολή ειδοποιήσεων"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Λήψη στιγμιότυπου οθόνης"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Εμφάνιση συντομεύσεων"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Επιστροφή"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Μετάβαση στην αρχική οθόνη"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Προβολή πρόσφατων εφαρμογών"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Περιήγηση προς τα εμπρός σε πρόσφατες εφαρμογές"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Περιήγηση προς τα πίσω σε πρόσφατες εφαρμογές"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Άνοιγμα λίστας εφαρμογών"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Εμφάνιση γραμμής εργαλείων"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Άνοιγμα ρυθμίσεων"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Άνοιγμα Βοηθού"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Κλείδωμα οθόνης"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Εμφάνιση εφαρμογής Σημειώσεις για γρήγορη σύνταξη σημείωσης"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Άνοιγμα σημειώσεων"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Πολυδιεργασία συστήματος"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα δεξιά"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ενεργοποίηση διαχωρισμού οθόνης με την τρέχουσα εφαρμογή στα αριστερά"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Εναλλαγή από διαχωρισμό οθόνης σε πλήρη οθόνη"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Είσοδος"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Εναλλαγή γλώσσας εισόδου (επόμενη γλώσσα)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Εναλλαγή γλώσσας εισόδου (προηγούμενη γλώσσα)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Εναλλαγή στην επόμενη γλώσσα"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Εναλλαγή στην προηγούμενη γλώσσα"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Πρόσβαση στα emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Πρόσβαση στη φωνητική πληκτρολόγηση"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Εφαρμογές"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Υποβοήθηση"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Πρόγραμμα περιήγησης (Chrome ως προεπιλογή)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Βοηθός"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Πρόγραμμα περιήγησης"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Επαφές"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Ηλεκτρονικό ταχυδρομείο (Gmail ως προεπιλογή)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Ηλεκτρονικό ταχυδρομείο"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Μουσική"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ημερολόγιο"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index b3dea8d..30b03b2 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index bbfdcea..d349d6d 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Up arrow"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Down arrow"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Left arrow"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Right arrow"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard Shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system / apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Showing search results"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Showing system shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Showing input shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Showing shortcuts that open apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Showing shortcuts for the current app"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forward through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backward through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter Split screen with current app to RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter Split screen with current app to LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from Split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During Split screen: replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
@@ -1194,7 +1200,7 @@
<string name="mirror_display" msgid="2515262008898122928">"Mirror display"</string>
<string name="dismiss_dialog" msgid="2195508495854675882">"Dismiss"</string>
<string name="connected_display_icon_desc" msgid="6373560639989971997">"Display connected"</string>
- <string name="privacy_dialog_title" msgid="7839968133469098311">"Microphone & Camera"</string>
+ <string name="privacy_dialog_title" msgid="7839968133469098311">"Microphone and camera"</string>
<string name="privacy_dialog_summary" msgid="2458769652125995409">"Recent app use"</string>
<string name="privacy_dialog_more_button" msgid="7610604080293562345">"See recent access"</string>
<string name="privacy_dialog_done_button" msgid="4504330708531434263">"Done"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b3dea8d..30b03b2 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b3dea8d..30b03b2 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system/apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: Go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forwards through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backwards through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter split screen with current app to right-hand side"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter split screen with current app to left-hand screen"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During split screen: Replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: Replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 5340b7b..9b46442 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Up arrow"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Down arrow"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Left arrow"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Right arrow"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Keyboard Shortcuts"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Switch keyboard layout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Clear text"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"or"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Clear search query"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shortcuts"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Search shortcuts"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No shortcuts found"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Open apps"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Current app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Access notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Take a full screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Access list of system / apps shortcuts"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Back: go back to previous state (back button)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Access home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cycle through recent apps (forward)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cycle through recent apps (back)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Access list of all apps and search (i.e. Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Hide and (re)show taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Access system settings"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Showing search results"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Showing system shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Showing input shortcuts"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Showing shortcuts that open apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Showing shortcuts for the current app"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"View notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Take screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Show shortcuts"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Go back"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Go to home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"View recent apps"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cycle forward through recent apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cycle backward through recent apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Open apps list"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Show taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Open settings"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Open assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lock screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Pull up Notes app for quick memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Open notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Enter Split screen with current app to RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Enter Split screen with current app to LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Switch from Split screen to full screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"During Split screen: replace an app from one to another"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Enter split screen with current app to RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Enter split screen with current app to LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Switch from split screen to full screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"During split screen: replace an app from one to another"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Switch input language (next language)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Switch input language (previous language)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Switch to next language"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Switch to previous language"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Access emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Access voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome as default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail as default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 78f91b1..0bc807e 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atrás"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abajo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Izquierda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Derecha"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Flecha hacia arriba"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Flecha hacia abajo"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Flecha a la izquierda"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Flecha hacia la derecha"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espacio"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar texto"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"o bien"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Borrar búsqueda"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar comb. de teclas"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"No hay comb. de teclas"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abiertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder al panel de notificaciones"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tomar una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder a una lista de combinación de teclas del sistema/apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: Vuelve al estado anterior (botón Atrás)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder a la pantalla principal"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Obtener una descripción general de las apps abiertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Desplazar por las apps recientes (adelante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Desplazar por las apps recientes (atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder a lista de apps y búsquedas (p. ej. Búsqueda/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Esconder y volver a mostrar la barra de tareas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder a la configuración del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder a Asistente de Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Mostrando los resultados de la búsqueda"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Mostrando combinaciones de teclas del sistema"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Mostrando entradas de combinaciones de teclas"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Mostrando combinaciones de teclas que abren apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Mostrando combinaciones de teclas para la app actual"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificaciones"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Tomar captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Atrás"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla principal"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver apps recientes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazar por las apps recientes (adelante)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazar por las apps recientes (atrás)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar Barra de tareas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Bloquear la pantalla"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Mostrar la app de Notas para crear un recordatorio rápido"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Tareas múltiples del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durante pantalla dividida: Reemplaza una app con otra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con la app actual en el lado derecho (RHS)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con la app actual en el lado izquierdo (LHS)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante pantalla dividida: Reemplaza una app con otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar el idioma de escritura (próximo idioma)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar el idioma de escritura (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar al idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder a los emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder al dictado por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicaciones"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistencia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo electrónico (Gmail como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 59802ad..f642386 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atrás"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abajo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Izquierda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Derecha"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulador"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espacio"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificaciones"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ver combinaciones de teclas"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar diseño del teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar combinaciones de teclas"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ninguna encontrada"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abiertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App en uso"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder a la pantalla de notificaciones"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Hacer una captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder a la lista de combinaciones de teclas de apps y del sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: volver al estado anterior (botón para volver)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder a la pantalla de inicio"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Vista general de aplicaciones abiertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Recorrer aplicaciones recientes (hacia delante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Recorrer aplicaciones recientes (hacia atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder a la lista de todas las apps y a la búsqueda (Buscar/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar y mostrar la barra de tareas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder a los ajustes del sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder al Asistente de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificaciones"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Hacer captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Volver"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla de inicio"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver aplicaciones recientes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazarse por las aplicaciones recientes (adelante)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazarse por las aplicaciones recientes (atrás)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicaciones"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar la barra de tareas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir ajustes"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir el Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Abrir la aplicación de notas para tomar una nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Función multitarea del sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Iniciar pantalla dividida con esta aplicación en el lado derecho"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Iniciar pantalla dividida con esta aplicación en el lado izquierdo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar idioma de entrada (idioma siguiente)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar idioma de entrada (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al siguiente idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar al idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder a los emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder a Escribir por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicaciones"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistencia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo (Gmail como predeterminado)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index ec65920..8e9616f 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Nupp <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Avakuva"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tagasi"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Üles"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Alla"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vasakule"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Paremale"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Keskele"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tühik"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Märguanded"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klaviatuuri otseteed"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatuuripaigutuse vahetus"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Teksti kustutamine"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Otseteed"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Otseteede otsing"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Otseteid ei leitud"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Sisend"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Rakenduste avamine"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Praegune rakendus"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Juurdepääs märguandealale"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Täisekraanipildi jäädvustamine"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Juurdepääs süsteemi/rakenduste otseteede loendile"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Tagasi: eelmisesse olekusse naasmine (tagasinupp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Juurdepääs avakuvale"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Avatud rakenduste ülevaade"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Hiljutiste rakenduste sirvimine (edasi)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Hiljutiste rakenduste sirvimine (tagasi)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Juurdepääs kõigi rakenduste ja otsingute loendile (st Otsing/Käivitusprogramm)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Tegumiriba peitmine ja kuvamine"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Juurdepääs süsteemi seadetele"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Juurdepääs Google\'i assistendile"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Märguannete vaatamine"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ekraanipildi jäädvustamine"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Otseteede kuvamine"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Tagasiliikumine"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Avakuvale liikumine"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Hiljutiste rakenduste vaatamine"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Hiljutiste rakenduste hulgas edasi liikumine"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Hiljutiste rakenduste hulgas tagasi liikumine"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Rakenduste loendi avamine"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tegumiriba kuvamine"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Seadete avamine"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistendi avamine"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lukustuskuva"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Rakenduse Märkmed avamine kiirmemo jaoks"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Märkmete avamine"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Süsteemi multitegumtöö"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ekraanikuva jagamine, nii et praegune rakendus on paremal"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ekraanikuva jagamine, nii et praegune rakendus on vasakul"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Ekraanikuva jagamine, nii et praegune rakendus on paremal"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Ekraanikuva jagamine, nii et praegune rakendus on vasakul"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Jagatud ekraanikuvalt täisekraanile lülitamine"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sisend"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Sisendkeele vahetamine (järgmine keel)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Sisendkeele vahetamine (eelmine keel)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Järgmisele keelele lülitamine"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Eelmisele keelele lülitamine"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Juurdepääs emotikonile"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Juurdepääs häälsisestusele"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Rakendused"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Abi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauser (vaikimisi Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktid"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (vaikimisi Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muusika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index b5a12cf..fe04218 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> botoia"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Hasiera"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atzera"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gora"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Behera"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ezkerrera"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Eskuinera"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Erdiratu"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Zuriunea"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Jakinarazpenak"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Lasterbideak"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Aldatu tekl. diseinua"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Garbitu testua"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Lasterbideak"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Bilatu lasterbideak"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ez da aurkitu lasterbiderik"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Sarrera"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Irekitako aplikazioak"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Uneko aplikazioa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Atzitu jakinarazpenen panela"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Atera pantaila osoaren argazki bat"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Atzitu sistemaren edo aplikazioetarako lasterbideen zerrenda"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atzera: itzuli aurreko egoerara (atzera egiteko botoia)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Atzitu hasierako pantaila"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ikusi irekitako aplikazioen ikuspegi orokorra"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Joan azkenaldian erabilitako aplikazio batetik bestera (aurrera)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Joan azkenaldian erabilitako aplikazio batetik bestera (atzera)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Atzitu aplikazio guztien zerrenda eta bilatu (adibidez, bilatzeko aukeraren edo Exekutatzeko tresna aplikazioaren bidez)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ezkutatu eta erakutsi (berriro) zereginen barra"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Atzitu sistemaren ezarpenak"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Atzitu Google-ren Laguntzailea"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ikusi jakinarazpenak"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Atera pantaila-argazki bat"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Erakutsi lasterbideak"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Egin atzera"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Joan hasierako pantailara"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ikusi azkenaldiko aplikazioak"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Ikusi azken aplikazioak banan-banan (aurrerantz)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Ikusi azken aplikazioak banan-banan (atzerantz)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ireki aplikazioen zerrenda"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Erakutsi zereginen barra"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ireki ezarpenak"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ireki Laguntzailea"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blokeatu pantaila"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ireki Oharrak aplikazioa oharrak bizkor idazteko"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ireki oharrak"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Zereginen aldibereko sistemaren exekuzioa"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Sartu pantaila zatituaren eskuineko aldean uneko aplikazioarekin"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Sartu pantaila zatituaren ezkerreko aldean uneko aplikazioarekin"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Aldatu pantaila zatitutik pantaila osora"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Pantaila zatituan zaudela: ordeztu aplikazio bat beste batekin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Sartu pantaila zatituaren eskuineko aldean oraingo aplikazioarekin"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Sartu pantaila zatituaren ezkerreko aldean oraingo aplikazioarekin"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Aldatu pantaila zatitutik pantaila osora"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Sarrera"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Aldatu idazteko hizkuntza (hurrengo hizkuntza)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Aldatu idazteko hizkuntza (aurreko hizkuntza)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Aldatu hurrengo hizkuntzara"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Aldatu aurreko hizkuntzara"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Atzitu emojiak"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Atzitu ahozko idazketa"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikazioak"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Laguntzailea"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Ireki arakatzailea (Chrome, modu lehenetsian)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Laguntzailea"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Arakatzailea"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktuak"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Ireki posta elektronikoa (Gmail, modu lehenetsian)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Posta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMSak"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 055ea3b..2f17835 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"دکمه <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ابتدا"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"برگشت"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"بالا"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"پایین"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"چپ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"راست"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"مرکز"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اعلانها"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"میانبرهای صفحهکلید"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تغییر جانمایی صفحهکلید"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"پاک کردن نوشتار"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"میانبرها"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"جستجوی میانبرها"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"میانبری پیدا نشد"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ورودی"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"باز کردن برنامهها"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"برنامه فعلی"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"دسترسی به کشوی اعلانات"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"گرفتن نماگرفت کامل"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"دسترسی به فهرست میانبرهای برنامهها / سیستم"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"برگشت: برگشتن به وضعیت قبلی (دکمه برگشت)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"دسترسی به صفحه اصلی"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"نمای کلی برنامههای باز"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"چرخش میان برنامههای اخیر (جلو)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"چرخش میان برنامههای اخیر (عقب)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"دسترسی به فهرست همه برنامهها و جستجو (یعنی «جستجو»/ «راهانداز»)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"پنهان کردن و نمایش مجدد نوار وظیفه"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"دسترسی به تنظیمات سیستم"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"دسترسی به «دستیار Google»"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"مشاهده اعلانها"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"گرفتن نماگرفت"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"نمایش میانبرها"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"برگشتن"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"رفتن به صفحه اصلی"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"مشاهده برنامههای اخیر"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"چرخش به جلو در برنامههای اخیر"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"چرخش به عقب در برنامههای اخیر"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"باز کردن فهرست برنامهها"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"نمایش نوار وظیفه"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"باز کردن تنظیمات"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"باز کردن «دستیار»"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"قفل صفحه"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"برای یادداشت سریع، برنامه «یادداشتها» را بالا بکشید"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"باز کردن یادداشتها"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"چندوظیفگی سیستم"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"جابهجایی از صفحهٔ دونیمه به تمام صفحه"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"درحین صفحهٔ دونیمه: برنامهای را با دیگری جابهجا میکند"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت راست"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"وارد شدن به صفحهٔ دونیمه با برنامه فعلی در سمت چپ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"جابهجایی از صفحهٔ دونیمه به تمام صفحه"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"درحین صفحهٔ دونیمه: برنامهای را با دیگری جابهجا میکند"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ورودی"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"تغییر زبان ورودی (زبان بعدی)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"تغییر زبان ورودی (زبان قبلی)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"رفتن به زبان بعدی"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"رفتن به زبان قبلی"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"دسترسی به اموجی"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"دسترسی به تایپ صوتی"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"برنامهها"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"دستیار"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"مرورگر (Chrome بهعنوان پیشفرض)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"دستیار"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"مرورگر"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"مخاطبین"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ایمیل (Gmail بهعنوان پیشفرض)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ایمیل"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"پیامک"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"تقویم"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 82e5231..d1bd05b 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Painike <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Takaisin"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Ylös"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Alas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vasemmalle"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Oikealle"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Keskelle"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Välilyönti"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ilmoitukset"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pikanäppäimet"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Vaihda näppäimistöasettelu"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Tyhjennä teksti"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pikanäppäimet"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Hae pikanäppäimiä"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Pikanäppäimiä ei löytynyt"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Syöttötapa"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Avoimet"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Sovelluslista"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Käytä ilmoitusaluetta"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ota kuvakaappaus"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Käytä järjestelmän ja sovellusten pikakuvakkeita"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Takaisin: siirry takaisin edelliseen tilaan (takaisin-painike)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Käytä aloitusnäyttöä"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Avointen sovellusten yleiskatsaus"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Selaa viimeaikaisia sovelluksia (eteenpäin)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Selaa viimeaikaisia sovelluksia (takaisin)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Sovellusten ja haun luettelon käyttö (esim. Haku/Käynnistysohjelma)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Piilota ja tuo tehtäväpalkki näkyviin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Käytä järjestelmäasetuksia"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Käytä Google Assistantia"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Katso ilmoitukset"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ota kuvakaappaus"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Näytä pikakuvakkeet"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Takaisin"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Siirry aloitusnäytölle"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Katso viimeisimmät sovellukset"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Siirry eteenpäin viimeaikaisten sovellusten kautta"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Siirry takaisin viimeaikaisten sovellusten kautta"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Avaa sovelluslista"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Näytä tehtäväpalkki"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Avaa asetukset"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Avaa Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lukitusnäyttö"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Avaa muistiinpanosovellus pikaisia merkintöjä varten"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Avaa muistiinpanot"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Järjestelmän monikäyttö"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vaihda jaetusta näytöstä koko näyttöön"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Siirry jaettuun näyttöön (sovellus oikeanpuoleiseen näyttöön)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Siirry jaettuun näyttöön (sovellus vasemmanpuoleiseen näyttöön)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Vaihda jaetusta näytöstä koko näyttöön"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Jaetun näytön aikana: korvaa sovellus toisella"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Syöttötapa"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Vaihda syöttökieli (seuraava kieli)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Vaihda syöttökieli (edellinen kieli)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Vaihda seuraavaan kieleen"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Vaihda aiempaan kieleen"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojin käyttö"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Puhekirjoituksen käyttö"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Sovellukset"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Apusovellus"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Selain (oletuksena Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Selain"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Yhteystiedot"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Sähköposti (oletuksena Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Sähköposti"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Tekstiviesti"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiikki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenteri"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 619c7f8..bcf0e96 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Précédent"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Haut"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Bas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Gauche"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Droite"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrer"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espace"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer la disposition du clavier"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Effacer le texte"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Raccourcis"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Recherchez des raccourcis"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Aucun raccourci trouvé"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrée"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ouvrir applis"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Appli actuelle"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accéder au volet de notification"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Prendre une capture d\'écran complète"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accéder à la liste des raccourcis du système/des applications"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Retour : retour à l\'état précédent (bouton précédent)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accéder à l\'écran d\'accueil"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Aperçu des applications ouvertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcourir les applications récentes (avancer)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcourir les applications récentes (retour)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accéder à la liste des applis et à la recherche (recherche/lanceur)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Masquer et (ré)afficher la barre des tâches"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accéder aux paramètres système"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accéder à l\'Assistant Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Afficher les notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Prendre une capture d\'écran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afficher les raccourcis"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Retour"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Aller à l’écran d’accueil"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Afficher les applications récentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcourir les applications récentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcourir les applications récentes en sens inverse"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste des applications"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Écran de verrouillage"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ouvrir l\'application de prise de notes pour prendre des notes rapides"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ouvrir les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitâche du système"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Passer à l\'écran partagé avec l\'application actuelle à droite"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Passer à l\'écran partagé avec l\'application actuelle à gauche"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passer de l\'écran partagé au plein écran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En mode d\'écran partagé : remplacer une application par une autre"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer à l\'écran divisé avec l\'application actuelle à droite"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer à l\'écran divisé avec l\'application actuelle à gauche"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran divisé au plein écran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode d\'écran divisé : remplacer une application par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrée"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Changer la langue d\'entrée (langue suivante)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Changer la langue d\'entrée (langue précédente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passer à la langue précédente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accéder aux émojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accéder à l\'entrée vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navigateur (Chrome par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navigateur"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Courriel (Gmail par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Courriel"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Messages texte"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 9f22a57..6555f27 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Bouton <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Accueil"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Précédent"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Vers le haut"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Vers le bas"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vers la gauche"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Vers la droite"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Flèche vers le haut"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Flèche vers le bas"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Flèche vers la gauche"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Flèche vers la droite"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espace"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifications"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Raccourcis clavier"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Changer disposition du clavier"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Effacer le texte"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Effacer la requête de recherche"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Raccourcis"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Raccourcis de recherche"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Aucun raccourci trouvé"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Saisie"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Applis ouvertes"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Appli actuelle"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accéder au volet des notifications"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Prendre une capture d\'écran complète"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accéder à la liste des raccourcis d\'applis/système"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Retour : revenir à l\'état précédent (bouton Retour)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accéder à l\'écran d\'accueil"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Aperçu des applis ouvertes"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcourir les applis récentes (avancer)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcourir les applis récentes (reculer)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accéder à la liste d\'applis et rechercher (Recherche/Lanceur d\'applis)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Masquer et (ré)afficher la barre des tâches"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accéder aux paramètres système"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accéder à l\'Assistant Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Affichage des résultats de recherche"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Affichage des raccourcis système"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Affichage des raccourcis clavier"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Affichage des raccourcis pour ouvrir les applications"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Affichage des raccourcis pour l\'application actuelle"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Afficher les notifications"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Prendre une capture d\'écran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afficher les raccourcis"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Retour"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Accéder à l\'écran d\'accueil"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Afficher les applis récentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Aller vers les applications récentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Revenir sur les applications récentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste d\'applications"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ouvrir les paramètres"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Ouvrir l\'Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Verrouiller l\'écran"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tirer l\'appli de notes vers le haut pour une note rapide"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ouvrir les notes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitâche du système"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passer de l\'écran partagé au plein écran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En mode écran partagé : remplacer une appli par une autre"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Passer en écran partagé avec l\'appli actuelle affichée à droite"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Passer en écran partagé avec l\'appli actuelle affichée à gauche"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passer de l\'écran partagé au plein écran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Saisie"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Changer la langue de saisie (langue suivante)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Changer la langue de saisie (langue précédente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passer à la langue précédente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accéder aux emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accéder à la saisie vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistance"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Parcourir (Chrome par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navigateur"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacts"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail par défaut)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Messagerie"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musique"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index a7341b0..716fcf2 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botón <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Inicio"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Volver"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Arriba"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Abaixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dereita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espazo"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificacións"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atallos de teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambiar deseño do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Borrar o texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atallos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Buscar atallos"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Non se atoparon atallos"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Abrir aplicacións"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App actual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acceder ao panel despregable"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Facer captura de pantalla completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acceder á lista de atallos do sistema ou das aplicacións"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atrás: Volver ao estado anterior (botón Atrás)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acceder á pantalla de inicio"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visión xeral de aplicacións abertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer aplicacións recentes (adiante)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer aplicacións recentes (atrás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acceder á lista de apps e á busca (por exemplo, a Busca ou Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e volver mostrar barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acceder á configuración do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acceder ao Asistente de Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificacións"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Facer captura de pantalla"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atallos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Volver"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir á pantalla de inicio"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver aplicacións recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer aplicacións recentes cara adiante"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer aplicacións recentes cara atrás"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicacións"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configuración"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Asistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Abrir aplicación Notas para facer unha nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Activar pantalla dividida con esta aplicación no lado dereito"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Activar pantalla dividida con esta aplicación no lado esquerdo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Cambiar de pantalla dividida a pantalla completa"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Activar pantalla dividida con esta aplicación no lado dereito"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Activar pantalla dividida con esta aplicación no lado esquerdo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"En modo de pantalla dividida: Substituír unha aplicación por outra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambiar idioma de escritura (seguinte idioma)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambiar idioma de escritura (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar ao seguinte idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar ao idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acceder aos emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder á escritura por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicacións"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (predeterminado: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Correo electrónico (predeterminado: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Correo electrónico"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 2ca21c5..8379865 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"બટન <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"નોટિફિકેશન"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"કીબોર્ડ શૉર્ટકટ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"કીબોર્ડ લેઆઉટ સ્વિચ કરો"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ટેક્સ્ટ સાફ કરો"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"શૉર્ટકટ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"શૉર્ટકટ શોધો"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"કોઈ શૉર્ટકટ મળ્યો નથી"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ઇનપુટ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ઍપ ખોલો"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"હાલની ઍપ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"નોટિફિકેશન શેડ ઍક્સેસ કરો"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"કોઈ આખો સ્ક્રીનશૉટ લો"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"સિસ્ટમ / ઍપ્લિકેશન શૉર્ટકટની સૂચિ ઍક્સેસ કરો"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"પાછળ: પાછળની સ્થિતિ પર પાછા જાઓ (પાછળ બટન)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"હોમ સ્ક્રીન ઍક્સેસ કરો"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ખુલ્લી ઍપનો ઓવરવ્યૂ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"તાજેતરની ઍપ વચ્ચે સ્વિચ કરો (ફૉરવર્ડ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"તાજેતરની ઍપ વચ્ચે સ્વિચ કરો (પાછળ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"તમામ ઍપ અને શોધની સૂચિ (દા.ત. Search/Launcher) ઍક્સેસ કરો"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ટાસ્કબાર છુપાવો અને (ફરી) બતાવો"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"સિસ્ટમ સેટિંગ ઍક્સેસ કરો"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ઍક્સેસ કરો"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"નોટિફિકેશન જુઓ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"સ્ક્રીનશૉટ લો"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"શૉર્ટકટ બતાવો"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"પાછળ જાઓ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"હોમ સ્ક્રીન પર જાઓ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"તાજેતરની ઍપ જુઓ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"તાજેતરની ઍપ પર આગળ જાઓ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"તાજેતરની ઍપ પર પાછળ જાઓ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ઍપની સૂચિ ખોલો"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ટાસ્કબાર બતાવો"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"સેટિંગ ખોલો"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ખોલો"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"લૉક સ્ક્રીન"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ઝડપી મેમો માટે Notes ઍપ ખોલો"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"નોંધ ખોલો"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"સિસ્ટમ દ્વારા એકથી વધુ કાર્યો કરવા"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"જમણી બાજુ પર હાલની ઍપ વડે વિભાજિત સ્ક્રીન દાખલ કરો"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ડાબી બાજુ પર હાલની ઍપ વડે વિભાજિત સ્ક્રીન દાખલ કરો"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"જમણી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ડાબી બાજુ પર હાલની ઍપ સાથે વિભાજિત સ્ક્રીનમાં દાખલ થાઓ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"વિભાજિત સ્ક્રીનથી પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ઇનપુટ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ઇનપુટની ભાષા સ્વિચ કરો (આગલી ભાષા)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ઇનપુટની ભાષા સ્વિચ કરો (પાછલી ભાષા)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"આગલી ભાષા પર સ્વિચ કરો"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"પાછલી ભાષા પર સ્વિચ કરો"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ઇમોજી ઍક્સેસ કરો"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"વૉઇસ ટાઇપિંગ ઍક્સેસ કરો"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ઍપ્લિકેશનો"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"સહાય"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"બ્રાઉઝર (ડિફૉલ્ટ તરીકે Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"બ્રાઉઝર"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"સંપર્કો"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ઇમેઇલ (ડિફૉલ્ટ તરીકે Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ઇમેઇલ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"મ્યુઝિક"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 6a7d143..ab01d2b 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"बटन <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ऊपर तीर"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"नीचे तीर"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"बायां तीर"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"दायां तीर"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्य तीर"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाएं"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट बदलें"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"टेक्स्ट मिटाएं"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"शॉर्टकट"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"शॉर्टकट खोजें"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"कोई शॉर्टकट नहीं मिला"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"खुले हुए ऐप्लिकेशन"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"मौजूदा ऐप्लिकेशन"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"नोटिफ़िकेशन शेड को ऐक्सेस करें"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"पूरा स्क्रीनशॉट लें"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टम / ऐप्लिकेशन के शॉर्टकट की सूची ऐक्सेस करें"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"वापस जाएं: पिछली स्क्रीन पर वापस जाएं (\'वापस जाएं\' बटन)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रीन को ऐक्सेस करें"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"खुले हुए ऐप्लिकेशन की जानकारी"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन पर जाएं (सबसे पहले इस्तेमाल किए गए ऐप्लिकेशन सबसे पहले)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन पर जाएं (सबसे हाल के ऐप्लिकेशन सबसे पहले)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सभी ऐप्लिकेशन और की गई खोजों की सूची ऐक्सेस करें (जैसे, Search/लॉन्चर)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार छिपाएं और (फिर से) दिखाएं"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टम की सेटिंग ऐक्सेस करें"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant को ऐक्सेस करें"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाएं देखें"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट लें"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दिखाएं"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"वापस जाएं"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीन पर जाएं"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के अगले पेज पर जाएं"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के पिछले पेज पर जाएं"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ऐप्लिकेशन की सूची खोलें"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दिखाएं"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग खोलें"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Google Assistant खोलें"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"तेज़ी से मेमो बनाने के लिए Notes ऐप्लिकेशन का इस्तेमाल करें"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes ऐप्लिकेशन खोलें"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टम मल्टीटास्किंग"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"मौजूदा ऐप्लिकेशन को स्प्लिट स्क्रीन की मदद से दाईं ओर ले जाएं"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"मौजूदा ऐप्लिकेशन को स्प्लिट स्क्रीन की मदद से बाईं ओर ले जाएं"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर जाएं"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे से बदलें"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को दाईं ओर ले जाएं"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को बाईं ओर ले जाएं"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करें"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा बदलें (अगली भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा बदलें (पिछली भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करें"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"इस्तेमाल की गई पिछली भाषा पर स्विच करें"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी ऐक्सेस करें"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"बोली को लिखाई में बदलने की सुविधा ऐक्सेस करें"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ऐप्लिकेशन"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"सहायक"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउज़र (डिफ़ॉल्ट के तौर पर Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउज़र"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"संपर्क"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ईमेल (डिफ़ॉल्ट के तौर पर Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ईमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"मैसेज (एसएमएस) करें"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 4469d78..7584e8a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tipka <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Početak"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Natrag"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gore"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dolje"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Lijevo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Razmaknica"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obavijesti"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tipkovni prečaci"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Promjena rasporeda tipkovnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ukloni tekst"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Prečaci"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pretražite prečace"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nema nijednog prečaca"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Unos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvaranje aplikacija"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutačna aplikacija"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pristupanje zaslonu obavijesti"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Izrada snimke cijelog zaslona"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pristupanje popisu prečaca sustava/aplikacija"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Natrag: povratak na prethodno stanje (gumb za natrag)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pristupanje početnom zaslonu"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled otvorenih aplikacija"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pregledavanje nedavnih aplikacija (unaprijed)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pregledavanje nedavnih aplikacija (unatrag)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Pristupanje popisu svih aplikacija i pretraživanja (npr. Pretraživanje/Pokretač)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sakrivanje i (ponovno) prikazivanje trake sa zadacima"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pristupanje postavkama sustava"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pristupanje Google asistentu"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Prikaži obavijesti"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Snimi zaslon"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaži prečace"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Natrag"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Idi na početni zaslon"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Prikaži nedavne aplikacije"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kruži unaprijed kroz nedavne aplikacije"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kruži unatrag kroz nedavne aplikacije"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvori popis aplikacija"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokaži traku sa zadacima"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvori postavke"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvori Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaključavanje zaslona"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Izvlačenje aplikacije Bilješke za brzu bilješku"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvori bilješke"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Obavljanje više zadataka sustava"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Otvorite podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Otvorite podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prijelaz s podijeljenog zaslona na cijeli zaslon"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tijekom podijeljenog zaslona: zamijenite aplikaciju drugom"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s desne strane"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Otvori podijeljeni zaslon s trenutačnom aplikacijom s lijeve strane"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prijeđi s podijeljenog zaslona na cijeli zaslon"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Unos"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Prebacivanje jezika unosa (sljedeći jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Prebacivanje jezika unosa (prethodni jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prijeđi na sljedeći jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prijeđi na prethodni jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pristupanje emojijima"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pristupanje unosu teksta govorom"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoć"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Preglednik (Chrome kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Preglednik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (Gmail kao zadani)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glazba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 51c3932..85fe455 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> gomb"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Kezdőképernyő"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Vissza"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Fel"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Le"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Balra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Jobbra"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Középre"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Szóköz"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Értesítések"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Billentyűkódok"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Billentyűzetkiosztás váltása"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Szöveg törlése"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Billentyűparancsok"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Billentyűparancs keresése"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nincs billentyűparancs"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Bevitel"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Futó appok"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuális app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Ugrás az értesítési felületre"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Teljes képernyőkép készítése"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Ugrás a rendszer-/alkalmazás-parancsikonok listájához"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Vissza: visszaváltás az előző állapotra (vissza gomb)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ugrás a kezdőképernyőre"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Megnyitott alkalmazások áttekintése"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Lépegetés a legutóbbi appok között (előre)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Lépegetés a legutóbbi appok között (visszafelé)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Ugrás az összes app listájához és a kereséshez (pl. Kereső/Indító)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Elrejtés és a feladatsáv (újbóli) megjelenítése"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Ugrás a rendszerbeállításokhoz"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Ugrás a Google Segédhez"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Értesítések megtekintése"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Képernyőkép készítése"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Parancsikonok megjelenítése"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Vissza"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ugrás a kezdőképernyőre"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Legutóbbi alkalmazások megtekintése"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lépegetés előrefelé a legutóbbi alkalmazások között"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Lépegetés visszafelé a legutóbbi alkalmazások között"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Alkalmazáslista megnyitása"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Feladatsáv megjelenítése"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Beállítások megnyitása"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"A Segéd megnyitása"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lezárási képernyő"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"A jegyzetkészítő app megnyitása gyors feljegyzés készítéséhez"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Jegyzetek megnyitása"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Rendszermultitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Osztott képernyő aktiválása, az aktuális app kerüljön jobbra"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Osztott képernyő aktiválása, az aktuális app kerüljön balra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Váltás osztott képernyőről teljes képernyőre"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Osztott képernyőn: az egyik app lecserélése egy másikra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön jobbra"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Osztott képernyő aktiválása; az aktuális alkalmazás kerüljön balra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Váltás osztott képernyőről teljes képernyőre"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Bevitel"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Beviteli nyelv váltása (következő nyelv)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Beviteli nyelv váltása (előző nyelv)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Váltás a következő nyelvre"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Váltás az előző nyelvre"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Ugrás az emojikhoz"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ugrás a hangvezérelt íráshoz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Alkalmazások"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Segédalkalmazás"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Böngésző (alapértelmezés szerint: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Segéd"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Böngésző"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Névjegyek"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail-alkalmazás (alapértelmezés szerint: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-üzenetek"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Zene"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Naptár"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 917fb77..5be6a87 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> կոճակ"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Գլխավոր էջ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Հետ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Վերև"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ներքև"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ձախ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Աջ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Կենտրոն"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Բացատ"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Ծանուցումներ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ստեղնային դյուրանցումներ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Դասավորության փոխարկում"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Ջնջել տեքստը"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Դյուրանցումներ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Դյուրանցումների որոնում"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Դյուրանցումներ չեն գտնվել"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ներածում"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Բաց հավելվածներ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Այս հավելվածը"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Բացել ծանուցումների վահանակը"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ստեղծել ամբողջ էկրանի սքրինշոթ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Բացել համակարգի/հավելվածների դյուրանցումների ցանկը"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Վերադառնալ նախկին վիճակին («Հետ» կոճակ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Բացել հիմնական էկրանը"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Բաց հավելվածների համատեսք"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Դիտել վերջին հավելվածները (սովորական հերթականությամբ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Դիտել վերջին հավելվածները (հակառակ հերթականությամբ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Բացել բոլոր հավելվածների և որոնումների (օր.՝ Որոնում/Գործարկիչ) ցանկը"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Թաքցնել և (նորից) ցուցադրել հավելվածների վահանակը"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Բացել համակարգի կարգավորումները"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Գործարկել Google Օգնականը"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Դիտել ծանուցումները"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Սքրինշոթ անել"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ցույց տալ դյուրանցումները"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Հետ գնալ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Անցնել հիմնական էկրան"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Դիտել վերջին հավելվածները"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Առաջ անցնել վերջին հավելվածների միջով"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Հետ անցնել վերջին հավելվածների միջով"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Բացել հավելվածների ցանկը"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ցուցադրել հավելվածների վահանակը"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Բացել կարգավորումները"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Բացել Օգնականը"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Կողպէկրան"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Բացել «Նշումներ» հավելվածը՝ արագ նշում ստեղծելու համար"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Բացել նշումները"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Համակարգի բազմախնդրության ռեժիմ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածն աջ կողմում"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Միացնել էկրանի տրոհումը՝ ընթացիկ հավելվածը ձախ կողմում"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Տրոհված էկրանից անցնել լիաէկրան ռեժիմ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ներածում"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Անցնել ներածման հաջորդ լեզվին"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Անցնել ներածման նախորդ լեզվին"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Անցնել հաջորդ լեզվին"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Անցնել նախորդ լեզվին"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Բացել էմոջիները"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ակտիվացնել ձայնային ներածումը"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Հավելվածներ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Օգնություն"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Դիտարկիչ (Chrome-ը որպես կանխադրված)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Օգնական"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Դիտարկիչ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Կոնտակտներ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Էլփոստ (Gmail-ը որպես կանխադրված)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Էլփոստ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Երաժշտություն"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Օրացույց"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 83db83b..8d372dc 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tombol <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifikasi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan keyboard"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ganti tata letak keyboard"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Hapus teks"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pintasan"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pintasan penelusuran"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tidak ditemukan pintasan"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Aplikasi yang terbuka"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplikasi saat ini"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Akses menu notifikasi"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ambil screenshot penuh"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Akses daftar sistem/pintasan aplikasi"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Kembali: kembali ke status sebelumnya (tombol kembali)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Akses layar utama"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ringkasan aplikasi yang terbuka"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Berpindah-pindah antara aplikasi terbaru (maju)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Berpindah-pindah antara aplikasi terbaru (mundur)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Akses daftar semua aplikasi dan penelusuran (yaitu Penelusuran/Peluncur)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sembunyikan dan tampilkan (kembali) taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Akses setelan sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Akses Asisten Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Lihat notifikasi"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ambil screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tampilkan pintasan"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kembali"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Buka layar utama"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Lihat aplikasi terbaru"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Menavigasi maju pada aplikasi terbaru"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Menavigasi mundur pada aplikasi terbaru"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka daftar aplikasi"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tampilkan taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka setelan"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Asisten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci layar"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Buka aplikasi Catatan untuk memo cepat"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buka catatan"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Masuk ke Layar terpisah dengan aplikasi saat ini ke RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Masuk ke Layar terpisah dengan aplikasi saat ini ke LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Beralih dari Layar terpisah ke layar penuh"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Dalam Layar terpisah: ganti dari satu aplikasi ke aplikasi lainnya"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk ke layar terpisah dengan aplikasi saat ini ke RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk ke layar terpisah dengan aplikasi saat ini ke LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih dari layar terpisah ke layar penuh"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Beralih bahasa input (bahasa berikutnya)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Beralih bahasa input (bahasa sebelumnya)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih ke bahasa berikutnya"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Beralih ke bahasa sebelumnya"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Akses emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Akses dikte"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikasi"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bantuan"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome sebagai default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asisten"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontak"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail sebagai default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index bf0b73d..102e8b8 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Hnappur <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Til baka"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Upp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Niður"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vinstri"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Hægri"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Ör upp"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Ör niður"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Ör til vinstri"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Ör til hægri"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Miðja"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Bilslá"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Tilkynningar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Flýtilyklar"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Skipta um lyklaskipan"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Hreinsa texta"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"eða"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Hreinsa leitarfyrirspurn"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Flýtileiðir"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Leita að flýtileiðum"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Engar flýtileiðir fundust"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Innsláttur"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Opna forrit"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Gildandi forrit"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Opna tilkynningaglugga"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Taka heildarskjámynd"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Opna lista yfir flýtileiðir fyrir kerfi/forrit"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Til baka: Fara til baka í fyrri stöðu (bakkhnappur)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Opna heimaskjá"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Yfirlit yfir opin forrit"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Fletta í gegnum nýleg forrit (áfram)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Fletta í gegnum nýleg forrit (til baka)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Opna lista yfir öll forrit og leit (þ.e. Leit/Ræsiforrit)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fela og sýna (aftur) forritastiku"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Opna kerfisstillingar"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Opna Google-hjálpara"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Sýnir leitarniðurstöður"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Sýnir flýtileiðir fyrir kerfi"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Sýnir flýtileiðir fyrir innslátt"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Sýnir flýtileiðir til að opna forrit"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Sýnir flýtileiðir fyrir núverandi forrit"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Skoða tilkynningar"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Taka skjámynd"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Sýna flýtilykla"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Til baka"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Opna heimaskjáinn"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Skoða nýleg forrit"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Fletta áfram í gegnum nýleg forrit"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Fletta aftur á bak í gegnum nýleg forrit"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Opna forritalista"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Sýna forritastiku"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Opna stillingar"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Opna Hjálpara"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lásskjár"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Opna glósuforrit til að skrá minnispunkt á fljótlegan hátt"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Opna glósur"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Fjölvinnsla kerfis"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skipta úr skjáskiptingu yfir í allan skjáinn"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Opna skjáskiptingu hægra megin með núverandi forriti"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Opna skjáskiptingu vinstra megin með núverandi forriti"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Skipta úr skjáskiptingu yfir á allan skjáinn"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Í skjáskiptingu: Skipta forriti út fyrir annað forrit"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Innsláttur"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Breyta innsláttartungumáli (næsta tungumál)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Breyta innsláttartungumáli (fyrra tungumál)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Skipta yfir í næsta tungumál"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Skipta yfir í fyrra tungumál"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Opna emoji-tákn"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Opna raddinnslátt"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Forrit"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Aðstoð"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Vafri (Chrome sem sjálfgefinn)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Hjálpari"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Vafri"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Tengiliðir"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Tölvupóstur (Gmail sem sjálfgefinn)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Tölvupóstur"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS-skilaboð"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Tónlist"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Dagatal"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index e65e3aa..aad1e56 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Pulsante <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home page"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Indietro"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Su"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Giù"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sinistra"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Destra"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Al centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spazio"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notifiche"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Scorciatoie da tastiera"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Cambia layout della tastiera"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Cancella testo"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Scorciatoie"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cerca scorciatoie"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Scorciatoie non trovate"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inserimento"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"App aperte"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App corrente"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accedi all\'area notifiche"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Acquisisci uno screenshot completo"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accedi all\'elenco di scorciatoie app e di sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Indietro: torna allo stato precedente (pulsante Indietro)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accedi alla schermata Home"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Panoramica delle app aperte"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Scorri le app recenti (in avanti)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Scorri le app recenti (a ritroso)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accedi all\'elenco di tutte le app e alla ricerca (Ricerca/Avvio app)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Nascondi e mostra di nuovo la barra delle app"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accedi alle impostazioni di sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accedi all\'Assistente Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Visualizza notifiche"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Acquisisci screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostra scorciatoie"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Indietro"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Vai alla schermata Home"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Visualizza app recenti"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Spostati avanti tra le app recenti"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Spostati indietro tra le app recenti"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Apri elenco di app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostra barra delle app"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Apri impostazioni"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Apri l\'assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blocca lo schermo"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Visualizza l\'app Note per appunti rapidi"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Apri note"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking di sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Passa da schermo diviso a schermo intero"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Attiva lo schermo diviso con l\'app corrente a destra"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inserimento"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Cambia lingua di inserimento (lingua successiva)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Cambia lingua di inserimento (lingua precedente)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla prossima lingua"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passa alla lingua precedente"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accedi all\'emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accedi alla digitazione vocale"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applicazioni"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistenza"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (quello predefinito è Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatti"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (l\'app predefinita è Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musica"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendario"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index a14aa1b..bbfbe32 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"לחצן <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"דף הבית"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"הקודם"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"למעלה"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"למטה"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"שמאלה"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ימינה"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"חץ למעלה"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"חץ למטה"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"חץ שמאלה"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"חץ ימינה"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"מרכז"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"רווח"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"התראות"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"מקשי קיצור במקלדת"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"החלפה של פריסת מקלדת"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"מחיקת הטקסט"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"או"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"ניקוי שאילתת החיפוש"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"מקשי קיצור"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"חיפוש מקשי קיצור"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"לא נמצאו מקשי קיצור"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"קלט"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"פתיחת אפליקציות"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"האפליקציה הנוכחית"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"גישה ללוח ההתראות"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ביצוע צילום מסך מלא"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"גישה לרשימת מקשי קיצור של המערכת/אפליקציות"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"חזרה: חזרה למצב הקודם (לחצן \'הקודם\')"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"גישה למסך הבית"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"סקירה כללית של האפליקציות הפתוחות"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"דפדוף בין האפליקציות האחרונות (קדימה)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"דפדוף בין האפליקציות האחרונות (לאחור)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"גישה לרשימת כל האפליקציות ולחיפוש (כלומר חיפוש/מרכז האפליקציות)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"הסתרה והצגה (מחדש) של סרגל האפליקציות"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"גישה להגדרות המערכת"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"גישה ל-Google Assistant"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"מוצגות: תוצאות החיפוש"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"מוצגים: קיצורי הדרך של המערכת"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"מוצגים: קיצורי הדרך של הקלט"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"מוצגים: קיצורי הדרך לפתיחת אפליקציות"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"מוצגים: קיצורי הדרך של האפליקציה הנוכחית"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"הצגת הודעות"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"צילום המסך"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"הצגת מקשי הקיצור"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"חזרה"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"מעבר למסך הבית"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"הצגת האפליקציות האחרונות"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"דפדוף קדימה באפליקציות האחרונות"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"דפדוף אחורה באפליקציות האחרונות"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"פתיחה של רשימת האפליקציות"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"הצגת סרגל האפליקציות"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"פתיחת ההגדרות"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"לפתיחת Google Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"מסך הנעילה"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"אפשר למשוך למעלה את אפליקציית הפתקים לשימוש מהיר"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"פתיחה של אפליקציית הפתקים"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ריבוי משימות מערכת"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"החלפה ממסך מפוצל למסך מלא"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"כניסה למסך מפוצל עם האפליקציה הנוכחית ל-LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"החלפה ממסך מפוצל למסך מלא"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"קלט"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"החלפת שפת הקלט (השפה הבאה)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"החלפת שפת הקלט (השפה הקודמת)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"מעבר לשפה הבאה"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"מעבר לשפה הקודמת"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"גישה לאמוג\'י"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"גישה להכתבה בקול"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"אפליקציות"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"אסיסטנט"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"דפדפן (Chrome כברירת מחדל)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"דפדפן"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"אנשי קשר"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"אימייל (Gmail כברירת מחדל)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"אימייל"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"מוזיקה"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"יומן"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 75166d9..c8a0a54 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> ボタン"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"戻る"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中央"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"キーボード ショートカット"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"キーボード レイアウトの切り替え"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"テキストを消去"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ショートカット"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ショートカットの検索"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ショートカットがありません"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"入力"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"開いているアプリ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"現在のアプリ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"通知シェードにアクセス"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"フル スクリーンショットを撮影"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"システム / アプリのショートカットの一覧にアクセス"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"戻る: 前の状態に戻る([戻る] ボタン)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ホーム画面にアクセス"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"開いているアプリの概要"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"最近使ったアプリを切り替え(進む)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"最近使ったアプリを切り替え(戻る)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"すべてのアプリの一覧にアクセスして検索(検索 / ランチャー)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"タスクバーを非表示 /(再)表示"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"システム設定にアクセス"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google アシスタントにアクセス"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"お知らせを表示する"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"スクリーンショットを撮る"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ショートカットを表示する"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"戻る"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ホーム画面に移動する"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"最近使ったアプリを表示する"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"最近使ったアプリを確認する"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"最近使ったアプリを確認する(逆方向)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"アプリの一覧を開く"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"タスクバーを表示する"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"設定を開く"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"アシスタントを開く"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"画面をロック"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"クイックメモのためにメモアプリを表示"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"メモを開く"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"システム マルチタスク"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"分割画面にして現在のアプリを右側に設定"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"分割画面にして現在のアプリを左側に設定"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"分割画面から全画面に切り替え"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"分割画面中: アプリを順に置換"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"分割画面にして現在のアプリを右側に設定する"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"分割画面にして現在のアプリを左側に設定する"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"分割画面から全画面に切り替える"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"分割画面中: アプリを順に置換する"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"入力"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"入力言語を切り替え(次の言語)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"入力言語を切り替え(前の言語)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"次の言語に切り替える"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"前の言語に切り替える"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"絵文字にアクセス"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"音声入力にアクセス"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"アプリ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"アシスト"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ブラウザ(デフォルト: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"アシスタント"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ブラウザ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"連絡先"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"メール(デフォルト: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"メール"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音楽"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"カレンダー"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index b363f99..c6c4a57 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ღილაკი „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"უკან"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ზემოთ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ქვემოთ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"მარცხნივ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"მარჯვნივ"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"ზემოთ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"ქვემოთ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"მარცხნივ მიმართული ისარი"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"მარჯვნივ მიმართული ისარი"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ცენტრში"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"შორისი"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"შეტყობინებები"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"კლავიატურის მალსახმობები"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"კლავიატურის განლაგების გადართვა"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ტექსტის გასუფთავება"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ან"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"საძიებო ფრაზის გასუფთავება"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"მალსახმობები"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"მალსახმობების ძიება"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"მალსახმობები ვერ მოიძებნა"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"შეყვანა"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ღია აპები"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"მიმდინარე აპი"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"შეტყობინებების ფარდაზე წვდომა"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"სრული ეკრანის ანაბეჭდის გადაღება"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"სისტემის / აპების მალსახმობებზე წვდომის სია"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"უკან: წინა მდგომარეობაში დაბრუნება (უკან გადასვლის ღილაკი)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"მთავარ ეკრანზე წვდომა"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ღია აპების მიმოხილვა"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ბოლო აპების გადახედვა (წინ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ბოლო აპების გადახედვა (უკან)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ყველა აპსა და ძიებაზე წვდომის სია (ე.ი. Search/გამშვები)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ამოცანათა ზოლის დამალვა და ჩვენება (განმეორებით ჩვენება)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"სისტემის პარამეტრებზე წვდომა"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google ასისტენტზე წვდომა"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"ნაჩვენებია ძიების შედეგები"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"ნაჩვენებია სისტემის მალსახმობები"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"ნაჩვენებია შენატანის მალსახმობები"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"ნაჩვენებია მალსახმობები, რომლებიც ხსნის აპებს"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"ნაჩვენებია მალსახმობები მიმდინარე აპისთვის"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"შეტყობინებების ნახვა"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ეკრანის ანაბეჭდის გადაღება"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"მალსახმობების ჩვენება"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"უკან დაბრუნება"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"მთავარ ეკრანზე გადასვლა"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ბოლო აპების ნახვა"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"წინ გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"უკან გადასვლა ბოლოდროინდელი აპების მეშვეობით"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"აპების სიის გახსნა"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ამოცანათა ზოლის ჩვენება"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"პარამეტრების გახსნა"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ასისტენტის გახსნა"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ჩაკეტილი ეკრანი"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ჩანიშვნების აპის ამოწევა სწრაფი ჩანაწერისთვის"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ჩანიშვნების გახსნა"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"სისტემის მრავალამოცანიანი რეჟიმი"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით RHS-ში"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ეკრანის გაყოფის შეყვანა მიმდინარე აპით LHS-ში"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"გადართვა ეკრანის გაყოფიდან სრულ ეკრანზე"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"შეყვანა"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"შეყვანის ენის შეცვლა (შემდეგი ენა)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"შეყვანის ენის შეცვლა (წინა ენა)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"შემდეგ ენაზე გადართვა"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"წინა ენაზე გადართვა"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"emoji-ზე წვდომა"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ხმოვან აკრეფაზე წვდომა"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"აპლიკაციები"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"დახმარება"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ბრაუზერი (Chrome ნაგულისხმევად)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ასისტენტი"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ბრაუზერი"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"კონტაქტები"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ელფოსტა (Gmail ნაგულისხმევად)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ელფოსტა"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"მუსიკა"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"კალენდარი"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index b887e4b..2831cf9 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> түймесі"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Артқа"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Жоғары"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Төмен"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Сол"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Оң"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Орталық"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Бос орын"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Хабарландырулар"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Перне тіркесімдері"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Пернетақта форматын ауыстыру"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Мәтінді өшіру"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Перне тіркесімдері"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Перне тіркесімдерін іздеу"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Перне тіркесімдері табылмады."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Енгізу"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ашылған қолданбалар"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Ағымдағы қолданба"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Хабарландыру тақтасына кіру"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Толық экранның скриншотын жасау"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Жүйе / қолданба таңбашаларының тізімін пайдалану"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Артқа: алдыңғы күйге қайтару (артқа түймесі)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Негізгі экранға кіру"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ашылған қолданбаларға шолу"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Соңғы пайдаланылған қолданбаларды қарап шығу (алға)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Соңғы пайдаланылған қолданбаларды қарап шығу (артқа)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Барлық қолданба мен іздеу нәтижесі тізімін (яғни Search/Launcher) пайдалану"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Тапсырмалар жолағын жасыру және (қайта)көрсету"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Жүйе параметрлеріне кіру"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant-ке кіру"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Хабарландыруларды көру"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Скриншот жасау"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Жылдам пәрмендерді көрсету"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Артқа"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Негізгі экранға өту"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Соңғы қолданбаларды көру"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңғы қолданбаларға алға өту"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңғы қолданбаларға артқа өту"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Қолданбалар тізімін ашу"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапсырмалар жолағын көрсету"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерді ашу"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant-ті ашу"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды құлыптау"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Жылдам ескертпе жасау үшін ескертпелер қолданбасын ашу"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Ескертпелерді ашу"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Жүйе мультитаскингі"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Ағымдағы қолданбамен оң жаққа қарай экранды бөлу режиміне кіру"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Ағымдағы қолданбамен сол жаққа қарай экранды бөлу режиміне кіру"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Экранды бөлу режимінен толық экран режиміне ауысу"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Экранды бөлу кезінде: бір қолданбаны басқасына ауыстыру"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны оңға орналастыру)"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Бөлінген экран режиміне кіру (ағымдағы қолданбаны солға орналастыру)"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Бөлінген экран режимінен толық экран режиміне ауысу"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Енгізу"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Енгізу тілін (келесі тіл) ауыстыру"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Енгізу тілін (алдыңғы тіл) ауыстыру"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Келесі тілге ауысу"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Алдыңғы тілге ауысу"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Эмоджи пайдалану"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Дауыспен теру функциясын пайдалану"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Қолданбалар"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Көмекші"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузер (әдепкісінше Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контактілер"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электрондық пошта (әдепкісінше Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электрондық пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Мәтіндік хабар"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mузыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Күнтізбе"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 0a4c2d8..aff6ef7 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ប៊ូតុង <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ការជូនដំណឹង"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ផ្លូវកាត់ក្ដារចុច"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ប្ដូរប្លង់ក្ដារចុច"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"សម្អាតអក្សរ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ផ្លូវកាត់"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ស្វែងរកផ្លូវកាត់"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"រកផ្លូវកាត់មិនឃើញទេ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"បញ្ចូល"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"កម្មវិធីដែលបើក"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"កម្មវិធីបច្ចុប្បន្ន"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ចូលប្រើប្រាស់ផ្ទាំងជូនដំណឹង"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ថតរូបថតអេក្រង់ពេញ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ចូលប្រើប្រាស់បញ្ជីប្រព័ន្ធ/ផ្លូវកាត់កម្មវិធី"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ថយក្រោយ៖ ត្រឡប់ទៅស្ថានភាពពីមុនវិញ (ប៊ូតុងថយក្រោយ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ចូលប្រើប្រាស់អេក្រង់ដើម"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ទិដ្ឋភាពរួមអំពីកម្មវិធីដែលបើក"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"រុករកកម្មវិធីថ្មីៗ (ទៅមុខ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"រុករកកម្មវិធីថ្មីៗ (ថយក្រោយ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ចូលប្រើប្រាស់បញ្ជីកម្មវិធី និងម៉ាស៊ីនស្វែងរកទាំងអស់ (ឧ. ម៉ាស៊ីនស្វែងរក/កម្មវិធីចាប់ផ្ដើម)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"លាក់ រួចបង្ហាញរបារកិច្ចការ (ឡើងវិញ)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ចូលប្រើប្រាស់ការកំណត់ប្រព័ន្ធ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"ចូលប្រើប្រាស់ Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"មើលការជូនដំណឹង"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ថតរូបអេក្រង់"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"បង្ហាញផ្លូវកាត់"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ថយក្រោយ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ចូលទៅកាន់អេក្រង់ដើម"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"មើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"រុករកទៅមុខ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"រុករកថយក្រោយ ដើម្បីមើលកម្មវិធីថ្មីៗ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"បើកបញ្ជីកម្មវិធី"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"បង្ហាញរបារកិច្ចការ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"បើកការកំណត់"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"បើកជំនួយការ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ចាក់សោអេក្រង់"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ទាញកម្មវិធីកំណត់ចំណាំឡើងលើ ដើម្បីប្រើកំណត់ហេតុរហ័ស"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"បើកកំណត់ចំណាំ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ការដំណើរការបានច្រើននៃប្រព័ន្ធ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅចំហៀងខាងស្ដាំ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅចំហៀងខាងឆ្វេង"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ប្ដូរពីមុខងារបំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"អំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីកម្មវិធីមួយទៅមួយទៀត"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងស្ដាំដៃ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ចូលក្នុងមុខងារបំបែកអេក្រង់ដោយប្រើកម្មវិធីបច្ចុប្បន្ននៅខាងឆ្វេងដៃ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ប្ដូរពីមុខងារបំបែកអេក្រង់ទៅជាអេក្រង់ពេញ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"បញ្ចូល"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ប្ដូរភាសាបញ្ចូល (ភាសាបន្ទាប់)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ប្ដូរភាសាបញ្ចូល (ភាសាមុន)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ប្ដូរទៅភាសាបន្ទាប់"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ប្ដូរទៅភាសាមុន"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ចូលប្រើប្រាស់រូបអារម្មណ៍"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ចូលប្រើប្រាស់ការវាយបញ្ចូលដោយប្រើសំឡេង"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"កម្មវិធី"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ជំនួយ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"កម្មវិធីរុករកតាមអ៊ីនធឺណិត (Chrome តាមលំនាំដើម)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"កម្មវិធីរុករក"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ទំនាក់ទំនង"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"អ៊ីមែល (Gmail តាមលំនាំដើម)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"អ៊ីមែល"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"សារ SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"តន្ត្រី"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ប្រតិទិន"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 850bb0a..5be72d8 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> ಬಟನ್"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ಹಿಂದೆ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ಮೇಲೆ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ಕೆಳಗೆ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ಎಡ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ಬಲ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ಮಧ್ಯ"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ಸ್ಪೇಸ್"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಬದಲಾಯಿಸಿ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ಪಠ್ಯ ತೆರವುಗೊಳಿಸಿ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಹುಡುಕಿ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ಯಾವುದೇ ಶಾರ್ಟ್ಕಟ್ಗಳಿಲ್ಲ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ಇನ್ಪುಟ್"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ಆ್ಯಪ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ಪ್ರಸ್ತುತ ಆ್ಯಪ್"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ಅಧಿಸೂಚನೆಯ ಪರದೆಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ಸಿಸ್ಟಂ / ಆ್ಯಪ್ ಶಾರ್ಟ್ಕಟ್ಗಳ ಪಟ್ಟಿ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ಹಿಂದೆ: ಹಿಂದಿನ ಸ್ಥಿತಿಗೆ ಹಿಂತಿರುಗಿ (ಹಿಂತಿರುಗುವ ಬಟನ್)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ತೆರೆದ ಆ್ಯಪ್ಗಳ ಅವಲೋಕನ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್ಗಳ ನಡುವೆ ಬದಲಿಸಿ (ಮುಂದೆ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್ಗಳ ನಡುವೆ ಬದಲಿಸಿ (ಹಿಂದೆ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳ ಮತ್ತು ಹುಡುಕಾಟದ ಆ್ಯಕ್ಸೆಸ್ ಪಟ್ಟಿ (ಅಂದರೆ ಹುಡುಕಾಟ/ಲಾಂಚರ್)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ಟಾಸ್ಕ್ಬಾರ್ ಅನ್ನು ಮರೆಮಾಡಿ ಹಾಗೂ (ಪುನಃ)ತೋರಿಸಿ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Access Google Assistant ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ನೋಟಿಫಿಕೇಶನ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ಹಿಂತಿರುಗಿ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ಗೆ ಹೋಗಿ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್ಗಳ ಸಹಾಯದಿಂದ ಮುಂದಕ್ಕೆ ಹೋಗಿ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ಆ್ಯಪ್ಗಳ ಸಹಾಯದಿಂದ ಹಿಂದಕ್ಕೆ ಹೋಗಿ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿಯನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ಟಾಸ್ಕ್ಬಾರ್ ಅನ್ನು ತೋರಿಸಿ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"assistant ಅನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡಿ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ತ್ವರಿತ ಮೆಮೊಗಾಗಿ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಮೇಲಕ್ಕೆ ಎಳೆಯಿರಿ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ಸಿಸ್ಟಂ ಮಲ್ಟಿಟಾಸ್ಕಿಂಗ್"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS ಗೆ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಜೊತೆಗೆ ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS ಗೆ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಜೊತೆಗೆ ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ಪರದೆ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ಗೆ ಬದಲಿಸಿ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ಪರದೆ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಾಯಿಸಿ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ಗೆ ಇರುವ ಪ್ರಸ್ತುತ ಆ್ಯಪ್ ಸಹಾಯದಿಂದ ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ನಿಂದ ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ಗೆ ಬದಲಿಸಿ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ಇನ್ಪುಟ್"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ಇನ್ಪುಟ್ ಭಾಷೆಯನ್ನು ಬದಲಿಸಿ (ಮುಂದಿನ ಭಾಷೆ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ಇನ್ಪುಟ್ ಭಾಷೆಯನ್ನು ಬದಲಿಸಿ (ಹಿಂದಿನ ಭಾಷೆ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ಮುಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ಹಿಂದಿನ ಭಾಷೆಗೆ ಬದಲಿಸಿ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ಎಮೋಜಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ಧ್ವನಿ ಟೈಪಿಂಗ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ಸಹಾಯ ಮಾಡು"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ಬ್ರೌಸರ್ (ಡೀಫಾಲ್ಟ್ ಆಗಿ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ಬ್ರೌಸರ್"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ಸಂಪರ್ಕಗಳು"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ಇಮೇಲ್ (ಡೀಫಾಲ್ಟ್ ಆಗಿ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ಇಮೇಲ್"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ಎಸ್ಎಂಎಸ್"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ಸಂಗೀತ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index a9395b2..71c0a35 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 버튼"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"뒤로"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"위쪽"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"아래쪽"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"왼쪽"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"오른쪽"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"중앙"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"알림"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"단축키"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"키보드 레이아웃 전환"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"텍스트 삭제"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"단축키"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"단축키 검색"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"단축키 없음"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"입력"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"열린 앱"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"현재 앱"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"알림 창에 액세스"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"전체 스크린샷 촬영"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"시스템/앱 단축키 목록에 액세스"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"뒤로: 이전 상태로 되돌아가기(뒤로 버튼)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"홈 화면에 액세스"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"열린 앱 개요"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"최근 앱 간 순환(앞으로)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"최근 앱 간 순환(뒤로)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"모든 앱 및 검색 목록(예: 검색/런처)에 액세스"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"태스크 바 숨김 및 다시 표시"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"시스템 설정에 액세스"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google 어시스턴트에 액세스"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"알림 보기"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"스크린샷 촬영"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"단축키 표시"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"돌아가기"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"홈 화면으로 이동"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"최근 앱 보기"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"최근 앱 간 앞으로 순환"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"최근 앱 간 뒤로 순환"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"앱 목록 열기"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"태스크 바 표시"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"설정 열기"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"어시스턴트 열기"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"잠금 화면"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"빠른 메모를 위해 노트 앱 불러오기"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"메모 열기"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"시스템 멀티태스킹"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"화면 분할에서 전체 화면으로 전환"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"화면 분할 중: 다른 앱으로 바꾸기"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"현재 앱을 오른쪽으로 보내는 화면 분할 입력"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"현재 앱을 왼쪽으로 보내는 화면 분할 입력"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"화면 분할에서 전체 화면으로 전환"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"화면 분할 중: 다른 앱으로 바꾸기"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"입력"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"입력 언어 전환(다음 언어)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"입력 언어 전환(이전 언어)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"다음 언어로 전환"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"이전 언어로 전환"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"이모티콘에 액세스"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"음성 입력에 액세스"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"애플리케이션"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"지원"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"브라우저(Chrome을 기본값으로 설정)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"어시스턴트"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"브라우저"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"연락처"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"이메일(Gmail을 기본값으로 설정)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"이메일"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"음악"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"캘린더"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 73e7647..6276160 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> баскычы"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Башкы бет"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Артка"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Өйдө"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Төмөн"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Солго"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Оңго"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Ортолотуу"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Боштук"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Билдирмелер"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Ыкчам баскычтар"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Баскычтоп калыбын которуштуруу"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Текстти тазалоо"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Ыкчам баскычтар"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Ыкчам баскычтарды издөө"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ыкчам баскычтар жок"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Киргизүү"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ачык колдон-лор"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Учурдагы кол-мо"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Билдирмелер тактасына кирүү"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Толук скриншот тартуу"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Системанын / колдонмолордун ыкчам баскычтарынын тизмесине кирүү"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Артка: мурунку абалга кайтуу (артка баскычы)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Башкы экранга кирүү"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ачылып турган колдонмолордун тизмесин көрүү"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Соңку колдонмолорду көрүү (кадимки тартипте)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Соңку колдонмолорду көрүү (тескери тартипте)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Бардык колдонмолордун тизмесин ачуу жана издөө (Издөө/Жүргүзгүч)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Тапшырмалар тактасын жашыруу жана көрсөтүү"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Система параметрлерине кирүү"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Жардамчыны иштетүү"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Билдирмелерди көрүү"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Скриншот тартуу"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ыкчам баскычтарды көрсөтүү"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Артка кайтуу"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Башкы экранга өтүү"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Акыркы колдонмолорду көрүү"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Соңку колдонмолордо алдыга өтүү"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Соңку колдонмолордо артка кайтуу"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Колдонмолордун тизмесин ачуу"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Тапшырмалар панелин көрсөтүү"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Параметрлерди ачуу"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Жардамчыны ачуу"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Экранды кулпулоо"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ыкчам кыска жазууну түзүү"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Кыска жазууларды ачуу"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Системанын бир нече тапшырма аткаруусу"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Оң жакта жайгашкан учурдагы колдонмо менен экранды бөлүүнү иштетүү"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Сол жакта жайгашкан учурдагы колдонмо менен экранды бөлүүнү иштетүү"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Экранды бөлүү режиминен толук экранга которулуу"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Учурда оң жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Учурда сол жактагы колдонмо менен экранды бөлүүнү иштетүү"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Экранды бөлүү режиминен толук экранга которулуу"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Киргизүү"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Кийинки киргизүү тилине которулуу"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Мурунку киргизүү тилине которулуу"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Кийинки тилге которулуу"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Мурунку тилге которулуу"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Быйтыкчаларды көрүү"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Айтып терүүнү иштетүү"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Колдонмолор"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Көмөкчү"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Серепчи (демейки шартта Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Жардамчы"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Серепчи"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Байланыштар"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электрондук почта (демейки шартта Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Электрондук почта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Жылнаама"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index e9f6a19..5da52a5 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ປຸ່ມ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ກັບຄືນ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ຂຶ້ນ"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ລົງ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ຊ້າຍ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ຂວາ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ເຄິ່ງກາງ"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ການແຈ້ງເຕືອນ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ປຸ່ມລັດແປ້ນພິມ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ສະຫຼັບແປ້ນພິມ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ລຶບລ້າງຂໍ້ຄວາມ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ທາງລັດ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ທາງລັດການຊອກຫາ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ບໍ່ພົບທາງລັດ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ການປ້ອນຂໍ້ມູນ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ແອັບທີ່ເປີດຢູ່"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ແອັບປັດຈຸບັນ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ເຂົ້າເຖິງເງົາການແຈ້ງເຕືອນ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ຖ່າຍຮູບໜ້າຈໍແບບເຕັມ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ເຂົ້າເຖິງລາຍຊື່ຂອງລະບົບ / ທາງລັດແອັບ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ກັບຄືນ: ກັບຄືນຫາສະຖານະກ່ອນໜ້າ (ປຸ່ມກັບຄືນ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ເຂົ້າເຖິງໂຮມສະກຣີນ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ພາບຮວມຂອງແອັບທີ່ເປີດຢູ່"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ໝູນວຽນຜ່ານແອັບຫຼ້າສຸດ (ໄປໜ້າ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ໝູນວຽນຜ່ານແອັບຫຼ້າສຸດ (ກັບຄືນ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ເຂົ້າເຖິງລາຍຊື່ຂອງແອັບທັງໝົດ ແລະ ການຊອກຫາ (ຕົວຢ່າງ: ຊອກຫາ/ລັນເຊີ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ເຊື່ອງ ແລະ ສະແດງ(ຄືນ) ແຖບໜ້າວຽກ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ເຂົ້າເຖິງການຕັ້ງຄ່າລະບົບ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"ເຂົ້າເຖິງຜູ້ຊ່ວຍ Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ເບິ່ງການແຈ້ງເຕືອນ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ຖ່າຍຮູບໜ້າຈໍ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ສະແດງທາງລັດ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ກັບຄືນ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ເຂົ້າໄປໂຮມສະກຣີນ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ເບິ່ງແອັບຫຼ້າສຸດ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບໄປໜ້າ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ສະຫຼັບລະຫວ່າງແອັບຫຼ້າສຸດແບບກັບຫຼັງ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ເປີດລາຍຊື່ແອັບ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ສະແດງແຖບໜ້າວຽກ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ເປີດການຕັ້ງຄ່າ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"ເປີດຜູ້ຊ່ວຍ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ໜ້າຈໍລັອກ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ດຶງແອັບ Notes ຂຶ້ນມາເພື່ອບັນທຶກຢ່າງວ່ອງໄວ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ເປີດບັນທຶກ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ການເຮັດຫຼາຍໜ້າວຽກພ້ອມກັນຂອງລະບົບ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ປ່ຽນແທນຈາກແອັບໜຶ່ງໄປຫາແອັບອື່ນ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"ເຂົ້າສູ່ແບ່ງໜ້າຈໍດ້ວຍແອັບປັດຈຸບັນໄປຫາ LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ສະຫຼັບຈາກແບ່ງໜ້າຈໍໄປເປັນເຕັມຈໍ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ການປ້ອນຂໍ້ມູນ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ສະຫຼັບການປ້ອນພາສາ (ພາສາຕໍ່ໄປ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ສະຫຼັບການປ້ອນພາສາ (ພາສາກ່ອນໜ້າ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ສະຫຼັບເປັນພາສາຖັດໄປ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ສະຫຼັບເປັນພາສາກ່ອນໜ້າ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ເຂົ້າເຖິງອີໂມຈິ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ເຂົ້າເຖິງການພິມດ້ວຍສຽງ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ແອັບພລິເຄຊັນ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ຕົວຊ່ວຍ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ໂປຣແກຣມທ່ອງເວັບ (Chrome ເປັນຄ່າເລີ່ມຕົ້ນ)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"ຜູ້ຊ່ວຍ"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ໂປຣແກຣມທ່ອງເວັບ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ອີເມວ (Gmail ເປັນຄ່າເລີ່ມຕົ້ນ)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ອີເມວ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"ຂໍ້ຄວາມສັ້ນ(SMS)"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ດົນຕີ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ປະຕິທິນ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 0e9e940..34c06bd 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Mygtukas <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Pagrindinis"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atgal"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Aukštyn"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Žemyn"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kairėn"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dešinėn"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centras"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Tarpas"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pranešimai"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Spartieji klavišai"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Perjungti klaviat. išdėstymą"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Išvalyti tekstą"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Spartieji klavišai"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Ieškoti sparčiųjų klavišų"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Sparčiųjų klavišų nerasta"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Įvestis"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Atidar. progr."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Esama programa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Pasiekti pranešimų skydelį"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Padaryti viso ekrano kopiją"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Pasiekti sistemos sąrašą / programų šaukinius"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atgal: grįžti prie ankstesnės būsenos (mygtukas „Atgal“)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Pasiekti pagrindinį ekraną"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Peržiūrėti atidarytas programas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pereiti prie naujausių programų (į priekį)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pereiti prie naujausių programų (atgal)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Visų progr. ir paiešk. prieig. sąrašas (t. y. Paieška, paleid. priem.)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Slėpti ir (iš naujo) parodyti užduočių juostą"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Pasiekti sistemos nustatymus"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Pasiekti „Google“ padėjėją"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Peržiūrėti pranešimus"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Padaryti ekrano kopiją"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Rodyti sparčiuosius klavišus"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Grįžti"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Grįžti į pagrindinį ekraną"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Peržiūrėti naujausias programas"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pereiti į priekį per naujausias programas"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pereiti atgal per naujausias programas"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atidaryti programų sąrašą"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rodyti užduočių juostą"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atidaryti nustatymus"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atidaryti Padėjėją"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Užrakinti ekraną"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Gauti pastabų programą trumpiems užrašams"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Atidaryti pastabas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Kelių užduočių atlikimas sistemoje"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Eiti į išskaidyto ekrano režimą su dabartine programa dešinėje"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Eiti į išskaidyto ekrano režimą su dabartine programa kairėje"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Perjungti iš išskaidyto ekrano režimo į viso ekrano režimą"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Įvestis"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Perjungti įvesties kalbą (kita kalba)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Perjungti įvesties kalbą (ankstesnė kalba)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Perjungti į kitą kalbą"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Perjungti ankstesnę kalbą"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Pasiekti jaustuką"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Pasiekti rašymą balsu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pagalbinė programa"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Naršyti („Chrome“ kaip numatytoji naršyklė)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Padėjėjas"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Naršyklė"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktai"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"El. paštas („Gmail“ kaip numatytasis el. paštas)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"El. paštas"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendorius"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 8c7af63..66933bc 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Poga <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Sākumvietas taustiņš"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Atpakaļ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Uz augšu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Uz leju"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Pa kreisi"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Pa labi"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrā"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Atstarpe"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Paziņojumi"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Īsinājumtaustiņi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Mainīt tastatūras izkārtojumu"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Notīrīt tekstu"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Īsinājumtaustiņi"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Meklēt īsinājumtaustiņus"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nav atrasti"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ievade"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Atvērtās"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Pašreizējā"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Piekļūt paziņojumu panelim"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Izveidot visa ekrāna ekrānuzņēmumu"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Piekļūt sistēmas/lietotnes saīšņu sarakstam"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Atpakaļ: atgriezties iepriekšējā stāvoklī (poga Atpakaļ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Piekļūt sākuma ekrānam"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Atvērto lietotņu kopsavilkums"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz nākamo)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz iepriekšējo)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Visu lietotņu saraksts un meklēšana (meklēšana / Palaišanas programma)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Paslēpt vai (atkārtoti) parādīt uzdevumu joslu"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Piekļūt sistēmas iestatījumiem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Piekļūt Google asistentam"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Skatīt paziņojumus"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Izveidot ekrānuzņēmumu"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Rādīt īsinājumtaustiņus"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Atpakaļ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pāriet uz sākuma ekrānu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Skatīt nesen izmantotās lietotnes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz nākamo)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Secīgi pārlūkot nesen izmantotās lietotnes (pāriet uz iepriekšējo)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Atvērt lietotņu sarakstu"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Rādīt uzdevumu joslu"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Atvērt iestatījumus"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Atvērt Asistentu"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Bloķēt ekrānu"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Atvērt piezīmju lietotni, lai izveidotu piezīmi"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Atvērt piezīmes"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistēmas vairākuzdevumu režīms"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena uz otru"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa labi"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Pāriet ekrāna sadalīšanas režīmā ar pašreizējo lietotni pa kreisi"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Pārslēgties no ekrāna sadalīšanas režīma uz pilnekrāna režīmu"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ievade"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Pārslēgt ievades valodu (uz nākamo valodu)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Pārslēgt ievades valodu (uz iepriekšējo valodu)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Pārslēgt uz nākamo valodu"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Pārslēgt uz iepriekšējo valodu"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Piekļūt emocijzīmēm"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Piekļūt rakstīšanai ar balsi"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Lietojumprogrammas"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Palīgs"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Pārlūks (pēc noklusējuma Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistents"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Pārlūkprogramma"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktpersonas"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pasts (pēc noklusējuma Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pasts"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Īsziņas"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Mūzika"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendārs"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 6c577ce..44f6e0c 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни бавно • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Се полни • Полна по <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Повлечете налево за да го започнете заедничкото упатство"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Го отвора уредникот на виџети"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Отстранува виџет"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Додајте виџет"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Промени го корисникот"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"паѓачко мени"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Сите апликации и податоци во сесијата ќе се избришат."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Копче <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home-копче"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрелка нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрелка надолу"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрелка налево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрелка надесно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центар"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Известувања"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Кратенки на тастатурата"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени јазик на тастатура"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Избришете го текстот"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Кратенки"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пребарувајте кратенки"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Не се пронајдени кратенки"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Внесување"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отворени аплик."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Тековна аплик."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Пристапете до панелот со известувања"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Снимете целосна слика од екранот"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Пристапете до список на кратенки за системот и апликациите"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: вратете се во претходната состојба (копче за назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Пристапете до почетниот екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Преглед на отворените апликации"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Прелистувајте ги неодамнешните апликации (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Прелистувајте ги неодамнешните апликации (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Отв. список со сите аплик. и пребарувајте (т.е. Пребарување/Стартер)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скриј и (повторно) прикажи ја лентата со задачи"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Пристапете до поставките на системот"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Пристапете до „Помошник на Google“"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Прегледајте ги известувањата"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Направете слика од екранот"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Прикажи кратенки"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Вратете се назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Одете на почетниот екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Прегледајте ги неодамнешните апликации"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прелистувајте ги неодамнешните апликации нанапред"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прелистувајте ги неодамнешните апликации наназад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отворете го списокот со апликации"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи „Лента со задачи“"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отворете „Поставки“"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отворете го „Помошникот“"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заклучен екран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отворете ја апликацијата „Белешки“ за брз меморандум"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отворете „Белешки“"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Системски мултитаскинг"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Активирајте поделен екран со тековната апликација десно"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Активирајте поделен екран со тековната апликација лево"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Префрлете се од поделен екран во цел екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"За време на поделен. екран: префрл. ги аплик. од една на друга страна"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Активирајте поделен екран со тековната апликација десно"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Активирајте поделен екран со тековната апликација лево"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Префрлете од поделен екран во цел екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"При поделен екран: префрлете ги аплик. од едната на другата страна"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Внесување"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Променете го влезниот јазик (следен јазик)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Променете го влезниот јазик (претходен јазик)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Префрлете на следниот јазик"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Префрлете на претходниот јазик"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Пристапете до емоџијата"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Пристапете до гласовното пишување"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апликации"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помош"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Прелистувач (Chrome е стандардна опција)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Помошник"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Прелистувач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Е-пошта (Gmail е стандардна опција)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Е-пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 7354e91..4644fa5 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ബട്ടൺ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ഹോം"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ബാക്ക്"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"മുകളിലേക്ക്"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"താഴേക്ക്"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ഇടത്"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"വലത്"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"മധ്യം"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"TAB"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"സ്പെയ്സ്"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"അറിയിപ്പുകൾ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"കീബോർഡ് കുറുക്കുവഴികൾ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"കീബോർഡ് ലേഔട്ട് മാറുക"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ടെക്സ്റ്റ് മായ്ക്കുക"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"കുറുക്കുവഴികൾ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"കുറുക്കുവഴികൾ തിരയുക"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"കുറുക്കുവഴി കണ്ടെത്തിയില്ല"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ഇൻപുട്ട്"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"തുറന്ന ആപ്പുകൾ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"നിലവിലെ ആപ്പ്"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"അറിയിപ്പ് ഷെയ്ഡ് ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"പൂർണ്ണ സ്ക്രീൻഷോട്ട് എടുക്കുക"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"സിസ്റ്റം / ആപ്പ് കുറുക്കുവഴികളുടെ ലിസ്റ്റ് ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"മടങ്ങുക: മുമ്പത്തെ നിലയിലേക്ക് പോകുക (മടങ്ങുക ബട്ടൺ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ഹോം സ്ക്രീൻ ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"തുറന്ന ആപ്പുകളുടെ അവലോകനം"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"സമീപകാലത്തെ ആപ്പുകൾ തമ്മിൽ മാറുക (മുന്നിലേക്ക്)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"സമീപകാലത്തെ ആപ്പുകൾ തമ്മിൽ മാറുക (പിന്നിലേക്ക്)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ആപ്പ്, തിരയൽ ലിസ്റ്റുകളെല്ലാം ആക്സസ് ചെയ്യൂ (Search/Launcher എന്നിവ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ടാസ്ക്ബാർ മറയ്ക്കുക, (വീണ്ടും) കാണിക്കുക"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"സിസ്റ്റം ക്രമീകരണം ആക്സസ് ചെയ്യുക"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ആക്സസ് ചെയ്യുക"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"അറിയിപ്പുകൾ കാണുക"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"സ്ക്രീൻഷോട്ട് എടുക്കുക"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"കുറുക്കുവഴികൾ കാണിക്കുക"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"മടങ്ങുക"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ഹോം സ്ക്രീനിലേക്ക് പോകുക"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (മുന്നോട്ട്)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"സമീപകാലത്തെ ആപ്പുകളിലൂടെ പോകുക (പിന്നോട്ട്)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ആപ്പ് ലിസ്റ്റ് തുറക്കുക"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ടാസ്ക്ബാർ കാണിക്കുക"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ക്രമീകരണം തുറക്കുക"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant തുറക്കുക"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ലോക്ക് സ്ക്രീൻ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"അതിവേഗ മെമോ തയ്യാറാക്കുന്നതിന് നോട്ട്സ് ആപ്പ് തുറക്കുക"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"കുറിപ്പുകൾ തുറക്കുക"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"സിസ്റ്റം മൾട്ടിടാസ്കിംഗ്"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"സ്ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"സ്ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"നിലവിലെ ആപ്പ് വലതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"നിലവിലെ ആപ്പ് ഇടതുവശത്ത് വരുന്ന രീതിയിൽ സ്ക്രീൻ വിഭജന മോഡിൽ കടക്കുക"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"സ്ക്രീൻ വിഭജന മോഡിൽ നിന്ന് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"സ്ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ഇൻപുട്ട്"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ഇൻപുട്ട് ഭാഷ മാറുക (അടുത്ത ഭാഷ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ഇൻപുട്ട് ഭാഷ മാറുക (മുമ്പത്തെ ഭാഷ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"അടുത്ത ഭാഷയിലേക്ക് മാറുക"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"മുമ്പത്തെ ഭാഷയിലേക്ക് മാറുക"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ഇമോജി ആക്സസ് ചെയ്യുക"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"വോയ്സ് ടൈപ്പിംഗ് ആക്സസ് ചെയ്യുക"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"അപ്ലിക്കേഷനുകൾ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"അസിസ്റ്റ്"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ബ്രൗസർ (ഡിഫോൾട്ടായി Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ബ്രൗസർ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"കോൺടാക്റ്റുകൾ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ഇമെയിൽ (ഡിഫോൾട്ടായി Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ഇമെയിൽ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS:"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"സംഗീതം"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index e6dc9e5..217eeb1 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> товчлуур"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Нүүр хуудас"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Буцах"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Дээш"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Доош"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Зүүн"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Баруун"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Гол хэсэг"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Зай"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Мэдэгдэл"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Гарын товчлол"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Гарын бүдүүвч рүү сэлгэх"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Текстийг арилгах"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Товчлолууд"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Товчлолууд хайх"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ямар ч товчлол олдсонгүй"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Оролт"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Нээлттэй аппууд"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Одоогийн апп"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Мэдэгдлийн хураангуй самбарт хандах"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Бүтэн дэлгэцийн агшин авах"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Системийн жагсаалт / аппын товчлолд хандах"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Буцах: өмнөх төлөв рүү буцах (буцах товчлуур)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Үндсэн нүүрэнд хандах"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Нээлттэй аппуудын тойм"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Саяхны аппуудаар шилжих (урагшлах)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Саяхны аппуудаар шилжих (буцах)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Бүх апп болон хайлтын жагсаалтад хандах (ж.нь Хайлт/Эхлүүлэгч)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ажлын хэсгийг нуух болон (дахин) харуулах"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Системийн тохиргоонд хандах"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Туслахад хандах"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Мэдэгдлийг харах"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Дэлгэцийн агшныг авах"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Товчлол харуулах"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Буцах"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Үндсэн нүүр лүү очих"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Саяхны аппуудыг харах"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Саяхны аппуудаар урагш гүйлгэх"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Саяхны аппуудаар арагш гүйлгэх"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Аппуудын жагсаалтыг нээх"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ажлын хэсгийг харуулах"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Тохиргоог нээх"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Туслахыг нээх"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Түгжээтэй дэлгэц"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Шуурхай тэмдэглэхийн тулд Notes аппыг харуулах"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Тэмдэглэлүүдийг нээх"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Систем олон ажил зэрэг хийх"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Одоогийн аппаар баруун гар талд Дэлгэц хуваахад орох"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Одоогийн аппаар зүүн гар талд Дэлгэц хуваахад орох"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Одоогийн аппаар баруун гар талд дэлгэц хуваахад орох"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Одоогийн аппаар зүүн гар талд дэлгэц хуваахад орох"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Дэлгэц хуваахаас бүтэн дэлгэц рүү сэлгэх"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Оролт"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Оролтын хэлийг сэлгэх (дараагийн хэл)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Оролтын хэлийг сэлгэх (өмнөх хэл)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Дараагийн хэл рүү сэлгэх"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Өмнөх хэл рүү сэлгэх"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Эможид хандах"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Дуу хоолойгоор бичихэд хандах"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апп"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Дэмжлэг"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Хөтөч (Chrome-г өгөгдмөлөөр тохируулах)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Туслах"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Хөтөч"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Харилцагчид"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Имэйл (Gmail-г өгөгдмөлөөр тохируулах)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Имэйл"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Хөгжим"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a5d0afa..f768881 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"बटण <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"परत"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"वर"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"खाली"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"डावा"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"उजवा"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्यवर्ती"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचना"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"कीबोर्ड शॉर्टकट"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"कीबोर्ड लेआउट स्विच करा"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"मजकूर साफ करा"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"शॉर्टकट"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"शॉर्टकट शोधा"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"एकही शॉर्टकट आढळला नाहीत"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ॲप्स उघडा"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"सध्याचे अॅप"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"सूचना शेड अॅक्सेस करा"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"संपूर्ण स्क्रीनशॉट घ्या"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टीम / अॅप्स शॉर्टकटची सूची अॅक्सेस करा"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"मागे: मागील स्थितीवर परत जा (मागे जा बटण)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रीन अॅक्सेस करा"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"उघड्या असलेल्या अॅप्सचे अवलोकन"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"अलीकडील अॅप्स पहा (पुढील)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"अलीकडील अॅप्स पहा (मागील)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सर्व अॅप्सची सूची अॅक्सेस करा आणि शोधा (उदा. शोध/लाँचर)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार लपवा आणि (पुन्हा) दाखवा"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टीम सेटिंग्ज अॅक्सेस करा"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant अॅक्सेस करा"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचना पहा"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट घ्या"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दाखवा"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"मागे जा"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीनवर जा"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"अलीकडील अॅप्स पहा"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"अलीकडील ॲप्सवरून पुढे जा"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"अलीकडील ॲप्सवरून मागे जा"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ॲप्सची सूची उघडा"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दाखवा"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग्ज उघडा"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant उघडा"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"झटपट मेमोसाठी Notes अॅप वर ओढा"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"टिपा उघडा"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टीम मल्टिटास्किंग"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"उजव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"डाव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रीन वरून फुल स्क्रीनवर स्विच करा"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रीन दरम्यान: एक अॅप दुसऱ्या अॅपने बदला"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"उजव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"डाव्या बाजूला सध्याचे अॅप असलेल्या स्प्लिट स्क्रीनवर जा"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीनवरून फुल स्क्रीनवर स्विच करा"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीनदरम्यान: एक अॅप दुसऱ्या अॅपने बदला"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा स्विच करा (पुढील भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा स्विच करा (मागील भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"पुढील भाषेवर स्विच करा"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"मागील भाषेवर स्विच करा"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी अॅक्सेस करा"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"व्हॉइस टायपिंग अॅक्सेस करा"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ॲप्लिकेशन"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउझर (डीफॉल्ट म्हणून Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउझर"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"संपर्क"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ईमेल (डीफॉल्ट म्हणून Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ईमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"एसएमएस"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"संगीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"कॅलेंडर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index bf0a60c..db53890 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butang <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Skrin Utama"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Kembali"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Ke atas"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ke bawah"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Ke kiri"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Ke kanan"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Tengah"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Pemberitahuan"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Pintasan Papan Kekunci"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Tukar reka letak papan kekunci"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Kosongkan teks"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Pintasan"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Cari pintasan"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tiada pintasan ditemukan"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apl yang dibuka"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Apl semasa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Akses bidai pemberitahuan"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ambil tangkapan skrin penuh"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Akses senarai pintasan sistem / apl"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Kembali: kembali kepada keadaan sebelumnya (butang kembali)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Akses skrin utama"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Gambaran keseluruhan apl yang dibuka"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Mengitar apl terbaharu (hadapan)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Mengitar apl terbaharu (belakang)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Akses senarai semua apl dan cari (iaitu Carian/Pelancar)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Sembunyikan dan tunjukkan (semula) bar tugas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Akses tetapan sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Akses Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Lihat pemberitahuan"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ambil tangkapan skrin"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tunjukkan pintasan"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kembali"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Akses skrin utama"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Lihat apl terbaharu"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Kitar ke hadapan menerusi apl terbaharu"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Kitar ke belakang menerusi apl terbaharu"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buka senarai apl"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Tunjukkan bar tugas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buka tetapan"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buka Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kunci skrin"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tarik ke atas apl Nota untuk memo pantas"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buka nota"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Berbilang tugas sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Masuk skrin Pisah dengan apl semasa pada sisi kanan"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Masuk skrin Pisah dengan apl semasa pada sisi kiri"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Tukar daripada skrin Pisah kepada skrin penuh"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Semasa skrin Pisah: gantikan apl daripada satu apl kepada apl lain"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Masuk skrin pisah dengan apl semasa pada sisi kanan"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Masuk skrin pisah dengan apl semasa pada sisi kiri"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Beralih daripada skrin pisah kepada skrin penuh"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Tukar bahasa input (bahasa seterusnya)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Tukar bahasa input (bahasa sebelumnya)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Beralih kepada bahasa seterusnya"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Beralih kepada bahasa sebelumnya"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Akses emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Akses penaipan suara"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikasi"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Bantu"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Penyemak imbas (Chrome sebagai lalai)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Penyemak imbas"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kenalan"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mel (Gmail sebagai lalai)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mel"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendar"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 5568fa7..6221ca1 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • နှေးကွေးစွာ အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • အားသွင်းနေသည် • အားပြည့်ရန် <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> လိုသည်"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"အများသုံးရှင်းလင်းပို့ချချက် စတင်ရန် ဘယ်သို့ပွတ်ဆွဲပါ"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"ဝိဂျက်တည်းဖြတ်စနစ် ဖွင့်ရန်"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"ဝိဂျက် ဖယ်ရှားရန်"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"ဝိဂျက် ထည့်ရန်"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ဆွဲချမီနူး"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"ဒီချိတ်ဆက်မှု ထဲက အက်ပ်များ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ခလုတ် <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ပင်မ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"နောက်သို့"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"အပေါ်"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"အောက်"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ဘယ်"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ညာ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"ဌာန"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"အကြောင်းကြားချက်များ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ကီးဘုတ် ဖြတ်လမ်းများ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ကီးဘုတ်အပြင်အဆင် ပြောင်းခြင်း"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"စာသား ဖယ်ရှားရန်"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ဖြတ်လမ်းလင့်ခ်များ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ဖြတ်လမ်းလင့်ခ်များ ရှာပါ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ဖြတ်လမ်းလင့်ခ် မတွေ့ပါ"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"စာရိုက်ခြင်း"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ဖွင့်ထားသောအက်ပ်"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"လက်ရှိအက်ပ်"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"အကြောင်းကြားစာအကွက် သုံးရန်"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ဖန်သားပြင်ဓာတ်ပုံအပြည့် ရိုက်ကူးရန်"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"စနစ် / အက်ပ်ဖြတ်လမ်းလင့်ခ်စာရင်း ဝင်ကြည့်ရန်"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"နောက်သို့- ယခင်အခြေအနေသို့ ပြန်သွားရန် (နောက်သို့ ခလုတ်)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ပင်မစာမျက်နှာ ဝင်ကြည့်ရန်"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ဖွင့်ထားသောအက်ပ်များ အနှစ်ချုပ်"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"မကြာသေးမီကအက်ပ်များ ရှာဖွေကြည့်ရှုရန် (ရှေ့သို့)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"မကြာသေးမီကအက်ပ်များ ရှာဖွေကြည့်ရှုရန် (နောက်သို့)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"အက်ပ်အားလုံးစာရင်းကို ဝင်ကြည့်ပြီး ရှာပါ (ဥပမာ- Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"လုပ်ဆောင်စရာဘားကို ဖျောက်ထားပြီး ပြန်ပြရန်"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"စက်စနစ်ဆက်တင်များ ဝင်ကြည့်ရန်"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant သုံးရန်"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"အကြောင်းကြားချက်များ ကြည့်ရန်"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ဖန်သားပြင်ဓာတ်ပုံ ရိုက်ရန်"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ဖြတ်လမ်းလင့်ခ်များ ပြပါ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ပြန်သွားရန်"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ပင်မစာမျက်နှာသို့သွားရန်"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"မကြာသေးမီကအက်ပ်များ ကြည့်ရန်"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံရှေ့သို့လှည့်ရန်"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"မကြာသေးမီက အက်ပ်များကို အဝိုင်းပုံနောက်ပြန်လှည့်ရန်"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"အက်ပ်ပြသမှု ဖွင့်ရန်"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taskbar ပြပါ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ဆက်တင်များ ဖွင့်ရန်"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ဖွင့်ရန်"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"လော့ခ်မျက်နှာပြင်"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"အမြန်မှတ်သားရန် မှတ်စုရေးသောအက်ပ် ဖွင့်ပါ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"မှတ်စုများ ဖွင့်ရန်"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"စနစ်က တစ်ပြိုင်နက် များစွာလုပ်ခြင်း"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"လက်ရှိအက်ပ်ဖြင့် ညာဘက်ရှိ ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဝင်ရန်"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"လက်ရှိအက်ပ်ဖြင့် ဘယ်ဘက်ရှိ ‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ သို့ ဝင်ရန်"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"‘မျက်နှာပြင် ခွဲ၍ပြသခြင်း’ မှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"‘မျက်နှာပြင်ခွဲ၍ပြသစဉ်’- အက်ပ်ကို တစ်ခုမှ နောက်တစ်ခုသို့ အစားထိုးရန်"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ညာဘက်တွင်ထည့်ရန်"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"လက်ရှိအက်ပ်ကို မျက်နှာပြင် ခွဲ၍ပြသမှု၏ ဘယ်ဘက်တွင်ထည့်ရန်"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"မျက်နှာပြင် ခွဲ၍ပြသမှုမှ မျက်နှာပြင်အပြည့်သို့ ပြောင်းရန်"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"စာရိုက်ခြင်း"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"စာရိုက်မည့် ဘာသာစကား ပြောင်းရန် (နောက်ဘာသာစကား)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"စာရိုက်မည့် ဘာသာစကား ပြောင်းရန် (ယခင်ဘာသာစကား)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"နောက်ဘာသာစကားသို့ ပြောင်းရန်"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ယခင်ဘာသာစကားသို့ ပြောင်းရန်"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"အီမိုဂျီ သုံးရန်"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"အသံဖြင့်စာရိုက်ခြင်း သုံးရန်"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"အက်ပ်များ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"အထောက်အကူ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ဘရောင်ဇာ (Chrome ကို မူရင်းအဖြစ်)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ဘရောင်ဇာ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"အဆက်အသွယ်များ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"အီးမေးလ် (Gmail ကို မူရင်းအဖြစ်)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"အီးမေးလ်"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS စာတိုစနစ်"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ပြက္ခဒိန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index c654397..9fc3625 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -510,7 +510,7 @@
<string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"deaktiver"</string>
<string name="sound_settings" msgid="8874581353127418308">"Lyd og vibrering"</string>
<string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Innstillinger"</string>
- <string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Senk volumet til et tryggere nivå"</string>
+ <string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Volumet er senket til et tryggere nivå"</string>
<string name="csd_system_lowered_text" product="default" msgid="1250251883692996888">"Volumet på hodetelefonene har vært høyt lenger enn anbefalt"</string>
<string name="csd_500_system_lowered_text" product="default" msgid="7414943302186884124">"Volumet på hodetelefonene har overskredet sikkerhetsgrensen for denne uken"</string>
<string name="csd_button_keep_listening" product="default" msgid="4093794049149286784">"Fortsett å lytte"</string>
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>-knappen"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Startskjerm"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tilbake"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Opp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Venstre"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Høyre"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midttasten"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Mellomrom"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Varsler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Hurtigtaster"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Bytt tastaturoppsett"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Fjern teksten"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Hurtigtaster"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Søk etter hurtigtaster"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Fant ingen hurtigtaster"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inndata"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Åpne apper"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktiv app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Åpne varselpanelet"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ta en skjermdump av hele skjermen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Se hurtigtastene for systemet/apper"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Tilbake: Gå tilbake til forrige tilstand (tilbakeknapp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Åpne startskjermen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Oversikt over åpne apper"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Bla gjennom nylige apper (fremover)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Bla gjennom nylige apper (bakover)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Se alle apper og søk (dvs. Søk/Appoversikt)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skjul og vis oppgavelinjen"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Åpne systeminnstillingene"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Aktiver Google-assistenten"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se varsler"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ta skjermdump"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Vis snarveier"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Gå tilbake"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Gå til startskjermen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se nylige apper"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Gå forover gjennom nylige apper"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Gå bakover gjennom nylige apper"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Åpne applisten"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vis oppgavelinje"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Åpne innstillingene"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Åpne assistenten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Låseskjerm"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Åpne Notes-appen for å ta notater raskt"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Åpne notatene"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking på systemet"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Åpne delt skjerm med den aktive appen til høyre"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Åpne delt skjerm med den aktive appen til venstre"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bytt fra delt skjerm til fullskjerm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"I delt skjerm: Bytt ut en app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Åpne delt skjerm med den aktive appen til høyre"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Åpne delt skjerm med den aktive appen til venstre"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bytt fra delt skjerm til fullskjerm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"I delt skjerm: Bytt ut en app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Skrivespråk"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Bytt skrivespråk (neste språk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Bytt skrivespråk (forrige språk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Bytt til neste språk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Bytt til forrige språk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Se emojier"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Bruk stemmestyrt skriving"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apper"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assist"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Nettleser (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Nettleser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musikk"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
@@ -1165,7 +1182,7 @@
<string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Trykk på og hold inne snarveien"</string>
<string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Avbryt"</string>
<string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Bytt skjerm nå"</string>
- <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Brett ut telefonen"</string>
+ <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Åpne telefonen"</string>
<string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Vil du bytte skjerm?"</string>
<string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Bruk baksidekameraet for å få høyere oppløsning"</string>
<string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Brett ut telefonen for å få høyere oppløsning"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 71fa4e5..79cb703 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> बटन"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"पछाडि"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"माथि"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"तल"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"बायाँ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"दायाँ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"केन्द्र"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"स्पेस"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाहरू"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"किबोर्ड सर्टकटहरू"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"किबोर्डको लेआउट बदल्नुहोस्"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"टेक्स्ट हटाउनुहोस्"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"सर्टकटहरू"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"सर्टकटहरू खोज्नुहोस्"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"कुनै पनि सर्टकट भेटिएन"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"इनपुट"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"खोलिएका एपहरू"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"हालको एप"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"सूचना कक्षमा जानुहोस्"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"पूरा स्क्रिनसट खिच्नुहोस्"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"सिस्टम / एपका सर्टकटहरूको सूची हेर्नुहोस्"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"पछाडि: अघिल्लो अवस्थामा फर्कनुहोस् (पछाडि बटन)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"होम स्क्रिनमा जानुहोस्"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"खोलिएका एपहरूको विवरण"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"हालसालै खोलिएका एपहरू हेर्नुहोस् (अगाडि)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"हालसालै खोलिएका एपहरू हेर्नुहोस् (पछाडि)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"सबै एप र खोज (अर्थात्, Search/लन्चर) को सूची हेर्नुहोस्"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"टास्कबार लुकाइयोस् र (पुनः) देखाइयोस्"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"सिस्टमका सेटिङमा जानुहोस्"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google सहायक प्रयोग गर्नुहोस्"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाहरू हेर्नुहोस्"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रिनसट खिच्नुहोस्"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"सर्टकटहरू देखाइऊन्"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"पछाडि जानुहोस्"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रिनमा जानुहोस्"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हालसालै चलाइएका एपहरू हेर्ने तरिका"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"हालसालै चलाइएका एपहरू अगाडिबाट हेर्दै जानुहोस्"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"हालसालै चलाइएका एपहरू पछाडिबाट हेर्दै जानुहोस्"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"एपहरूको सूची खोल्नुहोस्"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार देखाइयोस्"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिङ खोल्नुहोस्"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"एसिस्टेन्ट खोल्नुहोस्"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"स्क्रिन लक गर्नुहोस्"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"झट्टै कुनै टिपोट लेख्न Notes एप प्रयोग गर्नुहोस्"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"नोटहरू खोल्नुहोस्"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टम मल्टिटास्किङ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिनमा प्रवेश गर्नुहोस्"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिनमा प्रवेश गर्नुहोस्"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"हालको एप दायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"हालको एप बायाँतर्फ रहने गरी स्प्लिट स्क्रिन मोड सुरु गर्नुहोस्"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रिनको साटो फुल स्क्रिन प्रयोग गर्नुहोस्"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"इनपुट भाषा बदल्नुहोस् (अर्को भाषा)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"इनपुट भाषा बदल्नुहोस् (अघिल्लो भाषा)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"अर्को भाषा प्रयोग गर्नुहोस्"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"अघिल्लो भाषा प्रयोग गर्नुहोस्"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"इमोजी प्रयोग गर्नुहोस्"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"भ्वाइस टाइपिङ प्रयोग गर्नुहोस्"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"एपहरू"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"सहायता"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ब्राउजर (डिफल्ट ब्राउजर: Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"एसिस्टेन्ट"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ब्राउजर"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"कन्ट्याक्टहरू"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"इमेल (डिफल्ट एप: Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"इमेल"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"सङ्गीत"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"पात्रो"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index c8f6c58..60ddb89 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knop <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Terug"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Omhoog"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Omlaag"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Links"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Rechts"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Midden"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spatiebalk"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Meldingen"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Sneltoetsen"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Toetsenbordindeling wisselen"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Tekst wissen"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Sneltoetsen"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sneltoetsen zoeken"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Geen sneltoetsen gevonden"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Invoer"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps openen"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Huidige app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Het meldingenpaneel openen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Een volledige schermafbeeldingen maken"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Lijst van snelkoppelingen voor systeem/apps openen"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Terug: terug naar de vorige status (terugknop)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Het startscherm openen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overzicht van geopende apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Door recente apps navigeren (vooruit)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Door recente apps navigeren (terug)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Toegangslijst van alle apps en zoekopties (bijv. Zoeken/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Taakbalk verbergen en (opnieuw) tonen"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Systeeminstellingen openen"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"De Google Assistent activeren"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Meldingen bekijken"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot maken"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Snelkoppelingen tonen"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Terug"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Naar het startscherm gaan"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Recente apps bekijken"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Vooruitbladeren door recente apps"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Terugbladeren door recente apps"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Lijst met apps openen"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Taakbalk tonen"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Instellingen openen"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistent openen"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Scherm vergrendelen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Notitie-app tevoorschijn halen voor snelle notitie"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notities openen"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systeem-multitasking"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Gesplitst scherm openen met huidige app rechts"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Gesplitst scherm openen met huidige app links"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Van gesplitst scherm naar volledig scherm schakelen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Gesplitst scherm openen met huidige app rechts"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Gesplitst scherm openen met huidige app links"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Van gesplitst scherm naar volledig scherm schakelen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Tijdens gesplitst scherm: een app vervangen door een andere"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Invoer"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Invoertaal veranderen (volgende taal)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Invoertaal veranderen (vorige taal)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Overschakelen naar volgende taal"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Overschakelen naar vorige taal"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emoji\'s openen"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Spraakgestuurd typen activeren"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistentie"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome als standaard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contacten"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail als standaard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziek"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index c62519da..e02a5a7 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ବଟନ୍ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ହୋମ"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ଫେରନ୍ତୁ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ଉପର"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ତଳ"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ବାମ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ଡାହାଣ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"କେନ୍ଦ୍ର"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ସ୍ପେସ୍"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ବିଜ୍ଞପ୍ତି"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"କୀବୋର୍ଡ ସର୍ଟକଟ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"କୀ\'ବୋର୍ଡ୍ର ଲେଆଉଟ୍କୁ ବଦଳାନ୍ତୁ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ଟେକ୍ସଟ ଖାଲି କରନ୍ତୁ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ସର୍ଟକଟଗୁଡ଼ିକ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ସର୍ଟକଟ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"କୌଣସି ସର୍ଟକଟ ମିଳିଲା ନାହିଁ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ଇନପୁଟ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ଆପ୍ସ ଖୋଲନ୍ତୁ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ବର୍ତ୍ତମାନର ଆପ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ବିଜ୍ଞପ୍ତି ସେଡକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ଏକ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନସଟ ନିଅନ୍ତୁ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ସିଷ୍ଟମ / ଆପ୍ସ ସର୍ଟକଟର ଆକ୍ସେସ ତାଲିକା"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ପଛକୁ: ପୂର୍ବ ସ୍ଥିତିକୁ ଫେରି ଯାଆନ୍ତୁ (ପଛକୁ ଯାଆନ୍ତୁ ବଟନ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ହୋମ ସ୍କ୍ରିନକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ଖୋଲାଥିବା ଆପ୍ସର ଓଭରଭିଉ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ସ୍ଵିଚ କରନ୍ତୁ (ଆଗକୁ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ସ୍ଵିଚ କରନ୍ତୁ (ପଛକୁ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ସମସ୍ତ ଆପ୍ସ ଏବଂ ସର୍ଚ୍ଚର ଆକ୍ସେସ ତାଲିକା (ଯଥା ସର୍ଚ୍ଚ/ଲଞ୍ଚର)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ଲୁଚାନ୍ତୁ ଏବଂ (ପୁଣି)ଦେଖାନ୍ତୁ ଟାସ୍କବାର"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ସିଷ୍ଟମ ସେଟିଂସର ଆକ୍ସେସ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantକୁ ଆକ୍ସେସ କରନ୍ତୁ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଭ୍ୟୁ କରନ୍ତୁ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ସ୍କ୍ରିନସଟ ନିଅନ୍ତୁ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ସର୍ଟକଟଗୁଡ଼ିକ ଦେଖାନ୍ତୁ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ପଛକୁ ଫେରନ୍ତୁ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ହୋମ ସ୍କ୍ରିନକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ଆଗକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ବର୍ତ୍ତମାନର ଆପ୍ସ ମଧ୍ୟରେ ପଛକୁ ଯାଆନ୍ତୁ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ଆପ୍ସ ତାଲିକା ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ଟାସ୍କବାର ଦେଖାନ୍ତୁ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ସେଟିଂସ ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ଖୋଲନ୍ତୁ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ଲକ ସ୍କ୍ରିନ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"କ୍ୱିକ ମେମୋ ପାଇଁ Notes ଆପ ଖୋଲନ୍ତୁ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notes ଖୋଲନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ସିଷ୍ଟମ ମଲ୍ଟିଟାସ୍କିଂ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସ୍ଵିଚ କରନ୍ତୁ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSରେ ବର୍ତ୍ତମାନର ଆପ ସହ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ପ୍ରବେଶ କରାନ୍ତୁ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନରୁ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ଇନପୁଟ କରନ୍ତୁ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ଇନପୁଟ ଭାଷା ସ୍ୱିଚ କରନ୍ତୁ (ପରବର୍ତ୍ତୀ ଭାଷା)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ଇନପୁଟ ଭାଷା ସ୍ୱିଚ କରନ୍ତୁ (ପୂର୍ବବର୍ତ୍ତୀ ଭାଷା)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ପରବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ପୂର୍ବବର୍ତ୍ତୀ ଭାଷାକୁ ସୁଇଚ କରନ୍ତୁ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ଇମୋଜି ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ଭଏସ ଟାଇପିଂ ଆକ୍ସେସ କରନ୍ତୁ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ଆପ୍ଲିକେସନ୍"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ସହାୟତା"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ବ୍ରାଉଜର (ଡିଫଲ୍ଟ ଭାବେ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ବ୍ରାଉଜର୍"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"କଣ୍ଟାକ୍ଟ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ଇମେଲ (ଡିଫଲ୍ଟ ଭାବେ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ଇମେଲ୍"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ମ୍ୟୁଜିକ୍"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"କ୍ୟାଲେଣ୍ଡର"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 3f75dfe..4ab6e8be 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ਬਟਨ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"ਸੂਚਨਾਵਾਂ"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"ਕੀ-ਬੋਰਡ ਖਾਕਾ ਬਦਲੋ"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ਲਿਖਤ ਕਲੀਅਰ ਕਰੋ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ਸ਼ਾਰਟਕੱਟ"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ਸ਼ਾਰਟਕੱਟਾਂ ਨੂੰ ਖੋਜੋ"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ਕੋਈ ਸ਼ਾਰਟਕੱਟ ਨਹੀਂ ਮਿਲਿਆ"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ਇਨਪੁੱਟ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ਐਪਾਂ ਖੋਲ੍ਹੋ"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ਮੌਜੂਦਾ ਐਪ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"ਸੂਚਨਾ ਸ਼ੇਡ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ਪੂਰਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"ਸਿਸਟਮ / ਐਪ ਸ਼ਾਰਟਕੱਟਾਂ ਦੀ ਸੂਚੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ਪਿੱਛੇ ਜਾਓ: ਪਿਛਲੀ ਸਥਿਤੀ \'ਤੇ ਵਾਪਸ ਜਾਓ (\'ਪਿੱਛੇ ਜਾਓ\' ਬਟਨ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ਹੋਮ ਸਕ੍ਰੀਨ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ਐਪਾਂ ਖੋਲ੍ਹੋ ਦੀ ਰੂਪ-ਰੇਖਾ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਐਪਾਂ ਦੇਖੋ (ਅੱਗੇ)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਐਪਾਂ ਦੇਖੋ (ਪਿੱਛੇ)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"ਸਾਰੀਆਂ ਐਪਾਂ ਦੀ ਸੂਚੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ ਅਤੇ ਖੋਜੋ (ਜਿਵੇਂ ਕਿ, Search/ਲਾਂਚਰ)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ਟਾਸਕਬਾਰ ਲੁਕਾਓ ਅਤੇ (ਮੁੜ)ਦਿਖਾਓ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistant ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ਸੂਚਨਾਵਾਂ ਦੇਖੋ"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਓ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ਵਾਪਸ ਜਾਓ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਜਾਓ"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਅੱਗੇ ਜਾਓ"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ਹਾਲ ਹੀ ਵਿੱਚ ਖੋਲ੍ਹੀਆਂ ਗਈਆਂ ਐਪਾਂ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ਐਪਾਂ ਦੀ ਸੂਚੀ ਖੋਲ੍ਹੋ"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ਟਾਸਕਬਾਰ ਦਿਖਾਓ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistant ਖੋਲ੍ਹੋ"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ਲਾਕ ਸਕ੍ਰੀਨ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ਤੁਰੰਤ ਮੈਮੋ ਲਈ \'ਨੋਟ-ਕਥਨ\' ਐਪ ਨੂੰ ਉੱਪਰ ਵੱਲ ਖਿੱਚੋ"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"ਨੋਟਸ ਖੋਲ੍ਹੋ"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"ਸਿਸਟਮ ਮਲਟੀਟਾਸਕਿੰਗ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸਵਿੱਚ ਕਰੋ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਬਦਲੋ"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS ਲਈ ਮੌਜੂਦਾ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਤੋਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ਇਨਪੁੱਟ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ਇਨਪੁੱਟ ਭਾਸ਼ਾ ਨੂੰ ਸਵਿੱਚ ਕਰੋ (ਅਗਲੀ ਭਾਸ਼ਾ)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ਇਨਪੁੱਟ ਭਾਸ਼ਾ ਨੂੰ ਸਵਿੱਚ ਕਰੋ (ਪਿਛਲੀ ਭਾਸ਼ਾ)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"ਅਗਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"ਪਿਛਲੀ ਭਾਸ਼ਾ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ਇਮੋਜੀ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"ਅਵਾਜ਼ੀ ਟਾਈਪਿੰਗ ਤੱਕ ਪਹੁੰਚ"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ਸਹਾਇਕ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"ਬ੍ਰਾਊਜ਼ਰ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"ਬ੍ਰਾਊਜ਼ਰ"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"ਸੰਪਰਕ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ਈਮੇਲ (ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਜੋਂ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ਈਮੇਲ"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"ਸੰਗੀਤ"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index a26a5b5..3647bd4 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Przycisk <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Wstecz"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"W górę"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"W dół"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"W lewo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"W prawo"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Do środka"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spacja"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Powiadomienia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Skróty klawiszowe"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Przełącz układ klawiatury"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Czyszczenie tekstu"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Skróty"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Wyszukiwanie skrótów"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nie znaleziono skrótów"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Wprowadzanie"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otwieranie aplikacji"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Bieżąca aplikacja"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Otwieranie obszaru powiadomień"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Robienie pełnego zrzutu ekranu"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Otwieranie listy skrótów do systemu/aplikacji"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Wstecz: powrót do poprzedniego stanu (przycisk Wstecz)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Otwieranie ekranu głównego"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Przegląd otwartych aplikacji"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Przełączanie się między ostatnimi aplikacjami (do przodu)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Przełączanie się między ostatnimi aplikacjami (wstecz)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Otwieranie listy wszystkich aplikacji i wyszukiwanie (tj. wyszukiwarka/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ukrywanie i ponowne pokazywanie paska aplikacji"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Otwieranie ustawień systemu"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Otwieranie Asystenta Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Wyświetlanie powiadomień"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Robienie zrzutu ekranu"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Pokazywanie skrótów"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Przechodzenie wstecz"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Wyświetlanie ekranu głównego"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Wyświetlanie ostatnich aplikacji"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Przełączanie się do przodu między ostatnimi aplikacjami"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Przełączanie się wstecz między ostatnimi aplikacjami"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otwieranie listy aplikacji"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Pokazywanie paska aplikacji"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otwieranie ustawień"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otwieranie asystenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Blokada ekranu"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otwieranie aplikacji do notatek w przypadku szybkich notatek"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otwieranie notatek"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Wielozadaniowość w systemie"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po prawej"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po lewej"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Przełączanie podzielonego ekranu na pełny ekran"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po prawej"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Uruchamianie trybu podzielonego ekranu z bieżącą aplikacją po lewej"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Przełącz podzielony ekran na pełny ekran"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Podczas podzielonego ekranu: zastępowanie aplikacji"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Wprowadzanie"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Przełączanie języka wprowadzania (następny język)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Przełączanie języka wprowadzania (poprzedni język)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Przełączanie na następny język"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Przełączanie na poprzedni język"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Otwieranie emotikonów"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Otwieranie pisania głosowego"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacje"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoc"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Przeglądarka (domyślnie Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asystent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Przeglądarka"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (domyślnie Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzyka"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendarz"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 4b56060..329f40a 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Voltar"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centralizar"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Apagar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Atalhos de pesquisa"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertos"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acessar a aba de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Capturar toda a tela"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acessar lista de atalhos do sistema / de apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Voltar ao estado anterior (botão \"Voltar\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acessar a tela inicial"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visão geral dos apps abertos"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer apps recentes (avançar)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer apps recentes (voltar)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acessar lista de todos os apps e pesquisa (por exemplo, Pesquisa/Tela de início)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e mostrar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acessar configurações do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acessar o Google Assistente"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostrar as notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer uma captura de tela"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir para a tela inicial"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Conferir os apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fazer uma anotação rápida no app Notes"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir observações"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Usar a tela dividida com o app atual à direita"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Usar a tela dividida com o app atual à esquerda"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mudar de tela dividida para tela cheia"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Com a tela dividida: substituir um app por outro"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Trocar o idioma de entrada (próximo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Trocar o idioma de entrada (anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para o idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acessar emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acessar a digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicativos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 09c48cb..1b22929 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Início"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Anterior"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Seta para cima"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Seta para baixo"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Seta para a esquerda"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Seta para a direita"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Ao centro"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espaço"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos de teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar esquema de teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Limpar texto"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ou"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Limpar consulta de pesquisa"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Pesquise atalhos"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertas"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Aceda ao painel de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Faça uma captura de ecrã completa"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Aceda à lista dos atalhos de apps/sistema"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Anterior: volte ao estado anterior (botão anterior)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Aceda ao ecrã principal"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Vista geral das apps abertas"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorra as apps recentes (para a frente)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorra as apps recentes (para trás)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Aceda à lista de todas as apps e pesquise (por ex., Pesquisa/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Oculte e volte a apresentar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Aceda às definições do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Aceda ao Assistente Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"A mostrar resultados da pesquisa"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"A mostrar atalhos do sistema"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"A mostrar atalhos de introdução"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"A mostrar atalhos que abrem apps"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"A mostrar atalhos para a app atual"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer captura de ecrã"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Aceder ao ecrã principal"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Percorrer apps recentes para a frente"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Percorrer apps recentes para trás"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir definições"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ecrã de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Inicie a app Notas para criar uma nota rápida"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir notas"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Execução de várias tarefas em simultâneo no sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Aceda ao ecrã dividido com a app atual para RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Aceda ao ecrã dividido com a app atual para LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mude do ecrã dividido para o ecrã inteiro"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Durante o ecrã dividido: substitua uma app por outra"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Aceder ao ecrã dividido com a app atual para RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Aceder ao ecrã dividido com a app atual para LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mude de ecrã dividido para ecrã inteiro"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante o ecrã dividido: substituir uma app por outra"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Mude de idioma de entrada (idioma seguinte)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Mude de idioma de entrada (idioma anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para idioma seguinte"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Aceda a emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Aceda à digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Apps"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistência"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome como predefinição)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contactos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail como predefinição)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendário"</string>
@@ -1076,7 +1082,7 @@
<string name="person_available" msgid="2318599327472755472">"Disponível"</string>
<string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Ocorreu um problema ao ler o medidor da bateria"</string>
<string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Toque para obter mais informações"</string>
- <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme defin."</string>
+ <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Nenhum alarme definido"</string>
<string name="accessibility_bouncer" msgid="5896923685673320070">"introduzir bloqueio de ecrã"</string>
<string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Sensor de impressões digitais"</string>
<string name="accessibility_authenticate_hint" msgid="798914151813205721">"autenticar"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 4b56060..329f40a 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Botão <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Voltar"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Para cima"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Para baixo"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Para a esquerda"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Para a direita"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centralizar"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificações"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Atalhos do teclado"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Alterar layout do teclado"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Apagar texto"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Atalhos"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Atalhos de pesquisa"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenhum atalho encontrado"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Entrada"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apps abertos"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"App atual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Acessar a aba de notificações"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Capturar toda a tela"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Acessar lista de atalhos do sistema / de apps"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Voltar ao estado anterior (botão \"Voltar\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Acessar a tela inicial"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Visão geral dos apps abertos"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Percorrer apps recentes (avançar)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Percorrer apps recentes (voltar)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Acessar lista de todos os apps e pesquisa (por exemplo, Pesquisa/Tela de início)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ocultar e mostrar a barra de tarefas"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Acessar configurações do sistema"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Acessar o Google Assistente"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Mostrar as notificações"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fazer uma captura de tela"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar atalhos"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Voltar"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir para a tela inicial"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Conferir os apps recentes"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avançar pela lista de apps recentes"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Voltar pela lista de apps recentes"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de apps"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar a Barra de tarefas"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir configurações"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir o Google Assistente"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Tela de bloqueio"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fazer uma anotação rápida no app Notes"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Abrir observações"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitarefa do sistema"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Usar a tela dividida com o app atual à direita"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Usar a tela dividida com o app atual à esquerda"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Mudar de tela dividida para tela cheia"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Com a tela dividida: substituir um app por outro"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Usar a tela dividida com o app atual à direita"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Usar a tela dividida com o app atual à esquerda"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar da tela dividida para a tela cheia"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Com a tela dividida: substituir um app por outro"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Trocar o idioma de entrada (próximo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Trocar o idioma de entrada (anterior)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para o próximo idioma"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Mudar para o idioma anterior"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Acessar emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Acessar a digitação por voz"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicativos"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Assistente"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Navegador (Chrome por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google Assistente"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Navegador"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Contatos"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (Gmail por padrão)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Música"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Agenda"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index aaf20f3..73da4e7 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -107,7 +107,7 @@
<string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"Începe înregistrarea"</string>
<string name="screenrecord_audio_label" msgid="6183558856175159629">"Înregistrează audio"</string>
<string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Conținutul audio de la dispozitiv"</string>
- <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de sonerie"</string>
+ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sunetul de la dispozitiv, precum muzică, apeluri și tonuri de apel"</string>
<string name="screenrecord_mic_label" msgid="2111264835791332350">"Microfon"</string>
<string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Conținutul audio de la dispozitiv și microfon"</string>
<string name="screenrecord_continue" msgid="4055347133700593164">"Începe"</string>
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butonul <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"La început"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Înapoi"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"În sus"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"În jos"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"La stânga"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"La dreapta"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Săgeată în sus"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Săgeată în jos"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Săgeată spre stânga"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Săgeată spre dreapta"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"În centru"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Spațiu"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Notificări"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Comenzi rapide de la tastatură"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Schimbă aspectul tastaturii"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Șterge textul"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"sau"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Șterge termenul de căutare"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Comenzi rapide"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Caută comenzi rapide"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nu există comenzi rapide"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Introducere"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Aplicații deschise"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aplicația actuală"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Accesează fereastra de notificări"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Fă o captură de ecran completă"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Accesează lista comenzilor rapide pentru sistem / aplicații"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Înapoi: revino la starea anterioară (butonul înapoi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Accesează ecranul de pornire"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Prezentare generală a aplicațiilor deschise"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Parcurge aplicațiile recente (înainte)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Parcurge aplicațiile recente (înapoi)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Accesează lista tuturor aplicațiilor și caută (Căutare / Lansator)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ascunde și reafișează bara de activități"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accesează setările de sistem"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accesează Asistentul Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Se afișează rezultatele căutării"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Se afișează comenzile rapide de sistem"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Se afișează comenzile rapide pentru introducere"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Se afișează comenzile rapide care deschid aplicațiile"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Se afișează comenzile rapide pentru aplicația actuală"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Vezi notificările"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Fă o captură de ecran"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Afișează comenzile rapide"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Înapoi"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Accesează ecranul de pornire"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Vezi aplicațiile recente"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Parcurge aplicațiile recente înainte"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Parcurge aplicațiile recente înapoi"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Deschide lista de aplicații"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afișează bara de activități"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Deschide setările"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Deschide Asistentul"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ecranul de blocare"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Accesează aplicația Note pentru notițe rapide"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Deschide notele"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking pe sistem"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Comută de la ecranul împărțit la ecranul complet"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Accesează ecranul împărțit cu aplicația actuală în dreapta"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Accesează ecranul împărțit cu aplicația actuală în stânga"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Comută de la ecranul împărțit la ecranul complet"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"În modul ecran împărțit: înlocuiește o aplicație cu alta"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Introducere"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Schimbă limba de introducere a textului (limba următoare)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Schimbă limba de introducere a textului (limba anterioară)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Comută la următoarea limbă"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Comută la limba anterioară"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Accesează emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Accesează tastarea vocală"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicații"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistent"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome este setat ca prestabilit)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Agendă"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-mail (aplicația Gmail este setată ca prestabilită)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzică"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 3836a29..ee3945d 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Главный экран"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрелка вверх"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрелка вниз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрелка влево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрелка вправо"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центральная стрелка"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Пробел"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Уведомления"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Быстрые клавиши"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Переключение раскладки"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Очистить строку поиска"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Сочетания клавиш"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Поиск сочетаний клавиш"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Нет сочетаний клавиш."</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Ввод"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Запущенные приложения"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Это приложение"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Показать панель уведомлений"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Сделать скриншот всего экрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Открыть список сочетаний клавиш для системы и приложений"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Возврат к предыдущему состоянию (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Открыть главный экран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Открыть список запущенных приложений"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Просмотреть недавние приложения (в обычном порядке)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Просмотреть недавние приложения (в обратном порядке)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Открыть список всех приложений и результатов поиска (Поиск/Панель запуска)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скрыть/показать панель задач"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Открыть настройки системы"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Запустить Google Ассистента"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Посмотреть уведомления"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Сделать скриншот"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показать сочетания клавиш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Вернуться назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перейти на главный экран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Посмотреть недавние приложения"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прокрутить вперед список недавних приложений"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прокрутить назад список недавних приложений"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Открыть список приложений"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показать панель задач"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Открыть настройки"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Открыть Ассистента"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокировать экран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Создать быструю заметку"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Открыть заметки"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Режим многозадачности"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Включить разделение экрана с текущим приложением справа"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Включить разделение экрана с текущим приложением слева"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Переключиться из режима разделения экрана в полноэкранный режим"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"В режиме разделения экрана заменить одно приложение другим"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Включить разделение экрана с текущим приложением справа"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Включить разделение экрана с текущим приложением слева"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Изменить режим разделения экрана на полноэкранный режим"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"В режиме разделения экрана заменить одно приложение другим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Ввод"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Переключиться на следующий язык ввода"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Переключиться на предыдущий язык ввода"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Выбрать следующий язык"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Выбрать предыдущий язык"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Открыть список эмодзи"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Активировать голосовой ввод"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Приложения"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помощник"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Браузер (по умолчанию Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Открыть Ассистента"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Браузер"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакты"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Электронная почта (по умолчанию Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Эл. почта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музыка"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календарь"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 409379c..e03c7c0 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> බොත්තම"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home යතුර"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"ආපසු"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"උඩු"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"යටි"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"වම්"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"දකුණු"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"මැද"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ඉඩ යතුර"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"දැනුම්දීම්"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"යතුරු පුවරු කෙටිමං"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"යතුරුපුවරු පිරිසැලසුම මාරු කරන්න"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"පෙළ හිස් කරන්න"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"කෙටිමං"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"කෙටිමං සොයන්න"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"කෙටිමං හමු නොවුණි"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ආදානය"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"විවෘත යෙදුම්"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"වත්මන් යෙදුම"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"දැනුම්දීම් සෙවනට ප්රවේශ වන්න"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"පූර්ණ තිර රුවක් ගන්න"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"පද්ධති / යෙදුම් කෙටිමං ලැයිස්තුවට ප්රවේශ වන්න"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ආපසු: පෙර තත්ත්වයට ආපසු යන්න (ආපසු බොත්තම)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"මුල් තිරයට ප්රවේශ වන්න"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"විවෘත යෙදුම් පිළිබඳ දළ විශ්ලේෂණය"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"මෑත යෙදුම් හරහා කාලක්රම කරන්න (ඉදිරියට)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"මෑත යෙදුම් හරහා කාලක්රම කරන්න (ආපසු)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"සියලු යෙදුම් සහ සෙවීම් ලැයිස්තුවට ප්රවේශය (එනම් සෙවීම/දියත් කිරීම)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"කාර්ය තීරුව සඟවන්න සහ (යළි) පෙන්වන්න"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"පද්ධති සැකසීම් වෙත ප්රවේශ වන්න"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google සහායක වෙත ප්රවේශ වන්න"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"දැනුම්දීම් බලන්න"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"තිර රුව ගන්න"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"කෙටිමං පෙන්වන්න"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ආපසු යන්න"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"මුල් තිරය වෙත යන්න"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"මෑත යෙදුම් බලන්න"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"මෑත යෙදුම් හරහා ඉදිරියට කාලක්රම කරන්න"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"මෑත යෙදුම් හරහා ආපස්සට කාලක්රම කරන්න"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"යෙදුම් ලැයිස්තුව විවෘත කරන්න"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"කාර්ය තීරුව පෙන්වන්න"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"සැකසීම් විවෘත කරන්න"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"සහායක විවෘත කරන්න"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"තිරය අගුළු දමන්න"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"ඉක්මන් සිහිපත සඳහා සටහන් යෙදුම අදින්න"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"සටහන් විවෘත කරන්න"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"පද්ධති බහු කාර්ය"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්රතිස්ථාපනය කරන්න"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHS වෙත වත්මන් යෙදුම සමග බෙදුම් තිරයට ඇතුළු වන්න"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"බෙදුම් තිරයේ සිට පූර්ණ තිරයට මාරු වන්න"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්රතිස්ථාපනය කරන්න"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ආදානය"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ආදාන භාෂාව මාරු කරන්න (මීළඟ භාෂාව)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ආදාන භාෂාව මාරු කරන්න (පෙර භාෂාව)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"මීළඟ භාෂාවට මාරු වන්න"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"පෙර භාෂාවට මාරු වන්න"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ඉමොජි වෙත ප්රවේශ වන්න"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"හඬ ටයිප් කිරීමට ප්රවේශ වන්න"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"යෙදුම්"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"සහාය"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"බ්රව්සරය (Chrome පෙරනිමිය ලෙස)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"සහායක"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"බ්රවුසරය"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"සම්බන්ධතා"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ඉ-තැපෑල (Gmail පෙරනිමිය ලෙස)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ඊ-තැපෑල"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"සංගීතය"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"දින දර්ශනය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index b4bf8d3..ca49d66 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Tlačidlo <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Domov"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Späť"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Nahor"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Nadol"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Doľava"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Doprava"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Do stredu"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Medzerník"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Upozornenia"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klávesové skratky"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Prepnúť rozloženie klávesnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Vymazať text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Skratky"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Hľadajte skratky"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nenašli sa žiadne skratky"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vstup"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Otvorenie apl."</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuálna aplik."</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Prístup k panelu upozornení"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Vytvorenie snímky celej obrazovky"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Zoznam prístupov systému a odkazy do aplikácií"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Späť: prechod na predchádzajúci stav (tlačidlo Späť)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Prístup k ploche"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Prehľad otvorených aplikácií"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Cyklické prechádzanie nedávnymi aplikáciami (dopredu)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Cyklické prechádzanie nedávnymi aplikáciami (dozadu)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Zoznam prístupov všet. aplik. a vyhľad. (teda Vyhľadávanie a Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skrytie a opätovné zobrazenie panela úloh"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Prístup k nastaveniam systému"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Prístup k Asistentovi Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Zobrazenie upozornení"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Vytvorenie snímky obrazovky"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Zobrazenie skratiek"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Prechod späť"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Prechod na plochu"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Zobrazenie nedávnych aplikácií"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Cyklické prechádzanie dopredu po nedávnych aplikáciách"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Cyklické prechádzanie dozadu po nedávnych aplikáciách"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Otvorenie zoznamu aplikácií"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Zobrazenie panela aplikácií"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Otvorenie nastavení"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Otvorenie Asistenta"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zamknúť obrazovku"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Otvorenie aplikácie Poznámky na rýchle zapisovanie"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Otvorenie poznámok"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking systému"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Prepnutie rozdelenej obrazovky na celú"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Rozdelenie obrazovky s aktuálnou aplikáciou vpravo"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Rozdelenie obrazovky s aktuálnou aplikáciou vľavo"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Prepnutie rozdelenej obrazovky na celú"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Počas rozdelenej obrazovky: nahradenie aplikácie inou"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vstup"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Prepnutie vstupného jazyka (ďalší jazyk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Prepnutie vstupného jazyka (predchádzajúci jazyk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Prepnutie na ďalší jazyk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Prepnutie na predchádzajúci jazyk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Prístup k emodži"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Prístup k hlasovému zadávaniu"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikácie"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomocná aplikácia"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Prehliadač (Chrome ako predvolený)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Prehliadač"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakty"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Pošta (Gmail ako predvolená služba)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-mail"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Hudba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendár"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 8c4bd73..b03d7ff 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Gumb <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Začetek"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nazaj"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Gor"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Dol"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Levo"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Desno"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Puščica gor"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Puščica dol"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Puščica levo"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Puščica desno"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Sredina"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Preslednica"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Obvestila"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Bližnjične tipke"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Preklop postavitve tipkovnice"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Izbris besedila"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"ali"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Čiščenje iskalne poizvedbe"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Bližnjice"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Iskanje bližnjic"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Ni najdenih bližnjic."</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vnos"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Odprte aplikacije"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Trenutna aplikacija"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Dostop do zaslona z obvestili"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ustvarjanje posnetka celotnega zaslona"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Dostop do seznama sistemskih bližnjic in bližnjic do aplikacij"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nazaj: Vrnitev v prejšnje stanje (gumb za vrnitev)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Dostop do začetnega zaslona"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pregled odprtih aplikacij"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Krožno preklapljanje med nedavnimi aplikacijami (naprej)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Krožno preklapljanje med nedavnimi aplikacijami (nazaj)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Dostop do seznama vseh aplikacij in iskanja (tj. iskanje/zaganjalnik)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Skritje in (vnovični) prikaz opravilne vrstice"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Dostop do sistemskih nastavitev"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Dostop do Pomočnika Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Prikaz rezultatov iskanja"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Prikaz sistemskih bližnjic"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Prikaz bližnjic za vnos"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Prikaz bližnjic, s katerimi odprete aplikacije"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Prikaz bližnjic za trenutno aplikacijo"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ogled obvestil"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ustvarjanje posnetka zaslona"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Prikaz bližnjic"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Nazaj"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pomik na začetni zaslon"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ogled nedavnih aplikacij"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Pomikanje naprej po nedavnih aplikacijah"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Pomikanje nazaj po nedavnih aplikacijah"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Odpiranje seznama aplikacij"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Prikaz opravilne vrstice"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Odpiranje nastavitev"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Odpiranje Pomočnika"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Zaklepanje zaslona"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Priklic aplikacije za zapiske za zapis hitre zabeležke"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Odpiranje zapiskov"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistemska večopravilnost"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Pri razdeljenem zaslonu: Medsebojna zamenjava aplikacij"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vklop razdeljenega zaslona s trenutno aplikacijo na desni"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vklop razdeljenega zaslona s trenutno aplikacijo na levi"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Preklop iz razdeljenega zaslona v celozaslonski način"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vnosna naprava"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Preklop jezika vnosa (naslednji jezik)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Preklop jezika vnosa (prejšnji jezik)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Preklop na naslednji jezik"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Preklop na prejšnji jezik"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Dostop do emodžijev"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Dostop do glasovnega tipkanja"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacije"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Pomoč"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brskalnik (privzeto Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Pomočnik"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brskalnik"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Stiki"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-pošta (privzeto Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-pošta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sporočila SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Glasba"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Koledar"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 5a1cd59..c779b65 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet ngadalë • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Po karikohet • Plot për <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Rrëshqit shpejt majtas për të filluar udhëzuesin e përbashkët"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Hap modifikuesin e miniaplikacionit"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Hiq një miniaplikacion"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Shto miniaplikacionin"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Të gjitha aplikacionet dhe të dhënat në këtë sesion do të fshihen."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Butoni <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Kreu"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Prapa"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Lart"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Poshtë"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Majtas"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Djathtas"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Qendror"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Hapësirë"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Njoftimet"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Shkurtoret e tastierës"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Ndërro strukturën e tastierës"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Pastro tekstin"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Shkurtoret"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Kërko shkurtoret"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Nuk u gjet shkurtore"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Hyrja"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Apl. e hapura"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Apl. aktual"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Qasu te streha e njoftimeve"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Bëj një pamje të plotë ekrani"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Qasu te lista e sistemeve/shkurtoreve të aplikacioneve"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Pas: kthehu pas te gjendja e mëparshme (butoni pas)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Qasu tek ekrani bazë"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Përmbledhje e aplikacioneve të hapura"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Lëviz mes aplikacioneve të fundit (përpara)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Lëviz mes aplikacioneve të fundit (pas)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Qasu te lista e aplikacioneve dhe kërko (p.sh. Kërko/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fshih dhe (ri)shfaq shiritin e detyrave"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Qasu te cilësimet e sistemit"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Qasu tek \"Asistenti i Google\""</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Shiko njoftimet"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Nxirr një pamje ekrani"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Shfaq shkurtoret"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Kthehu prapa"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Shko tek ekrani bazë"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Shiko aplikacionet e fundit"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Lëviz përpara përmes aplikacioneve të fundit"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Lëviz prapa përmes aplikacioneve të fundit"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Hap listën e aplikacioneve"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Shfaq shiritin e detyrave"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Hap cilësimet"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Hap \"Asistentin\""</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ekrani i kyçjes"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Hap aplikacionin \"Shënimet\" për një memorandum të shpejtë"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Hap \"Shënimet\""</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Kryerja e shumë detyrave nga sistemi"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Fut ekranin e ndarë me aplikacionin aktual te RHS-ja"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Fut ekranin e ndarë me aplikacionin aktual te LHS-ja"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Gjatë ekranit të ndarë: zëvendëso një aplikacion nga një te një tjetër"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e djathtë"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Hyr në ekranin e ndarë me aplikacionin aktual në anën e majtë"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Kalo nga ekrani i ndarë në ekranin e plotë"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Hyrja"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Ndërro gjuhën e hyrjes (gjuha tjetër)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Ndërro gjuhën e hyrjes (gjuha e mëparshme)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Kalo te gjuha tjetër"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Kalo te gjuha e mëparshme"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Qasu te emoji-t"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Qasu te shkrimi me zë"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplikacionet"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistenti"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Shfletuesi (Chrome si i parazgjedhur)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistenti"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Shfletuesi"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktet"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail si i parazgjedhur)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email-i"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muzikë"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendari"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 887f5c6..48673b9 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Дугме <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Тастер Почетна"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Тастер Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Тастер са стрелицом нагоре"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Тастер са стрелицом надоле"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Тастер са стрелицом налево"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Тастер са стрелицом надесно"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Тастер са централном стрелицом"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Размак"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Обавештења"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Тастерске пречице"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Промени распоред тастатуре"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Обришите текст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Пречице"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Претражите пречице"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Нису пронађене пречице"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Унос"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Отварање аплик"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Актуелна аплик"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Приступ траци са обавештењима"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Снимање екрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Приступ листи пречица за систем/апликације"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: назад на претходно стање (дугме Назад)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Приступ почетном екрану"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Преглед отворених апликација"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Преглед недавних апликација (напред)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Преглед недавних апликација (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Приступ листи свих алпикација и претрага (нпр. Претрага/Покретач)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скривање и поновно приказивање траке задатака"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Приступ подешавањима система"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Приступ Google помоћнику"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Прикажи обавештења"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Направи снимак екрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Прикажи пречице"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Иди на почетни екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Прегледај недавно коришћене апликације"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Прегледај недавно коришћене апликације унапред"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Прегледај недавно коришћене апликације уназад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Отвори листу апликација"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Прикажи траку задатака"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Отвори подешавања"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Отвори помоћника"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Закључавање екрана"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Отварање апликације Белешке за брзо прављење белешке"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Отвори белешке"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Обављање више задатака система истовремено"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Покретање подељеног екрана за актуелну апликацију на десној страни"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Покретање подељеног екрана за актуелну апликацију на левој страни"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Прелазак са подељеног екрана на цео екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Током подељеног екрана: замена једне апликације другом"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Покрени подељени екран за актуелну апликацију на десној страни"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Покрени подељени екран за актуелну апликацију на левој страни"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Пређи са подељеног екрана на цео екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"У режиму подељеног екрана: замена једне апликације другом"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Унос"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Промена језика уноса (следећи језик)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Промена језика уноса (претходни језик)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Пређи на следећи језик"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Пређи на претходни језик"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Приступ емоџијима"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Приступ уносу текста гласом"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Апликације"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Апликација за помоћ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Прегледач (подразумевано Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Помоћник"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Прегледач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Имејл (Gmail као подразумевани)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Имејл"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 3f9e45c..0b2cab0 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Knappen <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Start"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Tillbaka"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Upp"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Ned"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Vänster"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Höger"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrera"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Blanksteg"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Aviseringar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Kortkommandon"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Byt tangentbordslayout"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Rensa text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kortkommandon"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sök efter kortkommando"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Inga resultat"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Inmatning"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Öppna appar"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Aktuell app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Öppna meddelandepanelen"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Ta en skärmbild av hela skärmen"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Öppna lista över system- och appgenvägar"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Bakåt: gå tillbaka till föregående läge (bakåtknapp)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Öppna startskärmen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Översikt över öppna appar"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Bläddra igenom de senaste apparna (framåt)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Bläddra igenom de senaste apparna (bakåt)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Öppna en lista över alla appar och sökningar (t.ex. Sök/Appstartaren)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Dölj och visa aktivitetsfältet"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Öppna systeminställningarna"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Öppna Google Assistent"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Se aviseringar"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ta skärmbild"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Se genvägar"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Tillbaka"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Öppna startskärmen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Se de senaste apparna"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Bläddra framåt bland de senaste apparna"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Bläddra bakåt bland de senaste apparna"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Öppna applistan"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Se aktivitetsfält"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Öppna inställningarna"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Öppna assistenten"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skärmen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Ta fram anteckningsappen för en snabb anteckning"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Öppna anteckningar"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systemets multikörning"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Öppna delad skärm med aktuell app till höger"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Öppna delad skärm med aktuell app till vänster"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Byt mellan delad skärm och helskärm"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Med delad skärm: ersätt en app med en annan"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Öppna delad skärm med aktuell app till höger"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Öppna delad skärm med aktuell app till vänster"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Byt mellan delad skärm och helskärm"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Med delad skärm: ersätt en app med en annan"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inmatning"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Byt inmatningsspråk (nästa språk)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Byt inmatningsspråk (föregående språk)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Byt till nästa språk"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Byt till föregående språk"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Öppna emojis"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Öppna röststyrning"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Appar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Hjälp"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Webbläsare (Chrome som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Webbläsare"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontakter"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-post (Gmail som standard)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-post"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"Sms"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalender"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 007f0d3..3cd5345 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -640,10 +640,10 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Kitufe cha <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Mwanzo"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Nyuma"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Juu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Chini"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kushoto"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Kulia"</string>
+ <string name="keyboard_key_dpad_up" msgid="7199805608386368673">"Kishale cha juu"</string>
+ <string name="keyboard_key_dpad_down" msgid="3354221123220737397">"Kishale cha chini"</string>
+ <string name="keyboard_key_dpad_left" msgid="144176368026538621">"Kishale cha kushoto"</string>
+ <string name="keyboard_key_dpad_right" msgid="8485763312139820037">"Kishale cha kulia"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Katikati"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +671,8 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Arifa"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mikato ya Kibodi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Badili mkao wa kibodi"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Futa maandishi"</string>
+ <string name="keyboard_shortcut_join" msgid="3578314570034512676">"au"</string>
+ <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"Futa hoja ya utafutaji"</string>
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Njia za mkato"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tafuta njia za mkato"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Hakuna njia za mkato zilizopatikana"</string>
@@ -679,35 +680,40 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Vifaa vya kuingiza data"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Fungua programu"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Programu ya sasa"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Fikia sehemu ya arifa"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Piga picha kamili ya skrini"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Orodha ya ufikiaji ya mfumo / njia za mikato za programu"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Nyuma: rudi kwenye hali ya awali (kitufe cha nyuma)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Fikia skrini ya kwanza"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Muhtasari wa programu zilizofunguliwa"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Pitia programu za hivi karibuni (mbele)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Pitia programu za hivi karibuni (nyuma)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Orodha ya ufikiaji ya programu na utafutaji wote (k.m. Utafutaji/Kifungua programu)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ficha na uonyeshe upya upauzana"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Fikia mipangilio ya mfumo"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Fikia programu ya Mratibu wa Google"</string>
+ <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"Inaonyesha matokeo ya utafutaji"</string>
+ <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"Inaonyesha njia za mkato za mfumo"</string>
+ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Inaonyesha njia za mkato za kuingiza data"</string>
+ <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Inaonyesha njia za mkato za kufungua programu"</string>
+ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Inaonyesha njia za mkato za programu unayotumia kwa sasa"</string>
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Tazama arifa"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Kupiga picha ya skrini"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Onyesha njia za mkato"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Rudi nyuma"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Nenda kwenye skrini ya kwanza"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Angalia programu ulizofungua hivi majuzi"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Nenda mbele kwenye programu ulizofungua awali"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Rudi nyuma kwenye programu ulizofungua awali"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Fungua orodha ya programu"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Onyesha upauzana"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Fungua mipangilio"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Fungua programu ya Mratibu wa Google"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Funga skrini"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Fungua programu ya Madokezo ili uandike taarifa"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Fungua madokezo"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Majukumu mengi ya mfumo"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Weka Skrini iliyogawanywa na programu ya sasa kwenye upande wa kulia"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Weka Skrini iliyogawanywa na programu ya sasa kwenye upande wa kushoto"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Badilisha kutoka Skrini iliyogawanywa utumie skrini nzima"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Wakati wa Skrini iliyogawanywa: badilisha kutoka programu moja hadi nyingine"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Tumia programu kwenye skrini iliyogawanywa upande wa kulia"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Tumia programu kwenye skrini iliyogawanywa upande wa kushoto"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Badilisha kutoka skrini iliyogawanywa utumie skrini nzima"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Vifaa vya kuingiza data"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Badilisha lugha ya kuweka data (lugha inayofuata)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Badilisha lugha ya kuweka data (lugha ya awali)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Badilisha utumie lugha inayofuata"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Badilisha utumie lugha iliyotangulia"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Fikia emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Fikia kuandika kwa kutamka"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Programu"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Programu ya usaidizi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Kivinjari (Chrome iwe chaguomsingi)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Programu ya Mratibu"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Kivinjari"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Anwani"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Barua pepe (Gmail iwe chaguomsingi)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Barua pepe"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Muziki"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalenda"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index e5cf3b2..7989a35 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> பட்டன்"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"ஹோம்"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"பேக்"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"மேலே"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"கீழே"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"இடது"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"வலது"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"நடு"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"ஸ்பேஸ்"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"அறிவிப்புகள்"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"கீபோர்டு ஷார்ட்கட்கள்"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"கீபோர்டு லே அவுட்டை மாற்று"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"வார்த்தைகளை அழிக்கும்"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"ஷார்ட்கட்கள்"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ஷார்ட்கட்களைத் தேடுக"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ஷார்ட்கட்கள் எதுவுமில்லை"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"உள்ளீடு"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"திறந்த ஆப்ஸ்"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"தற்போதைய ஆப்ஸ்"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"அறிவிப்பு விவரத்திற்கான அணுகல்"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"முழு ஸ்கிரீன்ஷாட் எடுத்தல்"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"சிஸ்டம் / ஆப்ஸ் ஷார்ட்கட்களுக்கான அணுகல் பட்டியல்"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"பின்செல்: முந்தைய நிலைக்குச் செல்லுதல் (பின்செல்வதற்கான பட்டன்)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"முகப்புத் திரைக்கான அணுகல்"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"திறந்திருக்கும் ஆப்ஸைப் பார்த்தல்"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"சமீபத்திய ஆப்ஸுக்கிடையில் (பிந்தையது) மாறுதல்"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"சமீபத்திய ஆப்ஸுக்கிடையில் (முந்தையது) மாறுதல்"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"அனைத்து ஆப்ஸ் மற்றும் தேடலுக்குமான (தேடல், தொடக்கி) அணுகல் பட்டியல்"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"செயல் பட்டியை மறைத்தல் மற்றும் (மீண்டும்) காட்டுதல்"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"சிஸ்டம் அமைப்புகளுக்கான அணுகல்"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantடிற்கான அணுகல்"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"அறிவிப்புகளைக் காட்டுதல்"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ஸ்கிரீன்ஷாட் எடுத்தல்"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"ஷார்ட்கட்களைக் காட்டுதல்"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"பின்செல்லுதல்"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"முகப்புத் திரைக்குச் செல்லுதல்"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"சமீபத்திய ஆப்ஸைக் காட்டுதல்"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"சமீபத்திய ஆப்ஸுக்கு முன்னோக்கிச் செல்லுதல்"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"சமீபத்திய ஆப்ஸுக்குப் பின்னோக்கிச் செல்லுதல்"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ஆப்ஸ் பட்டியலைத் திறத்தல்"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"செயல் பட்டியைக் காட்டுதல்"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"அமைப்புகளைத் திறத்தல்"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistantடைத் திறத்தல்"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"பூட்டுத் திரை"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"மெமோவை விரைவாகத் தயாரிக்க Notes ஆப்ஸைப் பயன்படுத்துதல்"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"குறிப்புகளைத் திறத்தல்"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"சிஸ்டம் பல வேலைகளைச் செய்தல்"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாறுதல்"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"வலதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"இடதுபுறத்தில் தற்போதைய ஆப்ஸ் தோன்றுமாறு திரைப் பிரிப்பை அமைத்தல்"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"திரைப் பிரிப்பு பயன்முறையிலிருந்து முழுத்திரைக்கு மாற்றுதல்"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"உள்ளீடு"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"உள்ளீட்டு மொழியை மாற்றுதல் (அடுத்த மொழி)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"உள்ளீட்டு மொழியை மாற்றுதல் (முந்தைய மொழி)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"அடுத்த மொழிக்கு மாற்றுதல்"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"முந்தைய மொழிக்கு மாற்றுதல்"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ஈமோஜிக்கான அணுகல்"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"குரல் டைப்பிங்கிற்கான அணுகல்"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ஆப்ஸ்"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"அசிஸ்ட்"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"உலாவி (இயல்பாக Chrome இருக்கும்)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"உலாவி"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"தொடர்புகள்"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"மின்னஞ்சல் (இயல்பாக Gmail இருக்கும்)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"மின்னஞ்சல்"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"மியூசிக்"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 8ec3905..6b2c032 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"బటన్ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"వెనుకకు"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"పైకి"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"కిందికి"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ఎడమ"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"కుడి"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"మధ్య"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"అంతరం"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"నోటిఫికేషన్లు"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"కీబోర్డ్ షార్ట్కట్లు"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"కీబోర్డ్ లేఅవుట్ను మార్చండి"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"టెక్స్ట్ను క్లియర్ చేయండి"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"షార్ట్కట్లు"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"షార్ట్కట్స్ సెర్చ్ చేయండి"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"షార్ట్కట్లు ఏవీ లేవు"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ఇన్పుట్"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"యాప్స్ తెరవండి"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"ప్రస్తుత యాప్"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"నోటిఫికేషన్ తెరను యాక్సెస్ చేయండి"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"పూర్తి స్క్రీన్షాట్ తీసుకోండి"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"సిస్టమ్ / యాప్స్ షార్ట్కట్స్ లిస్ట్ను యాక్సెస్ చేయండి"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"వెనుకకు: మునుపటి స్థితికి తిరిగి వెళ్లండి (వెనుకకు బటన్)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"మొదటి స్క్రీన్ను యాక్సెస్ చేయండి"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Overview of open apps"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"ఇటీవలి యాప్లను ఒక్కొక్కటిగా చూడండి (ముందుకు)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"ఇటీవలి యాప్లను ఒక్కొక్కటిగా చూడండి (వెనుకకు)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"అన్ని యాప్లు, సెర్చ్ లిస్ట్ను యాక్సెస్ చేయండి (అంటే సెర్చ్/లాంచర్)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"టాస్క్బార్ను దాచిపెట్టి (తిరిగి) చూపించండి"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"సిస్టమ్ సెట్టింగ్లను యాక్సెస్ చేయండి"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistantను యాక్సెస్ చేయండి"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"నోటిఫికేషన్లను చూడండి"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"స్క్రీన్షాట్ను తీయండి"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"షార్ట్కట్లను చూపించండి"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"వెనుకకు వెళ్లండి"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"మొదటి స్క్రీన్కు వెళ్లండి"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ఇటీవలి యాప్లను చూడండి"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"ఇటీవల ఉపయోగించిన యాప్ల తదుపరి పేజీకి వెళ్లండి"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"ఇటీవల ఉపయోగించిన యాప్ల మునుపటి పేజీకి వెళ్లండి"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"యాప్ల లిస్ట్ను తెరవండి"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"టాస్క్బార్ను చూపండి"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"సెట్టింగ్లను తెరవండి"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"అసిస్టెంట్ను తెరవండి"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"లాక్ స్క్రీన్"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"క్విక్ మెమో కోసం Notes యాప్ను లాగండి"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"నోట్స్ను తెరవండి"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"సిస్టమ్ మల్టీ-టాస్కింగ్"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"RHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"LHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"స్ప్లిట్ స్క్రీన్ను ఫుల్ స్క్రీన్కు మార్చండి"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"స్ప్లిట్ స్క్రీన్ సమయంలో: యాప్ను ఒకదాని నుండి మరొకదానికి రీప్లేస్ చేయండి"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"RHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"LHSకు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఎంటర్ చేయండి"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"స్ప్లిట్ స్క్రీన్ను ఫుల్ స్క్రీన్కు మార్చండి"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ఇన్పుట్"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ఇన్పుట్ భాషకు స్విచ్ అవ్వండి (తర్వాతి భాష)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ఇన్పుట్ భాషకు స్విచ్ అవ్వండి (మునుపటి భాష)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"తర్వాత భాషకు స్విచ్ అవ్వండి"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"మునుపటి భాషకు స్విచ్ అవ్వండి"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ఎమోజిని యాక్సెస్ చేయండి"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"వాయిస్ టైపింగ్ను యాక్సెస్ చేయండి"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"అప్లికేషన్లు"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"సహాయకం"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"బ్రౌజర్ (ఆటోమేటిక్ సెట్టింగ్గా Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"బ్రౌజర్"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"కాంటాక్ట్లు"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ఈమెయిల్ (ఆటోమేటిక్ సెట్టింగ్గా Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ఈమెయిల్"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"మ్యూజిక్"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Calendar"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 2f13280..3c5396f 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"ปุ่ม <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"กลับ"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ขึ้น"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"ลง"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"ซ้าย"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"ขวา"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"กึ่งกลาง"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"วรรค"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"การแจ้งเตือน"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"แป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"สลับรูปแบบแป้นพิมพ์"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ล้างข้อความ"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"แป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"ค้นหาแป้นพิมพ์ลัด"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"ไม่พบแป้นพิมพ์ลัด"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"อินพุต"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"แอปที่เปิดอยู่"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"แอปปัจจุบัน"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"เข้าถึงหน้าต่างแจ้งเตือน"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"ถ่ายภาพหน้าจอแบบเต็มจอ"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"เข้าถึงรายการทางลัดของระบบ/แอปทั้งหมด"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"ย้อนกลับ: กลับไปยังสถานะก่อนหน้า (ปุ่มย้อนกลับ)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"เข้าถึงหน้าจอหลัก"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"ภาพรวมของแอปที่เปิดอยู่"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"สลับระหว่างแอปล่าสุด (ไปข้างหน้า)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"สลับระหว่างแอปล่าสุด (กลับหลัง)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"เข้าถึงรายการแอปและการค้นหา (เช่น Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ซ่อนและแสดงแถบงาน (อีกครั้ง)"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"เข้าถึงการตั้งค่าระบบ"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"เข้าถึง Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"ดูการแจ้งเตือน"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"ถ่ายภาพหน้าจอ"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"แสดงแป้นพิมพ์ลัด"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"ย้อนกลับ"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ไปที่หน้าจอหลัก"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"ดูแอปล่าสุด"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"สลับระหว่างแอปล่าสุดแบบไปข้างหน้า"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"สลับระหว่างแอปล่าสุดแบบกลับหลัง"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"เปิดรายชื่อแอป"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"แสดงแถบงาน"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"เปิดการตั้งค่า"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"เปิด Assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"ล็อกหน้าจอ"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"เปิดแอปโน้ตเพื่อจดบันทึก"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"เปิดโน้ต"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"การทํางานหลายอย่างพร้อมกันของระบบ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านขวา"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"เข้าสู่โหมดแยกหน้าจอโดยแอปปัจจุบันอยู่ด้านซ้าย"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"เปลี่ยนจากโหมดแยกหน้าจอเป็นเต็มหน้าจอ"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"อินพุต"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"เปลี่ยนภาษาในการป้อนข้อมูล (ภาษาถัดไป)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"เปลี่ยนภาษาในการป้อนข้อมูล (ภาษาก่อนหน้า)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"เปลี่ยนเป็นภาษาถัดไป"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"เปลี่ยนเป็นภาษาก่อนหน้า"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"เข้าถึงอีโมจิ"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"เข้าถึงการพิมพ์ด้วยเสียง"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"แอปพลิเคชัน"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"ผู้ช่วย"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"เบราว์เซอร์ (Chrome เป็นค่าเริ่มต้น)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"เบราว์เซอร์"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"รายชื่อติดต่อ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"อีเมล (Gmail เป็นค่าเริ่มต้น)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"อีเมล"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"เพลง"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"ปฏิทิน"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 11c75c6..21111a4 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Button na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Back"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Up"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Down"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Left"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Right"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Center"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Mga Notification"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Mga Keyboard Shortcut"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Magpalit ng layout ng keyboard"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"I-clear ang text"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Mga Shortcut"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Maghanap ng mga shortcut"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Walang nakitang shortcut"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Input"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Buksan ang app"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Kasalukuyang app"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"I-access ang notification shade"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Kumuha ng buong screenshot"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"I-access ang listahan ng mga shortcut ng system / mga app"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Bumalik: bumalik sa nakaraang status (button na bumalik)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"I-access ang home screen"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Pangkalahatang-ideya ng mga bukas na app"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Mag-cycle sa mga kamakailang app (sumulong)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Mag-cycle sa mga kamakailang app (bumalik)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"I-access ang listahan ng lahat ng app at paghahanap (ibig sabihin, Search/Launcher)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Itago at ipakita (ulit) ang taskbar"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"I-access ang mga setting ng system"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"I-access ang Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Tumingin ng mga notification"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Kumuha ng screenshot"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Ipakita ang mga shortcut"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Bumalik"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Pumunta sa home screen"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Tingnan ang mga kamakailang app"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Mag-cycle pasulong sa mga kamakailang app"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Mag-cycle pabalik sa mga kamakailang app"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Buksan ang listahan ng mga app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Ipakita ang taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Buksan ang mga setting"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Buksan ang assistant"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"I-lock ang screen"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Buksan ang Notes app para sa mabilis na memo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Buksan ang mga tala"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking ng system"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Lumipat sa Split screen nang nasa RHS ang kasalukuyang app"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Lumipat sa Split screen nang nasa LHS ang kasalukuyang app"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Lumipat sa full screen mula sa Split screen"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Habang nasa Split screen: magpalit-palit ng app"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Lumipat sa split screen nang nasa RHS ang kasalukuyang app"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Lumipat sa split screen nang nasa LHS ang kasalukuyang app"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Lumipat sa full screen mula sa split screen"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Habang nasa split screen: magpalit-palit ng app"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Magpalit ng wika ng pag-input (susunod na wika)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Magpalit ng wika ng pag-input (nakaraang wika)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Lumipat sa susunod na wika"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Lumipat sa dating wika"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"I-access ang emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"I-access ang voice typing"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Mga Application"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Tulong"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Browser (Chrome bilang default)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistant"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Browser"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Mga Contact"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (Gmail bilang default)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Music"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Kalendaryo"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 3f578d2..08b0251 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> düğmesi"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Geri"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Yukarı"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Aşağı"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Sol"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Sağ"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Orta"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Boşluk"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirimler"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Klavye Kısayolları"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klavye düzenini değiştir"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Metni temizle"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Kısayollar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Kısayol araması yapın"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Kısayol bulunamadı"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Giriş"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Uygulamaları açma"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Mevcut uygulama"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildirim gölgesine erişin"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Tam ekran görüntüsü alın"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Sistem/uygulama kısayolları listesine erişin"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Geri: Önceki duruma geri dönün (geri düğmesi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Ana ekrana erişin"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Açık uygulamalara genel bakış"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Son uygulamalar arasında gezinin (ileri)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Son uygulamalar arasında gezinin (geri)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Tüm uygulama ve arama (ör. Arama/Launcher) listesine erişin"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Görev çubuğunu gizleyin ve (yeniden) gösterin"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Sistem ayarlarına erişin"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Asistan\'a erişin"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirimleri görüntüle"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Ekran görüntüsü al"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Kısayolları göster"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Geri dön"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ana ekrana git"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Son uygulamaları görüntüle"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Son uygulamalarda ileriye doğru git"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Son uygulamalarda geriye doğru git"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Uygulama listesini aç"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Görev çubuğunu göster"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Ayarları aç"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Asistan\'ı aç"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Kilit ekranı"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Hızlıca not almak için Notlar uygulamasını açın"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Notları aç"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Sistem çoklu görevi"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geçin"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geçin"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Bölünmüş ekrandan tam ekrana geçin"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştirin"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Mevcut uygulamayı sağ tarafa alarak bölünmüş ekrana geç"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Mevcut uygulamayı sol tarafa alarak bölünmüş ekrana geç"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Bölünmüş ekrandan tam ekrana geç"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Giriş"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Giriş dilini değiştirin (sonraki dil)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Giriş dilini değiştirin (önceki dil)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Sonraki dile geç"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Önceki dile geç"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojilere erişin"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Sesle yazma özelliğine erişin"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Uygulamalar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Asistan"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Tarayıcı (varsayılan olarak Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Asistan"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Tarayıcı"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kişiler"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"E-posta (varsayılan olarak Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"E-posta"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Müzik"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Takvim"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 90dc097..9048b63 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Повільне заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Заряджання • <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> до повного заряду"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"Проведіть пальцем уліво, щоб відкрити спільний навчальний посібник"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"Відкрити редактор віджетів"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"Вилучити віджет"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"Додати віджет"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Змінити користувача"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"спадне меню"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усі додатки й дані з цього сеансу буде видалено."</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Кнопка <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Назад"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Стрілка вгору"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Стрілка вниз"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Стрілка вліво"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Стрілка вправо"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Центр"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Пробіл"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Сповіщення"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Комбінації клавіш"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Змінити розкладку клавіатури"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Видалити текст"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Швидкі команди"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Пошук швидких команд"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Швидк. команд не знайдено"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Метод введення"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Відкр. додатки"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Поточн. додаток"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Відкрити панель сповіщень"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Зробити знімок усього екрана"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Відкрити список системних ярликів і ярликів додатків"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Назад: повернутися до попереднього стану (кнопка \"Назад\")"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Перейти на головний екран"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Огляд відкритих додатків"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Перемикатися між останніми додатками (уперед)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Перемикатися між останніми додатками (назад)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Відкрити список усіх додатків і запитів (Пошук/Панель запуску)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Сховати або знову показати панель завдань"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Відкрити налаштування системи"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Відкрити Google Асистента"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Переглянути сповіщення"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Зробити знімок екрана"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Показати комбінації клавіш"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Назад"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Перейти на головний екран"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Переглянути нещодавні додатки"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Перемикатися між нещодавніми додатками вперед"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Перемикатися між нещодавніми додатками назад"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Відкрити список додатків"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Показати панель завдань"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Відкрити налаштування"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Відкрити додаток Асистент"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Заблокувати екран"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Відкривати додаток \"Нотатки\" для швидких приміток"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Відкрити нотатки"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Багатозадачність системи"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Розділити екран із поточним додатком праворуч"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Розділити екран із поточним додатком ліворуч"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Перемкнути з розділеного екрана на весь екран"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Під час розділення екрана: замінити додаток іншим"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Розділити екран із поточним додатком праворуч"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Розділити екран із поточним додатком ліворуч"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Перейти з розділення екрана на весь екран"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Під час розділення екрана: замінити додаток іншим"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Метод введення"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Змінити мову введення (наступна мова)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Змінити мову введення (попередня мова)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Вибрати наступну мову"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Вибрати попередню мову"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Відкрити смайли"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Відкрити голосовий ввід"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Додатки"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Помічник"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Веб-переглядач (за умовчанням – Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Асистент"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Веб-переглядач"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Контакти"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Електронна пошта (за умовчанням – Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Електронна пошта"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Музика"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Календар"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 137c8ab..d9bb0ae 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"بٹن <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"پیچھے"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"اوپر"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"نیچے"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"بائیں"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"دائیں"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"سینٹر"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اطلاعات"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"کی بورڈ شارٹ کٹس"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"کی بورڈ لے آؤٹ سوئچ کریں"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"ٹیکسٹ صاف کریں"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"شارٹ کٹس"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"شارٹ کٹس تلاش کریں"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"کوئی شارٹ کٹ نہیں ملا"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"ان پٹ"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"ایپس کھولیں"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"موجودہ ایپ"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"اطلاعاتی شیڈ تک رسائی حاصل کریں"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"پوری اسکرین شاٹ لیں"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"سسٹم / ایپس شارٹ کٹس کی فہرست تک رسائی حاصل کریں"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"پیچھے: گزشتہ حالت پر واپس جائیں (پیچھے جانے کا بٹن)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"ہوم اسکرین تک رسائی حاصل کریں"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"کھلی ایپس کا مجموعی جائزہ"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"حالیہ ایپس میں یکے بعد دیگرے جائیں (آگے جائیں)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"حالیہ ایپس میں یکے بعد دیگرے جائیں (پیچھے جائیں)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"تمام ایپس اور تلاش کی فہرست تک رسائی حاصل کریں (یعنی تلاش/لانچر)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"ٹاسک بار کو چھپائیں اور (دوبارہ) دکھائیں"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"سسٹم کی ترتیبات تک رسائی"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google اسسٹنٹ تک رسائی حاصل کریں"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"اطلاعات دیکھیں"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"اسکرین شاٹ لیں"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"شارٹ کٹس دکھائيں"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"واپس جائیں"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"ہوم اسکرین پر جائیں"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"حالیہ ایپس دیکھیں"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"حالیہ ایپس کے ذریعے آگے کی طرف سائیکل کریں"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"حالیہ ایپس کے ذریعے پیچھے کی طرف سائیکل کریں"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ایپس کی فہرست کھولیں"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"ٹاسک بار دکھائیں"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"ترتیبات کھولیں"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"اسسٹنٹ کھولیں"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"مقفل اسکرین"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"فوری میمو کے ليے نوٹس ایپ حاصل کریں"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"نوٹس کھولیں"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"سسٹم ملٹی ٹاسکنگ"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"موجودہ ایپ کے ساتھ دائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"موجودہ ایپ کے ساتھ بائیں جانب اسپلٹ اسکرین انٹر کریں"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"اسپلٹ اسکرین سے پوری سکرین پر سوئچ کریں"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ان پٹ"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"ان پٹ زبان سوئچ کریں (اگلی زبان)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ان پٹ زبان سوئچ کریں (گزشتہ زبان)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"اگلی زبان پر سوئچ کریں"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"پچھلی زبان پر سوئچ کریں"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"ایموجی تک رسائی"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"صوتی ٹائپنگ تک رسائی"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ایپلیکیشنز"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"اسسٹ"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"براؤزر (بطور ڈیفالٹ Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"اسسٹنٹ"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"براؤزر"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"رابطے"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"ای میل (بطور ڈیفالٹ Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"ای میل"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"موسیقی"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"کیلنڈر"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 601d773..5696c61 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> tugmasi"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Bosh ekran"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Orqaga"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Tepaga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Pastga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Chapga qaragan ko‘rsatkichli chiziq"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"O‘ngga qaragan ko‘rsatkichli chiziq"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Markaziy ko‘rsatkichli chiziq"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Probel"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Bildirishnomalar"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Tezkor tugmalar"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Klaviatura terilmasini almashtirish"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Matnni tozalash"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Tezkor tugmalar"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Tezkor tugmalar qidiruvi"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Tezkor tugmalar topilmadi"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Kiritish"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ochiq ilovalar"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Joriy ilova"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Bildirishnoma soyasiga ruxsat"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Butun skrinshot olish"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Tizim va ilovalar tezkor tugmalari roʻyxatiga ruxsat"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Orqaga: avvalgi holatga qaytish (orqaga tugmasi)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Bosh ekranga ruxsat"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Ochiq ilovalar bilan tanishish"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Oxirgi ilovalarni varaqlash (faol rejimda)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Oxirgi ilovalarni varaqlash (fonda)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Barcha ilovalar va qidiruv roʻyxatiga ruxsat (Qidiruv/Launcher kabi)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Vazifalar panelini ochish va yopish"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Tizim sozlamalariga ruxsat"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Google Assistentga ruxsat"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Bildirishnomalarni ochish"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Skrinshot olish"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Yorliqlarni ochish"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Orqaga"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Bosh ekranni ochish"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Oxirgi ilovalarni ochish"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Oxirgi ilovalarni oldinga varaqlash"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Oxirgi ilovalarni orqaga varaqlash"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ilovalar roʻyxatini ochish"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Vazifalar panelini chiqarish"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Sozlamalarni ochish"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Assistentni ochish"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Ekran qulfi"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Tezkor eslatma uchun Qaydlar ilovasini ochish"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Qaydlarni ochish"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Tizimdagi multi-vazifalik"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Ajratilgan ekran rejimidan butun ekranga qaytish"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Oʻng tomondagi ajratilgan ekran rejimiga kirish"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Chap tomondagi ajratilgan ekran rejimiga kirish"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Ajratilgan ekran rejimidan butun ekranga almashtirish"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ajratilgan rejimda ilovalarni oʻzaro almashtirish"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Kiritish"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Kiritish tili tugmasi (keyingi til)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Kiritish tili tugmasi (avvalgi til)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Keyingi tilga almashtirish"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Avvalgi tilga almashtirish"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Emojilarga ruxsat"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Ovoz bilan yozishga ruxsat"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Ilovalar"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Yordamchi"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Brauzer (birlamchisi Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Assistent"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Brauzer"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Kontaktlar"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (birlamchisi Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Musiqa"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Taqvim"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index b67c789..c281d90 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Nút <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Quay lại"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Lên"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Xuống"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Trái"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Phải"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Giữa"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Dấu cách"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Thông báo"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Phím tắt"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Chuyển đổi bố cục bàn phím"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Xoá văn bản"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Lối tắt"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Lối tắt tìm kiếm"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Không tìm thấy lối tắt"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Đầu vào"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Ứng dụng đang mở"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"Ứng dụng hiện tại"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Truy cập ngăn thông báo"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Chụp toàn màn hình"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Danh sách truy cập lối tắt ứng dụng/hệ thống"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Quay lại: quay lại trạng thái trước đó (nút quay lại)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Truy cập màn hình khoá"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Tổng quan về những ứng dụng đang mở"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Xoay vòng qua các ứng dụng gần đây (xuôi)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Xoay vòng qua các ứng dụng gần đây (ngược)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"D.sách truy cập mọi ứng dụng/n.dung tìm kiếm (VD: Tìm kiếm/Trình chạy)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Ẩn và hiện (lại) thanh tác vụ"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Truy cập chế độ cài đặt hệ thống"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Truy cập Trợ lý Google"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Xem thông báo"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Chụp ảnh màn hình"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Hiện phím tắt"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Quay lại"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Chuyển đến màn hình chính"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Xem các ứng dụng gần đây"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Di chuyển tiến trong danh sách các ứng dụng gần đây"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Di chuyển lùi trong danh sách các ứng dụng gần đây"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Mở danh sách ứng dụng"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Hiện thanh tác vụ"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Mở phần cài đặt"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Mở Trợ lý"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Màn hình khoá"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Mở ứng dụng Ghi chú để ghi chú nhanh"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Mở ghi chú"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Xử lý đa nhiệm trong hệ thống"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Vào chế độ Chia đôi màn hình, ứng dụng hiện tại sang màn hình bên phải"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Vào chế độ Chia đôi màn hình, ứng dụng hiện tại sang màn hình bên trái"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Chuyển từ chế độ Chia đôi màn hình sang chế độ toàn màn hình"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Trong chế độ Chia đôi màn hình: thay ứng dụng này bằng ứng dụng khác"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên phải"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Vào chế độ chia đôi màn hình, ứng dụng hiện tại ở màn hình bên trái"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Chuyển từ chế độ chia đôi màn hình sang chế độ toàn màn hình"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Trong chế độ chia đôi màn hình: thay ứng dụng này bằng ứng dụng khác"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Đầu vào"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Chuyển ngôn ngữ nhập (ngôn ngữ tiếp theo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Chuyển ngôn ngữ nhập (ngôn ngữ trước đó)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Chuyển sang ngôn ngữ tiếp theo"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Chuyển sang ngôn ngữ trước"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Truy cập biểu tượng cảm xúc"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Truy cập tính năng nhập liệu bằng giọng nói"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Ứng dụng"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Trợ lý"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Trình duyệt (mặc định là Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Trợ lý"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Trình duyệt"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Danh bạ"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"Email (mặc định là Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"Email"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Âm nhạc"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Lịch"</string>
@@ -826,7 +843,7 @@
<string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> — <xliff:g id="ID_2">%2$s</xliff:g>"</string>
<string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string>
<string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi đang tắt"</string>
- <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth tắt"</string>
+ <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth đang tắt"</string>
<string name="dnd_is_off" msgid="3185706903793094463">"Không làm phiền tắt"</string>
<string name="dnd_is_on" msgid="7009368176361546279">"Chế độ Không làm phiền đang bật"</string>
<string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Không làm phiền đã được một quy tắc tự động (<xliff:g id="ID_1">%s</xliff:g>) bật."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 576cbc7..7cde292 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g>按钮"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中心"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"键盘快捷键"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切换键盘布局"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快捷键"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜索快捷键"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"未找到任何快捷键"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"输入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已开应用"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"当前应用"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"访问通知栏"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"截取全屏"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"访问系统/应用快捷方式的列表"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:返回到上一个状态(返回按钮)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"访问主屏幕"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"已开应用概览"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"循环浏览近期使用的应用(向前)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"循环浏览近期使用的应用(向后)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"访问所有应用的列表并搜索所需应用(即搜索/启动器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隐藏和重新显示任务栏"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"访问系统设置"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"访问 Google 助理"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"截取屏幕截图"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"显示快捷键"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主屏幕"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近运行过的应用"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"向前循环浏览近期使用的应用"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"向后循环浏览近期使用的应用"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"打开应用列表"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"显示任务栏"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"打开设置"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"打开 Google 助理"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"锁定屏幕"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"调出记事应用快速做记录"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"打开笔记"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系统多任务处理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"进入分屏模式,当前应用显示于右侧"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"进入分屏模式,当前应用显示于左侧"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"从分屏模式切换为全屏"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"在分屏期间:将一个应用替换为另一个应用"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"进入分屏模式,当前应用显示于右侧"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"进入分屏模式,当前应用显示于左侧"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"从分屏模式切换为全屏"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"在分屏期间:将一个应用替换为另一个应用"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"输入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切换输入语言(下一种语言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切换输入语言(上一种语言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切换到下一种语言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切换到上一种语言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"访问表情符号"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"访问语音输入"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"应用"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"助理"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"浏览器(默认为 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"浏览器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"通讯录"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"电子邮件(默认为 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"电子邮件"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短信"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音乐"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日历"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index bcf7478..a997d06 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 鍵"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"箭咀中央"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快速鍵"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜尋快速鍵"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"找不到快速鍵"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"輸入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已開應用程式"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"目前的應用程式"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"存取通知欄"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"擷取全螢幕截圖"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"存取系統/應用程式捷徑清單"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:回到先前的狀態 (返回按鈕)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"存取主畫面"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"「已開啟的應用程式」概覽"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"輪流切換最近使用的應用程式 (前進)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"輪流切換最近使用的應用程式 (返回)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"存取所有應用程式的清單並搜尋 (即搜尋/啟動器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隱藏和顯示/重新顯示工作列"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"存取系統設定"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"存取「Google 助理」"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"擷取螢幕截圖"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"顯示快速鍵"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主畫面"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近使用的應用程式"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"輪流切換最近使用的應用程式 (向前)"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"輪流切換最近使用的應用程式 (向後)"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟「Google 助理」"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"上鎖畫面"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"開啟「筆記」應用程式快速寫筆記"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"開啟筆記"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系統多工處理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"將分割螢幕切換為全螢幕"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"使用分割螢幕期間:更換應用程式"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割螢幕模式,並將目前的應用程式顯示在右側"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割螢幕模式,並將目前的應用程式顯示在左側"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"將分割螢幕切換為全螢幕"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割螢幕期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切換輸入語言 (下一個語言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切換輸入語言 (上一個語言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換至下一個語言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切換至上一個語言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"存取 Emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"存取語音輸入內容"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"應用程式"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"小幫手"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"瀏覽器 (預設為 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"瀏覽器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"通訊錄"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"電郵 (預設為 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"電郵"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"短訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 76d11ec..9900adf 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -401,11 +401,9 @@
<string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 慢速充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • 充電中 • 將於 <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>後充飽"</string>
<string name="communal_tutorial_indicator_text" msgid="4503010353591430123">"向左滑動即可啟動通用教學課程"</string>
- <!-- no translation found for button_to_open_widget_editor (5599945944349057600) -->
- <skip />
+ <string name="button_to_open_widget_editor" msgid="5599945944349057600">"開啟小工具編輯器"</string>
<string name="button_to_remove_widget" msgid="1511255853677835341">"移除小工具"</string>
- <!-- no translation found for hub_mode_add_widget_button_text (3956587989338301487) -->
- <skip />
+ <string name="hub_mode_add_widget_button_text" msgid="3956587989338301487">"新增小工具"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string>
<string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string>
<string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會遭到刪除。"</string>
@@ -642,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> 按鈕"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Home 鍵"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"返回"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"向上鍵"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"向下鍵"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"向左鍵"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"向右鍵"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"中央鍵"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"空格鍵"</string>
@@ -673,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"通知"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"鍵盤快速鍵"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"切換鍵盤配置"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"清除文字"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"快速鍵"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"搜尋快速鍵"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"找不到快速鍵"</string>
@@ -681,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"輸入"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"已開啟的應用程式"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"目前的應用程式"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"存取通知欄"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"拍攝全螢幕截圖"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"存取系統/應用程式捷徑清單"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"返回:回到先前的狀態 (返回按鈕)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"存取主畫面"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"「已開啟的應用程式」總覽"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"循環切換最近使用的應用程式 (前進)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"循環切換最近使用的應用程式 (返回)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"存取所有應用程式的清單並進行搜尋 (即搜尋/啟動器)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"隱藏和顯示/重新顯示工作列"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"存取系統設定"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"存取 Google 助理"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"查看通知"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"拍攝螢幕截圖"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"顯示快速鍵"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主畫面"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近開啟的應用程式"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"前往最近開啟的應用程式"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"返回最近開啟的應用程式"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"開啟應用程式清單"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"顯示工作列"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"開啟設定"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"開啟 Google 助理"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"螢幕鎖定"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"打開「記事」應用程式快速做筆記"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"開啟記事"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"系統多工處理"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"從分割畫面切換到完整畫面"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"使用分割畫面期間:更換應用程式"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"進入分割畫面模式,並將目前的應用程式顯示於右側"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"進入分割畫面模式,並將目前的應用程式顯示於左側"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"從分割畫面切換到完整畫面"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"使用分割畫面期間:更換應用程式"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"輸入"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"切換輸入語言 (下一個語言)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"切換輸入語言 (上一個語言)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"切換到下一個語言"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"切換到上一個語言"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"存取表情符號"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"存取語音輸入內容"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"應用程式"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"小幫手"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"瀏覽器 (預設為 Chrome)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Google 助理"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"瀏覽器"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"聯絡人"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"電子郵件 (預設為 Gmail)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"電子郵件"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"簡訊"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"音樂"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"日曆"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 591a63e..42ddb35 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -640,10 +640,14 @@
<string name="keyboard_key_button_template" msgid="8005673627272051429">"Inkinobho <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="keyboard_key_home" msgid="3734400625170020657">"Ekhaya"</string>
<string name="keyboard_key_back" msgid="4185420465469481999">"Emuva"</string>
- <string name="keyboard_key_dpad_up" msgid="2164184320424941416">"Phezulu"</string>
- <string name="keyboard_key_dpad_down" msgid="2110172278574325796">"Phansi"</string>
- <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Kwesobunxele"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Kwesokudla"</string>
+ <!-- no translation found for keyboard_key_dpad_up (7199805608386368673) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (3354221123220737397) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (144176368026538621) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (8485763312139820037) -->
+ <skip />
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Maphakathi"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Isikhala"</string>
@@ -671,7 +675,10 @@
<string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"Izaziso"</string>
<string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"Izinqamulelo Zekhibhodi"</string>
<string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"Shintsha isakhiwo sekhibhodi"</string>
- <string name="keyboard_shortcut_clear_text" msgid="4679927133259287577">"Sula umbhalo"</string>
+ <!-- no translation found for keyboard_shortcut_join (3578314570034512676) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_clear_text (6631051796030377857) -->
+ <skip />
<string name="keyboard_shortcut_search_list_title" msgid="1156178106617830429">"Izinqamuleli"</string>
<string name="keyboard_shortcut_search_list_hint" msgid="5982623262974326746">"Sesha izinqamuleli"</string>
<string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"Azikho izinqamuleli ezitholakele"</string>
@@ -679,35 +686,45 @@
<string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"Okokufaka"</string>
<string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"Vula ama-app"</string>
<string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"I-app yamanje"</string>
- <string name="group_system_access_notification_shade" msgid="7116898151485382275">"Finyelela umthunzi wesaziso"</string>
- <string name="group_system_full_screenshot" msgid="7389040853798023211">"Thatha isithombe-skrini esigcwele"</string>
- <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"Uhlu lokufinyelela lwezinqamuleli zesistimu / zama-app"</string>
- <string name="group_system_go_back" msgid="8838454003680364227">"Emuva: buyela esimweni sangaphambilini (inkinobho yokubuyela emuva)"</string>
- <string name="group_system_access_home_screen" msgid="1857344316928441909">"Finyelela isikrini sasekhaya"</string>
- <string name="group_system_overview_open_apps" msgid="6897128761003265350">"Amazwibela ama-app avuliwe"</string>
- <string name="group_system_cycle_forward" msgid="9202444850838205990">"Zungeza ama-app akamuva (phambili)"</string>
- <string name="group_system_cycle_back" msgid="5163464503638229131">"Zungeza ama-app akamuva (emuva)"</string>
- <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Uhlu lokufinyelela lawo wonke ama-app nokusesha (isb, Sesha/Isiqalisa)"</string>
- <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Fihla futhi ubonise(kabusha) ibha yomsebenzi"</string>
- <string name="group_system_access_system_settings" msgid="7961639365383008053">"Finyelela amasethingi esistimu"</string>
- <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Finyelela ku-Google Assistant"</string>
+ <!-- no translation found for keyboard_shortcut_a11y_show_search_results (2865241062981833705) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_system (7744143131119370483) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_input (4589316004510335529) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_open_apps (6175417687221004059) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_a11y_filter_current_app (7944592357493737911) -->
+ <skip />
+ <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Buka izaziso"</string>
+ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Thatha isithombe-skrini"</string>
+ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Bonisa izinqamuleli"</string>
+ <string name="group_system_go_back" msgid="2730322046244918816">"Buyela emuva"</string>
+ <string name="group_system_access_home_screen" msgid="4130366993484706483">"Iya kusikrini sasekhaya"</string>
+ <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Buka ama-app akamuva"</string>
+ <string name="group_system_cycle_forward" msgid="5478663965957647805">"Zungeza ubheke phambili ngama-app akamuva"</string>
+ <string name="group_system_cycle_back" msgid="8194102916946802902">"Zungeza ubuyele emuva ngama-app akamuva"</string>
+ <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Vula uhlu lwama-app"</string>
+ <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Bonisa i-taskbar"</string>
+ <string name="group_system_access_system_settings" msgid="8731721963449070017">"Vula amasethingi"</string>
+ <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Vula umsizi"</string>
<string name="group_system_lock_screen" msgid="7391191300363416543">"Khiya isikrini"</string>
- <string name="group_system_quick_memo" msgid="2914234890158583919">"Donsela phezulu i-app yamanothi ukuze uthole imemo esheshayo"</string>
+ <string name="group_system_quick_memo" msgid="6257072703041301265">"Vula amanothi"</string>
<string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Ukwenza imisebenzi eminingi yesistimu"</string>
- <string name="system_multitasking_rhs" msgid="6593269428880305699">"Faka Ukuhlukanisa isikrini nge-app yamanje kuya ku-RHS"</string>
- <string name="system_multitasking_lhs" msgid="8839380725557952846">"Faka Ukuhlukanisa isikrini nge-app yamanje kuya ku-LHS"</string>
- <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Shintsha usuka Ekuhlukaniseni isikrini uye kusikrini esigcwele"</string>
- <string name="system_multitasking_replace" msgid="844285282472557186">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string>
+ <string name="system_multitasking_rhs" msgid="2454557648974553729">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-RHS"</string>
+ <string name="system_multitasking_lhs" msgid="3516599774920979402">"Faka ukuhlukanisa isikrini nge-app yamanje kuya ku-LHS"</string>
+ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Shintsha usuka ekuhlukaniseni isikrini uye kusikrini esigcwele"</string>
+ <string name="system_multitasking_replace" msgid="7410071959803642125">"Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"</string>
<string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Okokufaka"</string>
- <string name="input_switch_input_language_next" msgid="3394291576873633793">"Shintsha ulimi lokokufaka (ulimi olulandelayo)"</string>
- <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Shintsha ulimi lokokufaka (ulimi lwangaphambilini)"</string>
+ <string name="input_switch_input_language_next" msgid="3782155659868227855">"Shintshela olimini olulandelayo"</string>
+ <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Shintshela olimini lwangaphambili"</string>
<string name="input_access_emoji" msgid="8105642858900406351">"Finyelela i-emoji"</string>
<string name="input_access_voice_typing" msgid="7291201476395326141">"Finyelela ukuthayipha ngezwi"</string>
<string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Izinhlelo zokusebenza"</string>
- <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"Siza"</string>
- <string name="keyboard_shortcut_group_applications_browser" msgid="7328131901589876868">"Ibhrawuza (i-Chrome yokuzenzakalelayo)"</string>
+ <string name="keyboard_shortcut_group_applications_assist" msgid="6772492350416591448">"Umsizi"</string>
+ <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"Isiphequluli"</string>
<string name="keyboard_shortcut_group_applications_contacts" msgid="2807268086386201060">"Oxhumana nabo"</string>
- <string name="keyboard_shortcut_group_applications_email" msgid="7480359963463803511">"I-imeyili (i-Gmail yokuzenzakalelayo)"</string>
+ <string name="keyboard_shortcut_group_applications_email" msgid="7852376788894975192">"I-imeyili"</string>
<string name="keyboard_shortcut_group_applications_sms" msgid="6912633831752843566">"I-SMS"</string>
<string name="keyboard_shortcut_group_applications_music" msgid="9032078456666204025">"Umculo"</string>
<string name="keyboard_shortcut_group_applications_calendar" msgid="4229602992120154157">"Ikhalenda"</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 03960d5..7db21b2 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -37,6 +37,7 @@
<!-- Used while animating the navbar during a long press. -->
<dimen name="navigation_home_handle_additional_width_for_animation">20dp</dimen>
<dimen name="navigation_home_handle_additional_height_for_animation">4dp</dimen>
+ <dimen name="navigation_home_handle_shrink_width_for_animation">16dp</dimen>
<!-- Size of the nav bar edge panels, should be greater to the
edge sensitivity + the drag threshold -->
diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml
index 0903463..763930d 100644
--- a/packages/SystemUI/res/values/flags.xml
+++ b/packages/SystemUI/res/values/flags.xml
@@ -38,6 +38,4 @@
protected. -->
<bool name="flag_battery_shield_icon">false</bool>
- <!-- Whether we want to stop pulsing while running the face scanning animation -->
- <bool name="flag_stop_pulsing_face_scanning_animation">true</bool>
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index 26e785d..4632914 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -149,10 +149,11 @@
*
* @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
* released or canceled)
+ * @param shrink {@code true} if the handle should shrink, {@code false} if it should grow
* @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
* should be the same as the amount of time to trigger a long-press)
*/
- oneway void animateNavBarLongPress(boolean isTouchDown, long durationMs) = 54;
+ oneway void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) = 54;
// Next id = 55
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
index b309483..714fe64 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
@@ -26,6 +26,7 @@
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
+import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -210,6 +211,7 @@
private final KeyguardViewController mKeyguardViewController;
private final FeatureFlags mFeatureFlags;
private final SelectedUserInteractor mSelectedUserInteractor;
+ private final UiEventLogger mUiEventLogger;
@Inject
public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -222,7 +224,8 @@
EmergencyButtonController.Factory emergencyButtonControllerFactory,
DevicePostureController devicePostureController,
KeyguardViewController keyguardViewController,
- FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+ FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+ UiEventLogger uiEventLogger) {
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockPatternUtils = lockPatternUtils;
mLatencyTracker = latencyTracker;
@@ -238,6 +241,7 @@
mKeyguardViewController = keyguardViewController;
mFeatureFlags = featureFlags;
mSelectedUserInteractor = selectedUserInteractor;
+ mUiEventLogger = uiEventLogger;
}
/** Create a new {@link KeyguardInputViewController}. */
@@ -265,7 +269,8 @@
mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
- mDevicePostureController, mFeatureFlags, mSelectedUserInteractor);
+ mDevicePostureController, mFeatureFlags, mSelectedUserInteractor,
+ mUiEventLogger);
} else if (keyguardInputView instanceof KeyguardSimPinView) {
return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 9764de1..36fe75f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -168,6 +168,7 @@
// Set selected property on so the view can send accessibility events.
mPasswordEntry.setSelected(true);
+ mPasswordEntry.setDefaultFocusHighlightEnabled(false);
mOkButton = findViewById(R.id.key_enter);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index 947d90f..2aab1f1 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -20,6 +20,8 @@
import android.view.View;
+import com.android.internal.logging.UiEvent;
+import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.LatencyTracker;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
@@ -44,6 +46,7 @@
private View mOkButton = mView.findViewById(R.id.key_enter);
private long mPinLength;
+ private final UiEventLogger mUiEventLogger;
private boolean mDisabledAutoConfirmation;
@@ -56,7 +59,8 @@
EmergencyButtonController emergencyButtonController,
FalsingCollector falsingCollector,
DevicePostureController postureController,
- FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor) {
+ FeatureFlags featureFlags, SelectedUserInteractor selectedUserInteractor,
+ UiEventLogger uiEventLogger) {
super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
messageAreaControllerFactory, latencyTracker, liftToActivateListener,
emergencyButtonController, falsingCollector, featureFlags, selectedUserInteractor);
@@ -67,6 +71,7 @@
view.setIsLockScreenLandscapeEnabled(mFeatureFlags.isEnabled(LOCKSCREEN_ENABLE_LANDSCAPE));
mBackspaceKey = view.findViewById(R.id.delete_button);
mPinLength = mLockPatternUtils.getPinLength(selectedUserInteractor.getSelectedUserId());
+ mUiEventLogger = uiEventLogger;
}
@Override
@@ -95,6 +100,7 @@
updateAutoConfirmationState();
if (mPasswordEntry.getText().length() == mPinLength
&& mOkButton.getVisibility() == View.INVISIBLE) {
+ mUiEventLogger.log(PinBouncerUiEvent.ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE);
verifyPasswordAndUnlock();
}
}
@@ -184,4 +190,21 @@
mSelectedUserInteractor.getSelectedUserId())
&& mPinLength != LockPatternUtils.PIN_LENGTH_UNAVAILABLE;
}
+
+ /** UI Events for the auto confirmation feature in*/
+ enum PinBouncerUiEvent implements UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "Attempting to unlock the device with the auto confirm feature.")
+ ATTEMPT_UNLOCK_WITH_AUTO_CONFIRM_FEATURE(1547);
+
+ private final int mId;
+
+ PinBouncerUiEvent(int id) {
+ mId = id;
+ }
+
+ @Override
+ public int getId() {
+ return mId;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
index 9716d98..ee35bb9 100644
--- a/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
+++ b/packages/SystemUI/src/com/android/keyguard/dagger/ClockRegistryModule.java
@@ -20,7 +20,6 @@
import android.content.res.Resources;
import android.view.LayoutInflater;
-import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Application;
import com.android.systemui.dagger.qualifiers.Background;
@@ -30,6 +29,7 @@
import com.android.systemui.log.LogBuffer;
import com.android.systemui.log.dagger.KeyguardClockLog;
import com.android.systemui.plugins.PluginManager;
+import com.android.systemui.res.R;
import com.android.systemui.shared.clocks.ClockRegistry;
import com.android.systemui.shared.clocks.DefaultClockProvider;
@@ -67,7 +67,8 @@
context,
layoutInflater,
resources,
- featureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION)),
+ featureFlags.isEnabled(Flags.STEP_CLOCK_ANIMATION),
+ featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)),
context.getString(R.string.lockscreen_clock_id_fallback),
logBuffer,
/* keepAllLoaded = */ false,
diff --git a/packages/SystemUI/src/com/android/keyguard/logging/KeyguardTransitionAnimationLogger.kt b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardTransitionAnimationLogger.kt
new file mode 100644
index 0000000..d9830b2
--- /dev/null
+++ b/packages/SystemUI/src/com/android/keyguard/logging/KeyguardTransitionAnimationLogger.kt
@@ -0,0 +1,74 @@
+/*
+ * 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.keyguard.logging
+
+import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.core.LogLevel
+import com.android.systemui.log.dagger.KeyguardTransitionAnimationLog
+import javax.inject.Inject
+
+private const val TAG = "KeyguardTransitionAnimationLog"
+
+/**
+ * Generic logger for keyguard that's wrapping [LogBuffer]. This class should be used for adding
+ * temporary logs or logs for smaller classes when creating whole new [LogBuffer] wrapper might be
+ * an overkill.
+ */
+class KeyguardTransitionAnimationLogger
+@Inject
+constructor(
+ @KeyguardTransitionAnimationLog val buffer: LogBuffer,
+) {
+ @JvmOverloads
+ fun logCreate(
+ name: String? = null,
+ start: Float,
+ ) {
+ if (name == null) return
+
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = name
+ str2 = "$start"
+ },
+ { "[$str1] starts at: $str2" }
+ )
+ }
+
+ @JvmOverloads
+ fun logTransitionStep(
+ name: String? = null,
+ step: TransitionStep,
+ value: Float? = null,
+ ) {
+ if (name == null) return
+
+ buffer.log(
+ TAG,
+ LogLevel.DEBUG,
+ {
+ str1 = "[$name][${step.transitionState}]"
+ str2 = "${step.value}"
+ str3 = "$value"
+ },
+ { "$str1 transitionStep=$str2, animationValue=$str3" }
+ )
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
index c1871e0..71bac06 100644
--- a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
+++ b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt
@@ -209,11 +209,11 @@
return result
}
- open fun enableShowProtection(show: Boolean) {
- if (showProtection == show) {
+ open fun enableShowProtection(isCameraActive: Boolean) {
+ if (showProtection == isCameraActive) {
return
}
- showProtection = show
+ showProtection = isCameraActive
updateProtectionBoundingPath()
// Delay the relayout until the end of the animation when hiding the cutout,
// otherwise we'd clip it.
diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
index 95e2dba..3abcb13 100644
--- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt
@@ -28,16 +28,12 @@
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
-import android.hardware.biometrics.BiometricSourceType
import android.view.View
import androidx.core.graphics.ColorUtils
import com.android.app.animation.Interpolators
import com.android.keyguard.KeyguardUpdateMonitor
-import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.settingslib.Utils
import com.android.systemui.biometrics.AuthController
-import com.android.systemui.flags.FeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.asIndenting
@@ -56,7 +52,6 @@
val mainExecutor: Executor,
val logger: ScreenDecorationsLogger,
val authController: AuthController,
- val featureFlags: FeatureFlags,
) : ScreenDecorations.DisplayCutoutView(context, pos) {
private var showScanningAnim = false
private val rimPaint = Paint()
@@ -69,26 +64,11 @@
com.android.internal.R.attr.materialColorPrimaryFixed)
private var cameraProtectionAnimator: ValueAnimator? = null
var hideOverlayRunnable: Runnable? = null
- var faceAuthSucceeded = false
init {
visibility = View.INVISIBLE // only show this view when face scanning is happening
}
- override fun onAttachedToWindow() {
- super.onAttachedToWindow()
- mainExecutor.execute {
- keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
- }
- }
-
- override fun onDetachedFromWindow() {
- super.onDetachedFromWindow()
- mainExecutor.execute {
- keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
- }
- }
-
override fun setColor(color: Int) {
cameraProtectionColor = color
invalidate()
@@ -106,18 +86,22 @@
}
}
- override fun enableShowProtection(show: Boolean) {
- val animationRequired =
+ override fun enableShowProtection(isCameraActive: Boolean) {
+ val scanningAnimationRequiredWhenCameraActive =
keyguardUpdateMonitor.isFaceDetectionRunning || authController.isShowing
- val showScanningAnimNow = animationRequired && show
- if (showScanningAnimNow == showScanningAnim) {
+ val faceAuthSucceeded = keyguardUpdateMonitor.isFaceAuthenticated
+ val showScanningAnimationNow = scanningAnimationRequiredWhenCameraActive && isCameraActive
+ if (showScanningAnimationNow == showScanningAnim) {
return
}
- logger.cameraProtectionShownOrHidden(keyguardUpdateMonitor.isFaceDetectionRunning,
+ logger.cameraProtectionShownOrHidden(
+ showScanningAnimationNow,
+ keyguardUpdateMonitor.isFaceDetectionRunning,
authController.isShowing,
- show,
+ faceAuthSucceeded,
+ isCameraActive,
showScanningAnim)
- showScanningAnim = showScanningAnimNow
+ showScanningAnim = showScanningAnimationNow
updateProtectionBoundingPath()
// Delay the relayout until the end of the animation when hiding,
// otherwise we'd clip it.
@@ -128,7 +112,7 @@
cameraProtectionAnimator?.cancel()
cameraProtectionAnimator = ValueAnimator.ofFloat(cameraProtectionProgress,
- if (showScanningAnimNow) SHOW_CAMERA_PROTECTION_SCALE
+ if (showScanningAnimationNow) SHOW_CAMERA_PROTECTION_SCALE
else HIDDEN_CAMERA_PROTECTION_SCALE).apply {
startDelay =
if (showScanningAnim) 0
@@ -297,20 +281,10 @@
}
private fun createFaceScanningRimAnimator(): AnimatorSet {
- val dontPulse = featureFlags.isEnabled(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION)
- if (dontPulse) {
- return AnimatorSet().apply {
- playSequentially(
- cameraProtectionAnimator,
- createRimAppearAnimator(),
- )
- }
- }
return AnimatorSet().apply {
playSequentially(
- cameraProtectionAnimator,
- createRimAppearAnimator(),
- createPulseAnimator()
+ cameraProtectionAnimator,
+ createRimAppearAnimator(),
)
}
}
@@ -348,81 +322,16 @@
invalidate()
}
- private fun createPulseAnimator(): ValueAnimator {
- return ValueAnimator.ofFloat(
- PULSE_RADIUS_OUT, PULSE_RADIUS_IN).apply {
- duration = HALF_PULSE_DURATION
- interpolator = Interpolators.STANDARD
- repeatCount = 11 // Pulse inwards and outwards, reversing direction, 6 times
- repeatMode = ValueAnimator.REVERSE
- addUpdateListener(this@FaceScanningOverlay::updateRimProgress)
- }
- }
-
- private val keyguardUpdateMonitorCallback = object : KeyguardUpdateMonitorCallback() {
- override fun onBiometricAuthenticated(
- userId: Int,
- biometricSourceType: BiometricSourceType?,
- isStrongBiometric: Boolean
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = true
- logger.biometricEvent("biometricAuthenticated")
- enableShowProtection(true)
- }
- }
- }
-
- override fun onBiometricAcquired(
- biometricSourceType: BiometricSourceType?,
- acquireInfo: Int
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false // reset
- }
- }
- }
-
- override fun onBiometricAuthFailed(biometricSourceType: BiometricSourceType?) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false
- logger.biometricEvent("biometricFailed")
- enableShowProtection(false)
- }
- }
- }
-
- override fun onBiometricError(
- msgId: Int,
- errString: String?,
- biometricSourceType: BiometricSourceType?
- ) {
- if (biometricSourceType == BiometricSourceType.FACE) {
- post {
- faceAuthSucceeded = false
- logger.biometricEvent("biometricError")
- enableShowProtection(false)
- }
- }
- }
- }
-
companion object {
private const val HIDDEN_RIM_SCALE = HIDDEN_CAMERA_PROTECTION_SCALE
private const val SHOW_CAMERA_PROTECTION_SCALE = 1f
- private const val PULSE_RADIUS_IN = 1.1f
private const val PULSE_RADIUS_OUT = 1.125f
private const val PULSE_RADIUS_SUCCESS = 1.25f
private const val CAMERA_PROTECTION_APPEAR_DURATION = 250L
private const val PULSE_APPEAR_DURATION = 250L // without start delay
- private const val HALF_PULSE_DURATION = 500L
-
private const val PULSE_SUCCESS_DISAPPEAR_DURATION = 400L
private const val CAMERA_PROTECTION_SUCCESS_DISAPPEAR_DURATION = 500L // without start delay
diff --git a/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java b/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
index 494efb7..45cc71e 100644
--- a/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/GuestResetOrExitSessionReceiver.java
@@ -36,7 +36,6 @@
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.UserSwitcherController;
-import dagger.Lazy;
import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;
@@ -141,23 +140,23 @@
* reset and restart of guest user.
*/
public static final class ResetSessionDialogFactory {
- private final Lazy<SystemUIDialog> mDialogLazy;
+ private final SystemUIDialog.Factory mDialogFactory;
private final Resources mResources;
private final ResetSessionDialogClickListener.Factory mClickListenerFactory;
@Inject
public ResetSessionDialogFactory(
- Lazy<SystemUIDialog> dialogLazy,
+ SystemUIDialog.Factory dialogFactory,
@Main Resources resources,
ResetSessionDialogClickListener.Factory clickListenerFactory) {
- mDialogLazy = dialogLazy;
+ mDialogFactory = dialogFactory;
mResources = resources;
mClickListenerFactory = clickListenerFactory;
}
/** Create a guest reset dialog instance */
public AlertDialog create(int userId) {
- SystemUIDialog dialog = mDialogLazy.get();
+ SystemUIDialog dialog = mDialogFactory.create();
ResetSessionDialogClickListener listener = mClickListenerFactory.create(
userId, dialog);
dialog.setTitle(com.android.settingslib.R.string.guest_reset_and_restart_dialog_title);
@@ -216,22 +215,22 @@
* exit of guest user.
*/
public static final class ExitSessionDialogFactory {
- private final Lazy<SystemUIDialog> mDialogLazy;
+ private final SystemUIDialog.Factory mDialogFactory;
private final ExitSessionDialogClickListener.Factory mClickListenerFactory;
private final Resources mResources;
@Inject
public ExitSessionDialogFactory(
- Lazy<SystemUIDialog> dialogLazy,
+ SystemUIDialog.Factory dialogFactory,
ExitSessionDialogClickListener.Factory clickListenerFactory,
@Main Resources resources) {
- mDialogLazy = dialogLazy;
+ mDialogFactory = dialogFactory;
mClickListenerFactory = clickListenerFactory;
mResources = resources;
}
public AlertDialog create(boolean isEphemeral, int userId) {
- SystemUIDialog dialog = mDialogLazy.get();
+ SystemUIDialog dialog = mDialogFactory.create();
ExitSessionDialogClickListener clickListener = mClickListenerFactory.create(
isEphemeral, userId, dialog);
if (isEphemeral) {
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 7ccf704..685ea81 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -5,6 +5,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.SearchManager;
import android.app.StatusBarManager;
@@ -146,6 +147,7 @@
private final DisplayTracker mDisplayTracker;
private final SecureSettings mSecureSettings;
private final SelectedUserInteractor mSelectedUserInteractor;
+ private final ActivityManager mActivityManager;
private final DeviceProvisionedController mDeviceProvisionedController;
@@ -186,7 +188,8 @@
UserTracker userTracker,
DisplayTracker displayTracker,
SecureSettings secureSettings,
- SelectedUserInteractor selectedUserInteractor) {
+ SelectedUserInteractor selectedUserInteractor,
+ ActivityManager activityManager) {
mContext = context;
mDeviceProvisionedController = controller;
mCommandQueue = commandQueue;
@@ -199,6 +202,7 @@
mDisplayTracker = displayTracker;
mSecureSettings = secureSettings;
mSelectedUserInteractor = selectedUserInteractor;
+ mActivityManager = activityManager;
registerVoiceInteractionSessionListener();
registerVisualQueryRecognitionStatusListener();
@@ -270,6 +274,9 @@
}
public void startAssist(Bundle args) {
+ if (mActivityManager.getLockTaskModeState() == ActivityManager.LOCK_TASK_MODE_LOCKED) {
+ return;
+ }
if (shouldOverrideAssist(args)) {
try {
if (mOverviewProxyService.getProxy() == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
index 8fe42b5..877afce 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java
@@ -86,6 +86,8 @@
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.Execution;
+import dagger.Lazy;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -133,7 +135,7 @@
@NonNull private final Provider<PromptSelectorInteractor> mPromptSelectorInteractor;
@NonNull private final Provider<CredentialViewModel> mCredentialViewModelProvider;
@NonNull private final Provider<PromptViewModel> mPromptViewModelProvider;
- @NonNull private final LogContextInteractor mLogContextInteractor;
+ @NonNull private final Lazy<LogContextInteractor> mLogContextInteractor;
private final Display mDisplay;
private float mScaleFactor = 1f;
@@ -156,7 +158,7 @@
@Nullable private UdfpsOverlayParams mUdfpsOverlayParams;
@Nullable private IUdfpsRefreshRateRequestCallback mUdfpsRefreshRateRequestCallback;
@Nullable private SideFpsController mSideFpsController;
- @NonNull private UdfpsLogger mUdfpsLogger;
+ @NonNull private Lazy<UdfpsLogger> mUdfpsLogger;
@VisibleForTesting IBiometricSysuiReceiver mReceiver;
@VisibleForTesting @NonNull final BiometricDisplayListener mOrientationListener;
@Nullable private final List<FaceSensorPropertiesInternal> mFaceProps;
@@ -309,7 +311,7 @@
});
mUdfpsController.setAuthControllerUpdateUdfpsLocation(this::updateUdfpsLocation);
mUdfpsController.setUdfpsDisplayMode(new UdfpsDisplayMode(mContext, mExecution,
- this, mUdfpsLogger));
+ this, mUdfpsLogger.get()));
mUdfpsBounds = mUdfpsProps.get(0).getLocation().getRect();
}
@@ -755,8 +757,8 @@
@NonNull AuthDialogPanelInteractionDetector panelInteractionDetector,
@NonNull UserManager userManager,
@NonNull LockPatternUtils lockPatternUtils,
- @NonNull UdfpsLogger udfpsLogger,
- @NonNull LogContextInteractor logContextInteractor,
+ @NonNull Lazy<UdfpsLogger> udfpsLogger,
+ @NonNull Lazy<LogContextInteractor> logContextInteractor,
@NonNull Provider<PromptCredentialInteractor> promptCredentialInteractorProvider,
@NonNull Provider<PromptSelectorInteractor> promptSelectorInteractorProvider,
@NonNull Provider<CredentialViewModel> credentialViewModelProvider,
@@ -903,7 +905,7 @@
@Override
public void setBiometricContextListener(IBiometricContextListener listener) {
- mLogContextInteractor.addBiometricContextListener(listener);
+ mLogContextInteractor.get().addBiometricContextListener(listener);
}
/**
@@ -932,14 +934,14 @@
*/
public void requestMaxRefreshRate(boolean request) throws RemoteException {
if (mUdfpsRefreshRateRequestCallback == null) {
- mUdfpsLogger.log(
+ mUdfpsLogger.get().log(
"PreAuthRefreshRate",
"skip request - refreshRateCallback is null",
LogLevel.DEBUG
);
return;
}
- mUdfpsLogger.requestMaxRefreshRate(request);
+ mUdfpsLogger.get().requestMaxRefreshRate(request);
mUdfpsRefreshRateRequestCallback.onAuthenticationPossible(mContext.getDisplayId(), request);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
index 8d1d905..04c2351 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetector.kt
@@ -37,17 +37,25 @@
@MainThread
fun enable(onShadeInteraction: Runnable) {
- if (shadeExpansionCollectorJob == null) {
- shadeExpansionCollectorJob =
- scope.launch {
- // wait for it to emit true once
- shadeInteractorLazy.get().isUserInteracting.first { it }
- onShadeInteraction.run()
- }
- shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null }
- } else {
+ if (shadeExpansionCollectorJob != null) {
Log.e(TAG, "Already enabled")
+ return
}
+ //TODO(b/313957306) delete this check
+ if (shadeInteractorLazy.get().isUserInteracting.value) {
+ // Workaround for b/311266890. This flow is in an error state that breaks this.
+ Log.e(TAG, "isUserInteracting already true, skipping enable")
+ return
+ }
+ shadeExpansionCollectorJob =
+ scope.launch {
+ Log.i(TAG, "Enable detector")
+ // wait for it to emit true once
+ shadeInteractorLazy.get().isUserInteracting.first { it }
+ Log.i(TAG, "Detector detected shade interaction")
+ onShadeInteraction.run()
+ }
+ shadeExpansionCollectorJob?.invokeOnCompletion { shadeExpansionCollectorJob = null }
}
@MainThread
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
index c22a66b..df27cbb 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationBroadcastReceiver.java
@@ -22,7 +22,6 @@
import android.hardware.biometrics.BiometricSourceType;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
@@ -41,7 +40,8 @@
private final Context mContext;
private final BiometricNotificationDialogFactory mNotificationDialogFactory;
@Inject
- BiometricNotificationBroadcastReceiver(Context context,
+ BiometricNotificationBroadcastReceiver(
+ Context context,
BiometricNotificationDialogFactory notificationDialogFactory) {
mContext = context;
mNotificationDialogFactory = notificationDialogFactory;
@@ -53,15 +53,16 @@
switch (action) {
case ACTION_SHOW_FACE_REENROLL_DIALOG:
- mNotificationDialogFactory.createReenrollDialog(mContext,
- new SystemUIDialog(mContext),
+ mNotificationDialogFactory.createReenrollDialog(
+ mContext.getUserId(),
+ mContext::startActivity,
BiometricSourceType.FACE)
.show();
break;
case ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG:
mNotificationDialogFactory.createReenrollDialog(
- mContext,
- new SystemUIDialog(mContext),
+ mContext.getUserId(),
+ mContext::startActivity,
BiometricSourceType.FINGERPRINT)
.show();
break;
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
index 2962be8..fd0feef 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricNotificationDialogFactory.java
@@ -16,9 +16,11 @@
package com.android.systemui.biometrics;
+import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.app.Dialog;
-import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
@@ -29,9 +31,11 @@
import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
+import javax.inject.Provider;
/**
* Manages the creation of dialogs to be shown for biometric re enroll notifications.
@@ -39,44 +43,56 @@
@SysUISingleton
public class BiometricNotificationDialogFactory {
private static final String TAG = "BiometricNotificationDialogFactory";
+ private final Resources mResources;
+ private final SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Nullable private final FingerprintManager mFingerprintManager;
+ @Nullable private final FaceManager mFaceManager;
@Inject
- BiometricNotificationDialogFactory() {}
+ BiometricNotificationDialogFactory(
+ @Main Resources resources,
+ SystemUIDialog.Factory systemUIDialogFactory,
+ @Nullable FingerprintManager fingerprintManager,
+ @Nullable FaceManager faceManager) {
+ mResources = resources;
+ mSystemUIDialogFactory = systemUIDialogFactory;
+ mFingerprintManager = fingerprintManager;
+ mFaceManager = faceManager;
+ }
- Dialog createReenrollDialog(final Context context, final SystemUIDialog sysuiDialog,
- BiometricSourceType biometricSourceType) {
+ Dialog createReenrollDialog(
+ int userId, ActivityStarter activityStarter, BiometricSourceType biometricSourceType) {
+ SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
if (biometricSourceType == BiometricSourceType.FACE) {
- sysuiDialog.setTitle(context.getString(R.string.face_re_enroll_dialog_title));
- sysuiDialog.setMessage(context.getString(R.string.face_re_enroll_dialog_content));
+ sysuiDialog.setTitle(mResources.getString(R.string.face_re_enroll_dialog_title));
+ sysuiDialog.setMessage(mResources.getString(R.string.face_re_enroll_dialog_content));
} else if (biometricSourceType == BiometricSourceType.FINGERPRINT) {
- FingerprintManager fingerprintManager = context.getSystemService(
- FingerprintManager.class);
- sysuiDialog.setTitle(context.getString(R.string.fingerprint_re_enroll_dialog_title));
- if (fingerprintManager.getEnrolledFingerprints().size() == 1) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setTitle(mResources.getString(R.string.fingerprint_re_enroll_dialog_title));
+ if (mFingerprintManager.getEnrolledFingerprints().size() == 1) {
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_re_enroll_dialog_content_singular));
} else {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_re_enroll_dialog_content));
}
}
sysuiDialog.setPositiveButton(R.string.biometric_re_enroll_dialog_confirm,
- (dialog, which) -> onReenrollDialogConfirm(context, biometricSourceType));
+ (dialog, which) -> onReenrollDialogConfirm(
+ userId, biometricSourceType, activityStarter));
sysuiDialog.setNegativeButton(R.string.biometric_re_enroll_dialog_cancel,
(dialog, which) -> {});
return sysuiDialog;
}
- private static Dialog createReenrollFailureDialog(Context context,
- BiometricSourceType biometricType) {
- final SystemUIDialog sysuiDialog = new SystemUIDialog(context);
+ private Dialog createReenrollFailureDialog(BiometricSourceType biometricType) {
+ final SystemUIDialog sysuiDialog = mSystemUIDialogFactory.create();
if (biometricType == BiometricSourceType.FACE) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.face_reenroll_failure_dialog_content));
} else if (biometricType == BiometricSourceType.FINGERPRINT) {
- sysuiDialog.setMessage(context.getString(
+ sysuiDialog.setMessage(mResources.getString(
R.string.fingerprint_reenroll_failure_dialog_content));
}
@@ -84,41 +100,41 @@
return sysuiDialog;
}
- private static void onReenrollDialogConfirm(final Context context,
- BiometricSourceType biometricType) {
+ private void onReenrollDialogConfirm(
+ int userId, BiometricSourceType biometricType, ActivityStarter activityStarter) {
if (biometricType == BiometricSourceType.FACE) {
- reenrollFace(context);
+ reenrollFace(userId, activityStarter);
} else if (biometricType == BiometricSourceType.FINGERPRINT) {
- reenrollFingerprint(context);
+ reenrollFingerprint(userId, activityStarter);
}
}
- private static void reenrollFingerprint(Context context) {
- FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class);
- if (fingerprintManager == null) {
+ @SuppressLint("MissingPermission")
+ private void reenrollFingerprint(int userId, ActivityStarter activityStarter) {
+ if (mFingerprintManager == null) {
Log.e(TAG, "Not launching enrollment. Fingerprint manager was null!");
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT).show();
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT).show();
return;
}
- if (!fingerprintManager.hasEnrolledTemplates(context.getUserId())) {
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT).show();
+ if (!mFingerprintManager.hasEnrolledTemplates(userId)) {
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT).show();
return;
}
// Remove all enrolled fingerprint. Launch enrollment if successful.
- fingerprintManager.removeAll(context.getUserId(),
+ mFingerprintManager.removeAll(userId,
new FingerprintManager.RemovalCallback() {
boolean mDidShowFailureDialog;
@Override
- public void onRemovalError(Fingerprint fingerprint, int errMsgId,
- CharSequence errString) {
+ public void onRemovalError(
+ Fingerprint fingerprint, int errMsgId, CharSequence errString) {
Log.e(TAG, "Not launching enrollment."
+ "Failed to remove existing face(s).");
if (!mDidShowFailureDialog) {
mDidShowFailureDialog = true;
- createReenrollFailureDialog(context, BiometricSourceType.FINGERPRINT)
+ createReenrollFailureDialog(BiometricSourceType.FINGERPRINT)
.show();
}
}
@@ -129,27 +145,27 @@
Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL);
intent.setPackage("com.android.settings");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
+ activityStarter.startActivity(intent);
}
}
});
}
- private static void reenrollFace(Context context) {
- FaceManager faceManager = context.getSystemService(FaceManager.class);
- if (faceManager == null) {
+ @SuppressLint("MissingPermission")
+ private void reenrollFace(int userId, ActivityStarter activityStarter) {
+ if (mFaceManager == null) {
Log.e(TAG, "Not launching enrollment. Face manager was null!");
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
return;
}
- if (!faceManager.hasEnrolledTemplates(context.getUserId())) {
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ if (!mFaceManager.hasEnrolledTemplates(userId)) {
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
return;
}
// Remove all enrolled faces. Launch enrollment if successful.
- faceManager.removeAll(context.getUserId(),
+ mFaceManager.removeAll(userId,
new FaceManager.RemovalCallback() {
boolean mDidShowFailureDialog;
@@ -159,7 +175,7 @@
+ "Failed to remove existing face(s).");
if (!mDidShowFailureDialog) {
mDidShowFailureDialog = true;
- createReenrollFailureDialog(context, BiometricSourceType.FACE).show();
+ createReenrollFailureDialog(BiometricSourceType.FACE).show();
}
}
@@ -169,9 +185,13 @@
Intent intent = new Intent("android.settings.FACE_ENROLL");
intent.setPackage("com.android.settings");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
+ activityStarter.startActivity(intent);
}
}
});
}
+
+ interface ActivityStarter {
+ void startActivity(Intent intent);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 72d14ba..bb6ef41 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -74,6 +74,8 @@
import com.android.systemui.biometrics.udfps.SinglePointerTouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessor;
import com.android.systemui.biometrics.udfps.TouchProcessorResult;
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel;
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel;
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor;
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor;
import com.android.systemui.dagger.SysUISingleton;
@@ -102,6 +104,8 @@
import com.android.systemui.util.concurrency.Execution;
import com.android.systemui.util.time.SystemClock;
+import dagger.Lazy;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
@@ -164,6 +168,10 @@
@NonNull private final PrimaryBouncerInteractor mPrimaryBouncerInteractor;
@Nullable private final TouchProcessor mTouchProcessor;
@NonNull private final SessionTracker mSessionTracker;
+ @NonNull private final Lazy<DeviceEntryUdfpsTouchOverlayViewModel>
+ mDeviceEntryUdfpsTouchOverlayViewModel;
+ @NonNull private final Lazy<DefaultUdfpsTouchOverlayViewModel>
+ mDefaultUdfpsTouchOverlayViewModel;
@NonNull private final AlternateBouncerInteractor mAlternateBouncerInteractor;
@NonNull private final InputManager mInputManager;
@NonNull private final UdfpsKeyguardAccessibilityDelegate mUdfpsKeyguardAccessibilityDelegate;
@@ -284,7 +292,9 @@
mAlternateBouncerInteractor,
mUdfpsKeyguardAccessibilityDelegate,
mKeyguardTransitionInteractor,
- mSelectedUserInteractor
+ mSelectedUserInteractor,
+ mDeviceEntryUdfpsTouchOverlayViewModel,
+ mDefaultUdfpsTouchOverlayViewModel
)));
}
@@ -501,11 +511,13 @@
+ mOverlay.getRequestId());
return false;
}
- if ((mLockscreenShadeTransitionController.getQSDragProgress() != 0f
- && !mAlternateBouncerInteractor.isVisibleState())
- || mPrimaryBouncerInteractor.isInTransit()) {
- Log.w(TAG, "ignoring touch due to qsDragProcess or primaryBouncerInteractor");
- return false;
+ if (!DeviceEntryUdfpsRefactor.isEnabled()) {
+ if ((mLockscreenShadeTransitionController.getQSDragProgress() != 0f
+ && !mAlternateBouncerInteractor.isVisibleState())
+ || mPrimaryBouncerInteractor.isInTransit()) {
+ Log.w(TAG, "ignoring touch due to qsDragProcess or primaryBouncerInteractor");
+ return false;
+ }
}
if (event.getAction() == MotionEvent.ACTION_DOWN
|| event.getAction() == MotionEvent.ACTION_HOVER_ENTER) {
@@ -657,7 +669,9 @@
@NonNull Provider<UdfpsKeyguardViewModels> udfpsKeyguardViewModelsProvider,
@NonNull SelectedUserInteractor selectedUserInteractor,
@NonNull FpsUnlockTracker fpsUnlockTracker,
- @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor) {
+ @NonNull KeyguardTransitionInteractor keyguardTransitionInteractor,
+ Lazy<DeviceEntryUdfpsTouchOverlayViewModel> deviceEntryUdfpsTouchOverlayViewModel,
+ Lazy<DefaultUdfpsTouchOverlayViewModel> defaultUdfpsTouchOverlayViewModel) {
mContext = context;
mExecution = execution;
mVibrator = vibrator;
@@ -706,6 +720,8 @@
mTouchProcessor = singlePointerTouchProcessor;
mSessionTracker = sessionTracker;
+ mDeviceEntryUdfpsTouchOverlayViewModel = deviceEntryUdfpsTouchOverlayViewModel;
+ mDefaultUdfpsTouchOverlayViewModel = defaultUdfpsTouchOverlayViewModel;
mDumpManager.registerDumpable(TAG, this);
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 2d54f7a..452cd6a 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -46,7 +46,10 @@
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.animation.ActivityLaunchAnimator
import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams
+import com.android.systemui.biometrics.ui.binder.UdfpsTouchOverlayBinder
import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay
+import com.android.systemui.biometrics.ui.viewmodel.DefaultUdfpsTouchOverlayViewModel
+import com.android.systemui.biometrics.ui.viewmodel.DeviceEntryUdfpsTouchOverlayViewModel
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
@@ -62,6 +65,7 @@
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
+import dagger.Lazy
import kotlinx.coroutines.ExperimentalCoroutinesApi
private const val TAG = "UdfpsControllerOverlay"
@@ -102,6 +106,8 @@
private val udfpsKeyguardAccessibilityDelegate: UdfpsKeyguardAccessibilityDelegate,
private val transitionInteractor: KeyguardTransitionInteractor,
private val selectedUserInteractor: SelectedUserInteractor,
+ private val deviceEntryUdfpsTouchOverlayViewModel: Lazy<DeviceEntryUdfpsTouchOverlayViewModel>,
+ private val defaultUdfpsTouchOverlayViewModel: Lazy<DefaultUdfpsTouchOverlayViewModel>,
) {
private var overlayViewLegacy: UdfpsView? = null
private set
@@ -184,12 +190,19 @@
importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO
}
windowManager.addView(this, coreLayoutParams.updateDimensions(null))
+ when (requestReason) {
+ REASON_AUTH_KEYGUARD ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = deviceEntryUdfpsTouchOverlayViewModel.get(),
+ )
+ else ->
+ UdfpsTouchOverlayBinder.bind(
+ view = this,
+ viewModel = defaultUdfpsTouchOverlayViewModel.get(),
+ )
+ }
}
- // TODO (b/305234447): Bind view model to UdfpsTouchOverlay here to control
- // the visibility (sometimes, even if UDFPS is running, the UDFPS UI can be
- // obscured and we don't want to accept touches. ie: for enrollment don't accept
- // touches when the shade is expanded and for keyguard: don't accept touches
- // depending on the keyguard & shade state
} else {
overlayViewLegacy = (inflater.inflate(
R.layout.udfps_view, null, false
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
index 6954eb6..a2ac66f 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerLegacy.kt
@@ -26,11 +26,13 @@
import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.animation.ActivityLaunchAnimator
-import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATION_UNLOCKED_SCREEN_OFF
+import com.android.systemui.biometrics.UdfpsKeyguardViewLegacy.ANIMATE_APPEAR_ON_SCREEN_OFF
import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dump.DumpManager
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.ui.adapter.UdfpsKeyguardViewControllerAdapter
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -49,7 +51,7 @@
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
-import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
/** Class that coordinates non-HBM animations during keyguard authentication. */
@@ -191,8 +193,38 @@
repeatOnLifecycle(Lifecycle.State.CREATED) {
listenForBouncerExpansion(this)
listenForAlternateBouncerVisibility(this)
+ listenForOccludedToAodTransition(this)
listenForGoneToAodTransition(this)
listenForLockscreenAodTransitions(this)
+ listenForAodToOccludedTransitions(this)
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun listenForAodToOccludedTransitions(scope: CoroutineScope): Job {
+ return scope.launch {
+ transitionInteractor.transition(KeyguardState.AOD, KeyguardState.OCCLUDED).collect {
+ transitionStep ->
+ view.onDozeAmountChanged(
+ 1f - transitionStep.value,
+ 1f - transitionStep.value,
+ UdfpsKeyguardViewLegacy.ANIMATION_NONE,
+ )
+ }
+ }
+ }
+
+ @VisibleForTesting
+ suspend fun listenForOccludedToAodTransition(scope: CoroutineScope): Job {
+ return scope.launch {
+ transitionInteractor.transition(KeyguardState.OCCLUDED, KeyguardState.AOD).collect {
+ transitionStep ->
+ view.onDozeAmountChanged(
+ transitionStep.value,
+ transitionStep.value,
+ ANIMATE_APPEAR_ON_SCREEN_OFF,
+ )
}
}
}
@@ -204,7 +236,7 @@
view.onDozeAmountChanged(
transitionStep.value,
transitionStep.value,
- ANIMATION_UNLOCKED_SCREEN_OFF,
+ ANIMATE_APPEAR_ON_SCREEN_OFF,
)
}
}
@@ -214,11 +246,26 @@
suspend fun listenForLockscreenAodTransitions(scope: CoroutineScope): Job {
return scope.launch {
transitionInteractor.dozeAmountTransition.collect { transitionStep ->
- view.onDozeAmountChanged(
- transitionStep.value,
- transitionStep.value,
- UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
- )
+ if (transitionStep.transitionState == TransitionState.CANCELED) {
+ if (
+ transitionInteractor.startedKeyguardTransitionStep.first().to !=
+ KeyguardState.AOD
+ ) {
+ // If the next started transition isn't transitioning back to AOD, force
+ // doze amount to be 0f (as if the transition to the lockscreen completed).
+ view.onDozeAmountChanged(
+ 0f,
+ 0f,
+ UdfpsKeyguardViewLegacy.ANIMATION_NONE,
+ )
+ }
+ } else {
+ view.onDozeAmountChanged(
+ transitionStep.value,
+ transitionStep.value,
+ UdfpsKeyguardViewLegacy.ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN,
+ )
+ }
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
index f4ed8ce..6d4eea8 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewLegacy.java
@@ -133,7 +133,7 @@
// if we're animating from screen off, we can immediately place the icon in the
// AoD-burn in location, else we need to translate the icon from LS => AoD.
- final float darkAmountForAnimation = mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF
+ final float darkAmountForAnimation = mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
? 1f : mInterpolatedDarkAmount;
final float burnInOffsetX = MathUtils.lerp(0f,
getBurnInOffset(mMaxBurnInOffsetX * 2, true /* xAxis */)
@@ -171,7 +171,7 @@
mAnimationType == ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN
&& (mInterpolatedDarkAmount == 0f || mInterpolatedDarkAmount == 1f);
final boolean doneAnimatingUnlockedScreenOff =
- mAnimationType == ANIMATION_UNLOCKED_SCREEN_OFF
+ mAnimationType == ANIMATE_APPEAR_ON_SCREEN_OFF
&& (mInterpolatedDarkAmount == 1f);
if (doneAnimatingBetweenAodAndLS || doneAnimatingUnlockedScreenOff) {
mAnimationType = ANIMATION_NONE;
@@ -243,10 +243,10 @@
static final int ANIMATION_NONE = 0;
static final int ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN = 1;
- static final int ANIMATION_UNLOCKED_SCREEN_OFF = 2;
+ static final int ANIMATE_APPEAR_ON_SCREEN_OFF = 2;
@Retention(RetentionPolicy.SOURCE)
- @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATION_UNLOCKED_SCREEN_OFF})
+ @IntDef({ANIMATION_NONE, ANIMATION_BETWEEN_AOD_AND_LOCKSCREEN, ANIMATE_APPEAR_ON_SCREEN_OFF})
private @interface AnimationType {}
void onDozeAmountChanged(float linear, float eased, @AnimationType int animationType) {
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
new file mode 100644
index 0000000..bb6a68b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/UdfpsTouchOverlayBinder.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.biometrics.ui.binder
+
+import androidx.core.view.isInvisible
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
+import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay
+import com.android.systemui.biometrics.ui.viewmodel.UdfpsTouchOverlayViewModel
+import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
+import com.android.systemui.lifecycle.repeatWhenAttached
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.launch
+
+@ExperimentalCoroutinesApi
+object UdfpsTouchOverlayBinder {
+
+ /**
+ * Updates visibility for the UdfpsTouchOverlay which controls whether the view will receive
+ * touches or not.
+ */
+ @JvmStatic
+ fun bind(
+ view: UdfpsTouchOverlay,
+ viewModel: UdfpsTouchOverlayViewModel,
+ ) {
+ if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) return
+ view.repeatWhenAttached {
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ launch {
+ viewModel.shouldHandleTouches.collect { shouldHandleTouches ->
+ view.isInvisible = !shouldHandleTouches
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt
new file mode 100644
index 0000000..f8338ae
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModel.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.biometrics.ui.viewmodel
+
+import com.android.systemui.shade.domain.interactor.ShadeInteractor
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.statusbar.phone.hideAffordancesRequest
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+
+/**
+ * Default view model for the UdfpsTouchOverlay.
+ *
+ * By default, don't handle touches if any of the following are true:
+ * - shade is fully or partially expanded
+ * - any SysUI dialogs are obscuring the display
+ */
+@ExperimentalCoroutinesApi
+class DefaultUdfpsTouchOverlayViewModel
+@Inject
+constructor(
+ shadeInteractor: ShadeInteractor,
+ systemUIDialogManager: SystemUIDialogManager,
+) : UdfpsTouchOverlayViewModel {
+ private val shadeExpandedOrExpanding: Flow<Boolean> = shadeInteractor.isAnyExpanded
+ override val shouldHandleTouches: Flow<Boolean> =
+ combine(
+ shadeExpandedOrExpanding,
+ systemUIDialogManager.hideAffordancesRequest,
+ ) { shadeExpandedOrExpanding, dialogRequestingHideAffordances ->
+ !shadeExpandedOrExpanding && !dialogRequestingHideAffordances
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
new file mode 100644
index 0000000..c19ea19
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModel.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.biometrics.ui.viewmodel
+
+import com.android.systemui.keyguard.ui.viewmodel.DeviceEntryIconViewModel
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.statusbar.phone.hideAffordancesRequest
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+
+/**
+ * View model for the UdfpsTouchOverlay for when UDFPS is being requested for device entry. Handles
+ * touches as long as the device entry views are visible.
+ */
+@ExperimentalCoroutinesApi
+class DeviceEntryUdfpsTouchOverlayViewModel
+@Inject
+constructor(
+ deviceEntryIconViewModel: DeviceEntryIconViewModel,
+ systemUIDialogManager: SystemUIDialogManager,
+) : UdfpsTouchOverlayViewModel {
+ // TODO (b/305234447): AlternateBouncer showing overrides sysuiDialogHideAffordancesRequest
+ override val shouldHandleTouches: Flow<Boolean> =
+ combine(
+ deviceEntryIconViewModel.deviceEntryViewAlpha,
+ systemUIDialogManager.hideAffordancesRequest,
+ ) { deviceEntryViewAlpha, dialogRequestingHideAffordances ->
+ deviceEntryViewAlpha > ALLOW_TOUCH_ALPHA_THRESHOLD && !dialogRequestingHideAffordances
+ }
+
+ companion object {
+ // only allow touches if the view is still mostly visible
+ const val ALLOW_TOUCH_ALPHA_THRESHOLD = .9f
+ }
+}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt
similarity index 70%
copy from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
copy to packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt
index 4098987..3943fc4 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/UdfpsTouchOverlayViewModel.kt
@@ -14,10 +14,12 @@
* limitations under the License.
*/
-package com.android.settingslib.spaprivileged.settingsprovider
+package com.android.systemui.biometrics.ui.viewmodel
-import android.content.Context
import kotlinx.coroutines.flow.Flow
-fun Context.settingsGlobalChangeFlow(name: String, sendInitialValue: Boolean = true): Flow<Unit> =
- settingsGlobalFlow(name, sendInitialValue) { }
+/** Models the UI state for the UdfpsTouchOverlay. */
+interface UdfpsTouchOverlayViewModel {
+ /** Whether the UDFPS touch overlay should allow touches to be handled. */
+ val shouldHandleTouches: Flow<Boolean>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
index 17bf1a7..b78b1f1 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogController.java
@@ -16,16 +16,11 @@
package com.android.systemui.bluetooth;
-import android.annotation.Nullable;
-import android.content.Context;
import android.view.View;
-import com.android.internal.logging.UiEventLogger;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.systemui.animation.DialogLaunchAnimator;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
-import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import javax.inject.Inject;
@@ -35,25 +30,15 @@
@SysUISingleton
public class BroadcastDialogController {
- private Context mContext;
- private UiEventLogger mUiEventLogger;
- private DialogLaunchAnimator mDialogLaunchAnimator;
- private MediaOutputDialogFactory mMediaOutputDialogFactory;
- private final LocalBluetoothManager mLocalBluetoothManager;
- private BroadcastSender mBroadcastSender;
+ private final DialogLaunchAnimator mDialogLaunchAnimator;
+ private final BroadcastDialogDelegate.Factory mBroadcastDialogFactory;
@Inject
- public BroadcastDialogController(Context context, UiEventLogger uiEventLogger,
+ public BroadcastDialogController(
DialogLaunchAnimator dialogLaunchAnimator,
- MediaOutputDialogFactory mediaOutputDialogFactory,
- @Nullable LocalBluetoothManager localBluetoothManager,
- BroadcastSender broadcastSender) {
- mContext = context;
- mUiEventLogger = uiEventLogger;
+ BroadcastDialogDelegate.Factory broadcastDialogFactory) {
mDialogLaunchAnimator = dialogLaunchAnimator;
- mMediaOutputDialogFactory = mediaOutputDialogFactory;
- mLocalBluetoothManager = localBluetoothManager;
- mBroadcastSender = broadcastSender;
+ mBroadcastDialogFactory = broadcastDialogFactory;
}
/** Creates a [BroadcastDialog] for the user to switch broadcast or change the output device
@@ -61,11 +46,10 @@
* @param currentBroadcastAppName Indicates the APP name currently broadcasting
* @param outputPkgName Indicates the output media package name to be switched
*/
- public void createBroadcastDialog(String currentBroadcastAppName, String outputPkgName,
- boolean aboveStatusBar, View view) {
- BroadcastDialog broadcastDialog = new BroadcastDialog(mContext, mMediaOutputDialogFactory,
- mLocalBluetoothManager, currentBroadcastAppName, outputPkgName, mUiEventLogger,
- mBroadcastSender);
+ public void createBroadcastDialog(
+ String currentBroadcastAppName, String outputPkgName, View view) {
+ SystemUIDialog broadcastDialog = mBroadcastDialogFactory.create(
+ currentBroadcastAppName, outputPkgName).createDialog();
if (view != null) {
mDialogLaunchAnimator.showFromView(broadcastDialog, view);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java
similarity index 77%
rename from packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java
rename to packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java
index 00e9527..00bbb20 100644
--- a/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/bluetooth/BroadcastDialogDelegate.java
@@ -5,7 +5,7 @@
* 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
+ * 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,
@@ -18,6 +18,8 @@
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.Dialog;
import android.bluetooth.BluetoothLeBroadcast;
import android.bluetooth.BluetoothLeBroadcastMetadata;
import android.content.Context;
@@ -26,7 +28,6 @@
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
@@ -38,39 +39,47 @@
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.MediaOutputConstants;
-import com.android.systemui.res.R;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.media.controls.util.MediaDataUtils;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.res.R;
import com.android.systemui.statusbar.phone.SystemUIDialog;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
/**
* Dialog for showing le audio broadcasting dialog.
*/
-public class BroadcastDialog extends SystemUIDialog {
+public class BroadcastDialogDelegate implements SystemUIDialog.Delegate {
private static final String TAG = "BroadcastDialog";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private static final int HANDLE_BROADCAST_FAILED_DELAY = 3000;
+ private static final String CURRENT_BROADCAST_APP = "current_broadcast_app";
+ private static final String OUTPUT_PKG_NAME = "output_pkg_name";
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
- private Context mContext;
- private UiEventLogger mUiEventLogger;
- @VisibleForTesting
- protected View mDialogView;
- private MediaOutputDialogFactory mMediaOutputDialogFactory;
- private LocalBluetoothManager mLocalBluetoothManager;
- private BroadcastSender mBroadcastSender;
- private String mCurrentBroadcastApp;
- private String mOutputPackageName;
- private Executor mExecutor;
+ private final Context mContext;
+ private final UiEventLogger mUiEventLogger;
+ private final MediaOutputDialogFactory mMediaOutputDialogFactory;
+ private final LocalBluetoothManager mLocalBluetoothManager;
+ private final BroadcastSender mBroadcastSender;
+ private final SystemUIDialog.Factory mSystemUIDialogFactory;
+ private final String mCurrentBroadcastApp;
+ private final String mOutputPackageName;
+ private final Executor mExecutor;
private boolean mShouldLaunchLeBroadcastDialog;
private Button mSwitchBroadcast;
+ private final Set<SystemUIDialog> mDialogs = new HashSet<>();
+
private final BluetoothLeBroadcast.Callback mBroadcastCallback =
new BluetoothLeBroadcast.Callback() {
@Override
@@ -136,43 +145,64 @@
}
};
- public BroadcastDialog(Context context, MediaOutputDialogFactory mediaOutputDialogFactory,
- LocalBluetoothManager localBluetoothManager, String currentBroadcastApp,
- String outputPkgName, UiEventLogger uiEventLogger, BroadcastSender broadcastSender) {
- super(context);
- if (DEBUG) {
- Log.d(TAG, "Init BroadcastDialog");
- }
+ @AssistedFactory
+ public interface Factory {
+ BroadcastDialogDelegate create(
+ @Assisted(CURRENT_BROADCAST_APP) String currentBroadcastApp,
+ @Assisted(OUTPUT_PKG_NAME) String outputPkgName
+ );
+ }
- mContext = getContext();
+ @AssistedInject
+ BroadcastDialogDelegate(
+ Context context,
+ MediaOutputDialogFactory mediaOutputDialogFactory,
+ @Nullable LocalBluetoothManager localBluetoothManager,
+ UiEventLogger uiEventLogger,
+ Executor executor,
+ BroadcastSender broadcastSender,
+ SystemUIDialog.Factory systemUIDialogFactory,
+ @Assisted(CURRENT_BROADCAST_APP) String currentBroadcastApp,
+ @Assisted(OUTPUT_PKG_NAME) String outputPkgName) {
+ mContext = context;
mMediaOutputDialogFactory = mediaOutputDialogFactory;
mLocalBluetoothManager = localBluetoothManager;
+ mSystemUIDialogFactory = systemUIDialogFactory;
mCurrentBroadcastApp = currentBroadcastApp;
mOutputPackageName = outputPkgName;
mUiEventLogger = uiEventLogger;
- mExecutor = Executors.newSingleThreadExecutor();
+ mExecutor = executor;
mBroadcastSender = broadcastSender;
+
+ if (DEBUG) {
+ Log.d(TAG, "Init BroadcastDialog");
+ }
}
@Override
- public void start() {
+ public SystemUIDialog createDialog() {
+ return mSystemUIDialogFactory.create(this);
+ }
+
+ @Override
+ public void onStart(SystemUIDialog dialog) {
+ mDialogs.add(dialog);
registerBroadcastCallBack(mExecutor, mBroadcastCallback);
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onCreate(SystemUIDialog dialog, Bundle savedInstanceState) {
if (DEBUG) {
Log.d(TAG, "onCreate");
}
mUiEventLogger.log(BroadcastDialogEvent.BROADCAST_DIALOG_SHOW);
- mDialogView = LayoutInflater.from(mContext).inflate(R.layout.broadcast_dialog, null);
- final Window window = getWindow();
- window.setContentView(mDialogView);
+ View dialogView = dialog.getLayoutInflater().inflate(R.layout.broadcast_dialog, null);
+ final Window window = dialog.getWindow();
+ window.setContentView(dialogView);
- TextView title = mDialogView.requireViewById(R.id.dialog_title);
- TextView subTitle = mDialogView.requireViewById(R.id.dialog_subtitle);
+ TextView title = dialogView.requireViewById(R.id.dialog_title);
+ TextView subTitle = dialogView.requireViewById(R.id.dialog_subtitle);
title.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_title, mCurrentBroadcastApp));
String switchBroadcastApp = MediaDataUtils.getAppLabel(mContext, mOutputPackageName,
@@ -180,27 +210,28 @@
subTitle.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_sub_title, switchBroadcastApp));
- mSwitchBroadcast = mDialogView.requireViewById(R.id.switch_broadcast);
- Button changeOutput = mDialogView.requireViewById(R.id.change_output);
- Button cancelBtn = mDialogView.requireViewById(R.id.cancel);
+ mSwitchBroadcast = dialogView.requireViewById(R.id.switch_broadcast);
+ Button changeOutput = dialogView.requireViewById(R.id.change_output);
+ Button cancelBtn = dialogView.requireViewById(R.id.cancel);
mSwitchBroadcast.setText(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_switch_app, switchBroadcastApp), null);
mSwitchBroadcast.setOnClickListener((view) -> startSwitchBroadcast());
changeOutput.setOnClickListener((view) -> {
mMediaOutputDialogFactory.create(mOutputPackageName, true, null);
- dismiss();
+ dialog.dismiss();
});
cancelBtn.setOnClickListener((view) -> {
if (DEBUG) {
Log.d(TAG, "BroadcastDialog dismiss.");
}
- dismiss();
+ dialog.dismiss();
});
}
@Override
- public void stop() {
+ public void onStop(SystemUIDialog dialog) {
unregisterBroadcastCallBack(mBroadcastCallback);
+ mDialogs.remove(dialog);
}
void refreshSwitchBroadcastButton() {
@@ -271,10 +302,9 @@
}
@Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- if (!hasFocus && isShowing()) {
- dismiss();
+ public void onWindowFocusChanged(SystemUIDialog dialog, boolean hasFocus) {
+ if (!hasFocus && dialog.isShowing()) {
+ dialog.dismiss();
}
}
@@ -333,6 +363,6 @@
.setPackage(mContext.getPackageName())
.setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG)
.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, mOutputPackageName));
- dismiss();
+ mDialogs.forEach(Dialog::dismiss);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
index a721100..84f7dd5 100644
--- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/AlternateBouncerInteractor.kt
@@ -18,7 +18,6 @@
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
-import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
@@ -30,10 +29,9 @@
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.flow.asStateFlow
/** Encapsulates business logic for interacting with the lock-screen alternate bouncer. */
@SysUISingleton
@@ -54,15 +52,19 @@
private val alternateBouncerUiAvailableFromSource: HashSet<String> = HashSet()
private val alternateBouncerSupported: StateFlow<Boolean> =
if (DeviceEntryUdfpsRefactor.isEnabled) {
- fingerprintPropertyRepository.sensorType
- .map { sensorType ->
- sensorType.isUdfps() || sensorType == FingerprintSensorType.POWER_BUTTON
- }
- .stateIn(
- scope = scope,
- started = SharingStarted.Eagerly,
- initialValue = false,
- )
+ // The device entry udfps refactor doesn't currently support the alternate bouncer.
+ // TODO: Re-enable when b/287599719 is ready.
+ MutableStateFlow(false).asStateFlow()
+ // fingerprintPropertyRepository.sensorType
+ // .map { sensorType ->
+ // sensorType.isUdfps() || sensorType ==
+ // FingerprintSensorType.POWER_BUTTON
+ // }
+ // .stateIn(
+ // scope = scope,
+ // started = SharingStarted.Eagerly,
+ // initialValue = false,
+ // )
} else {
bouncerRepository.alternateBouncerUIAvailable
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
index 12df96e..5b1082a 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingCollectorImpl.java
@@ -380,7 +380,7 @@
static void logDebug(String msg) {
if (DEBUG) {
- logDebug(msg);
+ Log.d(TAG, msg);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
index 63b4288..e0ce3db 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardListener.java
@@ -27,7 +27,7 @@
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
-import android.os.SystemProperties;
+import android.os.Build;
import android.provider.Settings;
import android.util.Log;
@@ -87,7 +87,7 @@
String clipSource = mClipboardManager.getPrimaryClipSource();
ClipData clipData = mClipboardManager.getPrimaryClip();
- if (shouldSuppressOverlay(clipData, clipSource, isEmulator())) {
+ if (shouldSuppressOverlay(clipData, clipSource, Build.IS_EMULATOR)) {
Log.i(TAG, "Clipboard overlay suppressed.");
return;
}
@@ -141,10 +141,6 @@
return true;
}
- private static boolean isEmulator() {
- return SystemProperties.getBoolean("ro.boot.qemu", false);
- }
-
private boolean isUserSetupComplete() {
return Settings.Secure.getInt(mContext.getContentResolver(),
SETTINGS_SECURE_USER_SETUP_COMPLETE, 0) == 1;
diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
index 70736ae..bfc80a7 100644
--- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardOverlayController.java
@@ -61,12 +61,12 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEventLogger;
-import com.android.systemui.res.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule.OverlayWindowContext;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.flags.FeatureFlags;
+import com.android.systemui.res.R;
import com.android.systemui.screenshot.TimeoutHandler;
import java.util.Optional;
@@ -297,6 +297,7 @@
mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_MINIMIZED);
mIsMinimized = true;
mView.setMinimized(true);
+ animateIn();
} else {
mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_EXPANDED);
setExpandedView(this::animateIn);
@@ -318,8 +319,8 @@
} else {
mClipboardLogger.logUnguarded(CLIPBOARD_OVERLAY_SHOWN_EXPANDED);
setExpandedView();
- animateIn();
}
+ animateIn();
mView.announceForAccessibility(
getAccessibilityAnnouncement(mClipboardModel.getType()));
} else if (!mIsMinimized) {
diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt
new file mode 100644
index 0000000..3648f3b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractor.kt
@@ -0,0 +1,46 @@
+/*
+ * 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
+ */
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.common.ui.domain.interactor
+
+import com.android.systemui.common.ui.data.repository.ConfigurationRepository
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.mapLatest
+import kotlinx.coroutines.flow.onStart
+
+/** Business logic related to configuration changes. */
+@SysUISingleton
+class ConfigurationInteractor @Inject constructor(private val repository: ConfigurationRepository) {
+ /** Given [resourceId], emit the dimension pixel size on config change */
+ fun dimensionPixelSize(resourceId: Int): Flow<Int> {
+ return onAnyConfigurationChange.mapLatest { repository.getDimensionPixelSize(resourceId) }
+ }
+
+ /** Given a set of [resourceId]s, emit Map<ResourceId, DimensionPixelSize> on config change */
+ fun dimensionPixelSize(resourceIds: Set<Int>): Flow<Map<Int, Int>> {
+ return onAnyConfigurationChange.mapLatest {
+ resourceIds.associateWith { repository.getDimensionPixelSize(it) }
+ }
+ }
+
+ /** Emit an event on any config change */
+ val onAnyConfigurationChange: Flow<Unit> =
+ repository.onAnyConfigurationChange.onStart { emit(Unit) }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
index 70d7138..4e40042 100644
--- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogActivity.kt
@@ -16,31 +16,19 @@
package com.android.systemui.contrast
import android.app.Activity
-import android.app.UiModeManager
-import android.content.Context
import android.os.Bundle
-import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.util.settings.SecureSettings
-import java.util.concurrent.Executor
import javax.inject.Inject
-/** Trampoline activity responsible for creating a [ContrastDialog] */
+/** Trampoline activity responsible for creating a [ContrastDialogDelegate] */
class ContrastDialogActivity
@Inject
constructor(
- private val context: Context,
- @Main private val mainExecutor: Executor,
- private val uiModeManager: UiModeManager,
- private val userTracker: UserTracker,
- private val secureSettings: SecureSettings
+ private val contrastDialogDelegate : ContrastDialogDelegate
) : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- val contrastDialog =
- ContrastDialog(context, mainExecutor, uiModeManager, userTracker, secureSettings)
- contrastDialog.show()
+ contrastDialogDelegate.createDialog().show()
finish()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt
similarity index 67%
rename from packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
rename to packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt
index e9b5930..63b01ed 100644
--- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt
+++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialogDelegate.kt
@@ -21,54 +21,58 @@
import android.app.UiModeManager.ContrastUtils.CONTRAST_LEVEL_STANDARD
import android.app.UiModeManager.ContrastUtils.fromContrastLevel
import android.app.UiModeManager.ContrastUtils.toContrastLevel
-import android.content.Context
import android.os.Bundle
import android.provider.Settings
-import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import com.android.internal.annotations.VisibleForTesting
-import com.android.systemui.res.R
import com.android.systemui.dagger.qualifiers.Main
+import com.android.systemui.res.R
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.settings.SecureSettings
import java.util.concurrent.Executor
+import javax.inject.Inject
/** Dialog to select contrast options */
-class ContrastDialog(
- context: Context?,
+class ContrastDialogDelegate @Inject constructor(
+ private val sysuiDialogFactory : SystemUIDialog.Factory,
@Main private val mainExecutor: Executor,
private val uiModeManager: UiModeManager,
private val userTracker: UserTracker,
private val secureSettings: SecureSettings,
-) : SystemUIDialog(context), UiModeManager.ContrastChangeListener {
+) : SystemUIDialog.Delegate, UiModeManager.ContrastChangeListener {
+
+ override fun createDialog(): SystemUIDialog {
+ return sysuiDialogFactory.create(this)
+ }
@VisibleForTesting lateinit var contrastButtons: Map<Int, FrameLayout>
lateinit var dialogView: View
@VisibleForTesting var initialContrast: Float = fromContrastLevel(CONTRAST_LEVEL_STANDARD)
- public override fun onCreate(savedInstanceState: Bundle?) {
- dialogView = LayoutInflater.from(context).inflate(R.layout.contrast_dialog, null)
- setView(dialogView)
+ override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
+ dialogView = dialog.layoutInflater.inflate(R.layout.contrast_dialog, null)
+ with(dialog) {
+ setView(dialogView)
- setTitle(R.string.quick_settings_contrast_label)
- setNeutralButton(R.string.cancel) { _, _ ->
- secureSettings.putFloatForUser(
- Settings.Secure.CONTRAST_LEVEL,
- initialContrast,
- userTracker.userId
- )
- dismiss()
+ setTitle(R.string.quick_settings_contrast_label)
+ setNeutralButton(R.string.cancel) { _, _ ->
+ secureSettings.putFloatForUser(
+ Settings.Secure.CONTRAST_LEVEL,
+ initialContrast,
+ userTracker.userId
+ )
+ dialog.dismiss()
+ }
+ setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dialog.dismiss() }
}
- setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dismiss() }
- super.onCreate(savedInstanceState)
-
contrastButtons =
mapOf(
- CONTRAST_LEVEL_STANDARD to requireViewById(R.id.contrast_button_standard),
- CONTRAST_LEVEL_MEDIUM to requireViewById(R.id.contrast_button_medium),
- CONTRAST_LEVEL_HIGH to requireViewById(R.id.contrast_button_high)
+ CONTRAST_LEVEL_STANDARD to dialogView.requireViewById(
+ R.id.contrast_button_standard),
+ CONTRAST_LEVEL_MEDIUM to dialogView.requireViewById(R.id.contrast_button_medium),
+ CONTRAST_LEVEL_HIGH to dialogView.requireViewById(R.id.contrast_button_high)
)
contrastButtons.forEach { (contrastLevel, contrastButton) ->
@@ -86,11 +90,11 @@
highlightContrast(toContrastLevel(initialContrast))
}
- override fun start() {
+ override fun onStart(dialog: SystemUIDialog) {
uiModeManager.addContrastChangeListener(mainExecutor, this)
}
- override fun stop() {
+ override fun onStop(dialog: SystemUIDialog) {
uiModeManager.removeContrastChangeListener(this)
}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
index e7b8773..9672fac 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java
@@ -36,8 +36,6 @@
import com.android.systemui.unfold.FoldStateLoggingProvider;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
-import com.android.systemui.unfold.dagger.UnfoldBg;
-import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder;
import com.android.wm.shell.back.BackAnimation;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.desktopmode.DesktopMode;
@@ -139,26 +137,19 @@
c.getUnfoldHapticsPlayer();
c.getNaturalRotationUnfoldProgressProvider().init();
c.getUnfoldLatencyTracker().init();
+ c.getFoldStateLoggingProvider()
+ .ifPresent(FoldStateLoggingProvider::init);
+ c.getFoldStateLogger().ifPresent(FoldStateLogger::init);
+ final UnfoldTransitionProgressProvider progressProvider =
+ Flags.unfoldAnimationBackgroundProgress()
+ ? c.getBgUnfoldTransitionProgressProvider()
+ : c.getUnfoldTransitionProgressProvider();
+ progressProvider.addCallback(c.getUnfoldTransitionProgressForwarder());
});
// No init method needed, just needs to be gotten so that it's created.
getMediaMuteAwaitConnectionCli();
getNearbyMediaDevicesManager();
getConnectingDisplayViewModel().init();
- getFoldStateLoggingProvider().ifPresent(FoldStateLoggingProvider::init);
- getFoldStateLogger().ifPresent(FoldStateLogger::init);
-
- Optional<UnfoldTransitionProgressProvider> unfoldTransitionProgressProvider;
-
- if (Flags.unfoldAnimationBackgroundProgress()) {
- unfoldTransitionProgressProvider = getBgUnfoldTransitionProgressProvider();
- } else {
- unfoldTransitionProgressProvider = getUnfoldTransitionProgressProvider();
- }
- unfoldTransitionProgressProvider
- .ifPresent(
- (progressProvider) ->
- getUnfoldTransitionProgressForwarder()
- .ifPresent(progressProvider::addCallback));
}
/**
@@ -180,37 +171,6 @@
ContextComponentHelper getContextComponentHelper();
/**
- * Creates a UnfoldTransitionProgressProvider that calculates progress in the background.
- */
- @SysUISingleton
- @UnfoldBg
- Optional<UnfoldTransitionProgressProvider> getBgUnfoldTransitionProgressProvider();
-
- /**
- * Creates a UnfoldTransitionProgressProvider that calculates progress in the main thread.
- */
- @SysUISingleton
- Optional<UnfoldTransitionProgressProvider> getUnfoldTransitionProgressProvider();
-
- /**
- * Creates a UnfoldTransitionProgressForwarder.
- */
- @SysUISingleton
- Optional<UnfoldTransitionProgressForwarder> getUnfoldTransitionProgressForwarder();
-
- /**
- * Creates a FoldStateLoggingProvider.
- */
- @SysUISingleton
- Optional<FoldStateLoggingProvider> getFoldStateLoggingProvider();
-
- /**
- * Creates a FoldStateLogger.
- */
- @SysUISingleton
- Optional<FoldStateLogger> getFoldStateLogger();
-
- /**
* Main dependency providing module.
*/
@SysUISingleton
diff --git a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
index 4bfc9484..615b503 100644
--- a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
+++ b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt
@@ -34,7 +34,6 @@
import com.android.systemui.biometrics.AuthController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
-import com.android.systemui.flags.FeatureFlags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import java.util.concurrent.Executor
@@ -48,7 +47,6 @@
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
@Main private val mainExecutor: Executor,
private val logger: ScreenDecorationsLogger,
- private val featureFlags: FeatureFlags,
) : DecorProviderFactory() {
private val display = context.display
private val displayInfo = DisplayInfo()
@@ -88,7 +86,6 @@
keyguardUpdateMonitor,
mainExecutor,
logger,
- featureFlags,
)
)
}
@@ -113,7 +110,6 @@
private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
private val mainExecutor: Executor,
private val logger: ScreenDecorationsLogger,
- private val featureFlags: FeatureFlags,
) : BoundDecorProvider() {
override val viewId: Int = com.android.systemui.res.R.id.face_scanning_anim
@@ -148,7 +144,6 @@
mainExecutor,
logger,
authController,
- featureFlags
)
view.id = viewId
view.setColor(tintColor)
diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
index c3aaef7..cd764c0 100644
--- a/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/deviceentry/DeviceEntryModule.kt
@@ -2,7 +2,9 @@
import com.android.systemui.deviceentry.data.repository.DeviceEntryHapticsRepositoryModule
import com.android.systemui.deviceentry.data.repository.DeviceEntryRepositoryModule
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import dagger.Module
+import dagger.multibindings.Multibinds
@Module(
includes =
@@ -11,4 +13,9 @@
DeviceEntryHapticsRepositoryModule::class,
],
)
-object DeviceEntryModule
+abstract class DeviceEntryModule {
+ /**
+ * A set of DeviceEntryIconTransitions. Ensures that this can be injected even if it's empty.
+ */
+ @Multibinds abstract fun deviceEntryIconTransitionSet(): Set<DeviceEntryIconTransition>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
index 0c24752..7cb2c6e 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
+++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt
@@ -240,11 +240,6 @@
@JvmField
val WALLPAPER_PICKER_PREVIEW_ANIMATION = releasedFlag("wallpaper_picker_preview_animation")
- /** Flag to enable rest to unlock feature. */
- // TODO(b/303672286): Tracking bug
- @JvmField
- val REST_TO_UNLOCK: UnreleasedFlag = unreleasedFlag("rest_to_unlock")
-
/**
* TODO(b/278086361): Tracking bug
* Complete rewrite of the interactions between System UI and Window Manager involving keyguard
@@ -258,12 +253,6 @@
val KEYGUARD_WM_STATE_REFACTOR: UnreleasedFlag =
unreleasedFlag("keyguard_wm_state_refactor")
- /** Flag to disable the face scanning animation pulsing. */
- // TODO(b/295245791): Tracking bug.
- @JvmField val STOP_PULSING_FACE_SCANNING_ANIMATION = resourceBooleanFlag(
- R.bool.flag_stop_pulsing_face_scanning_animation,
- "stop_pulsing_face_scanning_animation")
-
// 300 - power menu
// TODO(b/254512600): Tracking Bug
@JvmField val POWER_MENU_LITE = releasedFlag("power_menu_lite")
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
index c8c06ae..01ba0d2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt
@@ -41,6 +41,7 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
+import com.android.systemui.Flags.fastUnlockTransition
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.shared.recents.utilities.Utilities
import com.android.systemui.shared.system.ActivityManagerWrapper
@@ -98,7 +99,8 @@
* from a tap on the unlock icon, or from the bouncer. This is not relevant if the lockscreen is
* swiped away via a touch gesture, or when it's flinging expanded/collapsed after a swipe.
*/
-const val UNLOCK_ANIMATION_DURATION_MS = 200L
+const val LEGACY_UNLOCK_ANIMATION_DURATION_MS = 200L
+const val UNLOCK_ANIMATION_DURATION_MS = 167L
/**
* How long the in-window launcher icon animation takes. This is used if the launcher is underneath
@@ -112,19 +114,22 @@
/**
* How long to wait for the shade to get out of the way before starting the canned unlock animation.
*/
-const val CANNED_UNLOCK_START_DELAY = 100L
+const val LEGACY_CANNED_UNLOCK_START_DELAY = 100L
+const val CANNED_UNLOCK_START_DELAY = 67L
/**
* Duration for the alpha animation on the surface behind. This plays to fade in the surface during
* a swipe to unlock (and to fade it back out if the swipe is cancelled).
*/
-const val SURFACE_BEHIND_SWIPE_FADE_DURATION_MS = 175L
+const val LEGACY_SURFACE_BEHIND_SWIPE_FADE_DURATION_MS = 175L
+const val SURFACE_BEHIND_FADE_OUT_DURATION_MS = 83L
/**
* Start delay for the surface behind animation, used so that the lockscreen can get out of the way
* before the surface begins appearing.
*/
-const val UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L
+const val LEGACY_UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS = 75L
+const val SURFACE_BEHIND_FADE_OUT_START_DELAY_MS = 0L
/**
* Initiates, controls, and ends the keyguard unlock animation.
@@ -327,7 +332,7 @@
init {
with(surfaceBehindAlphaAnimator) {
- duration = SURFACE_BEHIND_SWIPE_FADE_DURATION_MS
+ duration = surfaceBehindFadeOutDurationMs()
interpolator = Interpolators.LINEAR
addUpdateListener { valueAnimator: ValueAnimator ->
surfaceBehindAlpha = valueAnimator.animatedValue as Float
@@ -355,8 +360,10 @@
}
with(wallpaperCannedUnlockAnimator) {
- duration = LAUNCHER_ICONS_ANIMATION_DURATION_MS
- interpolator = Interpolators.ALPHA_OUT
+ duration = if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LAUNCHER_ICONS_ANIMATION_DURATION_MS
+ interpolator = if (fastUnlockTransition()) Interpolators.LINEAR
+ else Interpolators.ALPHA_OUT
addUpdateListener { valueAnimator: ValueAnimator ->
setWallpaperAppearAmount(valueAnimator.animatedValue as Float)
}
@@ -370,8 +377,8 @@
}
with(surfaceBehindEntryAnimator) {
- duration = UNLOCK_ANIMATION_DURATION_MS
- startDelay = UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS
+ duration = unlockAnimationDurationMs()
+ startDelay = surfaceBehindFadeOutStartDelayMs()
interpolator = Interpolators.TOUCH_RESPONSE
addUpdateListener { valueAnimator: ValueAnimator ->
surfaceBehindAlpha = valueAnimator.animatedValue as Float
@@ -573,7 +580,7 @@
try {
launcherUnlockController?.playUnlockAnimation(
true,
- UNLOCK_ANIMATION_DURATION_MS + CANNED_UNLOCK_START_DELAY,
+ unlockAnimationDurationMs() + cannedUnlockStartDelayMs(),
0 /* startDelay */)
} catch (e: DeadObjectException) {
// Hello! If you are here investigating a bug where Launcher is blank (no icons)
@@ -602,12 +609,15 @@
// Notify if waking from AOD only
val isWakeAndUnlockNotFromDream = biometricUnlockControllerLazy.get().isWakeAndUnlock &&
biometricUnlockControllerLazy.get().mode != MODE_WAKE_AND_UNLOCK_FROM_DREAM
+
+ val duration = if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LAUNCHER_ICONS_ANIMATION_DURATION_MS
listeners.forEach {
it.onUnlockAnimationStarted(
playingCannedUnlockAnimation /* playingCannedAnimation */,
isWakeAndUnlockNotFromDream /* isWakeAndUnlockNotFromDream */,
- CANNED_UNLOCK_START_DELAY /* unlockStartDelay */,
- LAUNCHER_ICONS_ANIMATION_DURATION_MS /* unlockAnimationDuration */) }
+ cannedUnlockStartDelayMs() /* unlockStartDelay */,
+ duration /* unlockAnimationDuration */) }
// Finish the keyguard remote animation if the dismiss amount has crossed the threshold.
// Check it here in case there is no more change to the dismiss amount after the last change
@@ -675,7 +685,7 @@
launcherUnlockController?.playUnlockAnimation(
true /* unlocked */,
LAUNCHER_ICONS_ANIMATION_DURATION_MS /* duration */,
- CANNED_UNLOCK_START_DELAY /* startDelay */)
+ cannedUnlockStartDelayMs() /* startDelay */)
} catch (e: DeadObjectException) {
// Hello! If you are here investigating a bug where Launcher is blank (no icons)
// then the below assumption about Launcher's destruction was incorrect. This
@@ -696,9 +706,10 @@
lockscreenSmartspace?.visibility = View.INVISIBLE
}
- // As soon as the shade has animated out of the way, start the canned unlock animation,
+ // As soon as the shade starts animating out of the way, start the canned unlock animation,
// which will finish keyguard exit when it completes. The in-window animations in the
// Launcher window will end on their own.
+ if (fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
handler.postDelayed({
if (keyguardViewMediator.get().isShowingAndNotOccluded &&
!keyguardStateController.isKeyguardGoingAway) {
@@ -709,12 +720,12 @@
if ((wallpaperTargets?.isNotEmpty() == true)) {
fadeInWallpaper()
- hideKeyguardViewAfterRemoteAnimation()
+ if (!fastUnlockTransition()) hideKeyguardViewAfterRemoteAnimation()
} else {
keyguardViewMediator.get().exitKeyguardAndFinishSurfaceBehindRemoteAnimation(
false /* cancelled */)
}
- }, CANNED_UNLOCK_START_DELAY)
+ }, cannedUnlockStartDelayMs())
}
/**
@@ -1130,6 +1141,43 @@
?: false
}
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun cannedUnlockStartDelayMs(): Long {
+ return if (fastUnlockTransition()) CANNED_UNLOCK_START_DELAY
+ else LEGACY_CANNED_UNLOCK_START_DELAY
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun unlockAnimationDurationMs(): Long {
+ return if (fastUnlockTransition()) UNLOCK_ANIMATION_DURATION_MS
+ else LEGACY_UNLOCK_ANIMATION_DURATION_MS
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun surfaceBehindFadeOutDurationMs(): Long {
+ return if (fastUnlockTransition()) SURFACE_BEHIND_FADE_OUT_DURATION_MS
+ else LEGACY_SURFACE_BEHIND_SWIPE_FADE_DURATION_MS
+ }
+
+ /**
+ * Temporary method for b/298186160
+ * TODO (b/298186160) replace references with the constant itself when flag is removed
+ */
+ private fun surfaceBehindFadeOutStartDelayMs(): Long {
+ return if (fastUnlockTransition()) SURFACE_BEHIND_FADE_OUT_START_DELAY_MS
+ else LEGACY_UNLOCK_ANIMATION_SURFACE_BEHIND_START_DELAY_MS
+ }
+
+
companion object {
fun isFoldable(context: Context): Boolean {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
index b870f58..4f5a6fe 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/Lifecycle.java
@@ -18,6 +18,10 @@
import androidx.annotation.NonNull;
+import com.android.app.tracing.TraceUtils;
+
+import kotlin.Unit;
+
import java.util.ArrayList;
import java.util.Objects;
import java.util.function.BiConsumer;
@@ -28,7 +32,7 @@
*/
public class Lifecycle<T> {
- private ArrayList<T> mObservers = new ArrayList<>();
+ private final ArrayList<T> mObservers = new ArrayList<>();
public void addObserver(@NonNull T observer) {
mObservers.add(Objects.requireNonNull(observer));
@@ -40,7 +44,11 @@
public void dispatch(Consumer<T> consumer) {
for (int i = 0; i < mObservers.size(); i++) {
- consumer.accept(mObservers.get(i));
+ final T observer = mObservers.get(i);
+ TraceUtils.trace(() -> "dispatch#" + consumer.toString(), () -> {
+ consumer.accept(observer);
+ return Unit.INSTANCE;
+ });
}
}
@@ -49,7 +57,11 @@
*/
public <U> void dispatch(BiConsumer<T, U> biConsumer, U arg) {
for (int i = 0; i < mObservers.size(); i++) {
- biConsumer.accept(mObservers.get(i), arg);
+ final T observer = mObservers.get(i);
+ TraceUtils.trace(() -> "dispatch#" + biConsumer.toString(), () -> {
+ biConsumer.accept(observer, arg);
+ return Unit.INSTANCE;
+ });
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
index 36412e3..e47c448 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt
@@ -187,8 +187,7 @@
faceManager?.sensorPropertiesInternal?.firstOrNull()?.supportsFaceDetection ?: false
private val _isAuthRunning = MutableStateFlow(false)
- override val isAuthRunning: StateFlow<Boolean>
- get() = _isAuthRunning
+ override val isAuthRunning: StateFlow<Boolean> = _isAuthRunning
private val keyguardSessionId: InstanceId?
get() = sessionTracker.getSessionId(StatusBarManager.SESSION_KEYGUARD)
@@ -254,6 +253,13 @@
)
.andAllFlows("canFaceAuthRun", faceAuthLog)
.flowOn(backgroundDispatcher)
+ .onEach {
+ faceAuthLogger.canFaceAuthRunChanged(it)
+ if (!it) {
+ // Cancel currently running auth if any of the gating checks are false.
+ cancel()
+ }
+ }
.stateIn(applicationScope, SharingStarted.Eagerly, false)
// Face detection can run only when lockscreen bypass is enabled
@@ -281,9 +287,12 @@
)
.andAllFlows("canFaceDetectRun", faceDetectLog)
.flowOn(backgroundDispatcher)
+ .onEach {
+ if (!it) {
+ cancelDetection()
+ }
+ }
.stateIn(applicationScope, SharingStarted.Eagerly, false)
- observeFaceAuthGatingChecks()
- observeFaceDetectGatingChecks()
observeFaceAuthResettingConditions()
listenForSchedulingWatchdog()
processPendingAuthRequests()
@@ -317,6 +326,7 @@
it.selectionStatus == SelectionStatus.SELECTION_IN_PROGRESS
},
)
+ .flowOn(backgroundDispatcher)
.onEach { anyOfThemIsTrue ->
if (anyOfThemIsTrue) {
clearPendingAuthRequest("Resetting auth status")
@@ -337,17 +347,6 @@
pendingAuthenticateRequest.value = null
}
- private fun observeFaceDetectGatingChecks() {
- canRunDetection
- .onEach {
- if (!it) {
- cancelDetection()
- }
- }
- .flowOn(mainDispatcher)
- .launchIn(applicationScope)
- }
-
private fun isUdfps() =
deviceEntryFingerprintAuthRepository.availableFpSensorType.map {
it == BiometricType.UNDER_DISPLAY_FINGERPRINT
@@ -406,20 +405,6 @@
)
}
- private fun observeFaceAuthGatingChecks() {
- canRunFaceAuth
- .onEach {
- faceAuthLogger.canFaceAuthRunChanged(it)
- if (!it) {
- // Cancel currently running auth if any of the gating checks are false.
- faceAuthLogger.cancellingFaceAuth()
- cancel()
- }
- }
- .flowOn(mainDispatcher)
- .launchIn(applicationScope)
- }
-
private val faceAuthCallback =
object : FaceManager.AuthenticationCallback() {
override fun onAuthenticationFailed() {
@@ -554,7 +539,7 @@
authenticate(it.uiEvent, it.fallbackToDetection)
}
}
- .flowOn(mainDispatcher)
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
}
@@ -650,6 +635,7 @@
override fun cancel() {
if (authCancellationSignal == null) return
+ faceAuthLogger.cancellingFaceAuth()
authCancellationSignal?.cancel()
cancelNotReceivedHandlerJob?.cancel()
cancelNotReceivedHandlerJob =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
index d1c6218..8d5e6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt
@@ -19,34 +19,71 @@
import android.os.UserHandle
import android.provider.Settings
import androidx.annotation.VisibleForTesting
-import com.android.keyguard.KeyguardClockSwitch.SMALL
+import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.ClockId
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SettingsProxyExt.observerFlow
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.onStart
+import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.withContext
+interface KeyguardClockRepository {
+ /** clock size determined by notificationPanelViewController, LARGE or SMALL */
+ val clockSize: StateFlow<Int>
+
+ /** clock size selected in picker, DYNAMIC or SMALL */
+ val selectedClockSize: Flow<SettingsClockSize>
+
+ /** clock id, selected from clock carousel in wallpaper picker */
+ val currentClockId: Flow<ClockId>
+
+ val currentClock: StateFlow<ClockController?>
+
+ val clockEventController: ClockEventController
+ fun setClockSize(@ClockSize size: Int)
+}
+
@SysUISingleton
-class KeyguardClockRepository
+class KeyguardClockRepositoryImpl
@Inject
constructor(
private val secureSettings: SecureSettings,
private val clockRegistry: ClockRegistry,
+ override val clockEventController: ClockEventController,
@Background private val backgroundDispatcher: CoroutineDispatcher,
-) {
+ @Application private val applicationScope: CoroutineScope,
+) : KeyguardClockRepository {
- val selectedClockSize: Flow<SettingsClockSize> =
+ /** Receive SMALL or LARGE clock should be displayed on keyguard. */
+ private val _clockSize: MutableStateFlow<Int> = MutableStateFlow(LARGE)
+ override val clockSize: StateFlow<Int> = _clockSize.asStateFlow()
+
+ override fun setClockSize(size: Int) {
+ _clockSize.value = size
+ }
+
+ override val selectedClockSize: Flow<SettingsClockSize> =
secureSettings
.observerFlow(
names = arrayOf(Settings.Secure.LOCKSCREEN_USE_DOUBLE_LINE_CLOCK),
@@ -55,7 +92,7 @@
.onStart { emit(Unit) } // Forces an initial update.
.map { getClockSize() }
- val currentClockId: Flow<ClockId> =
+ override val currentClockId: Flow<ClockId> =
callbackFlow {
fun send() {
trySend(clockRegistry.currentClockId)
@@ -72,8 +109,16 @@
awaitClose { clockRegistry.unregisterClockChangeListener(listener) }
}
.mapNotNull { it }
+ .distinctUntilChanged()
- val currentClock = currentClockId.map { clockRegistry.createCurrentClock() }
+ override val currentClock: StateFlow<ClockController?> =
+ currentClockId
+ .map { clockRegistry.createCurrentClock() }
+ .stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = clockRegistry.createCurrentClock()
+ )
@VisibleForTesting
suspend fun getClockSize(): SettingsClockSize {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
index 6ff446e..2d6c0e1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt
@@ -18,8 +18,6 @@
import android.graphics.Point
import android.hardware.biometrics.BiometricSourceType
-import com.android.keyguard.KeyguardClockSwitch.ClockSize
-import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.biometrics.AuthController
@@ -39,7 +37,6 @@
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
import com.android.systemui.keyguard.shared.model.KeyguardDone
-import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -180,9 +177,6 @@
/** Whether quick settings or quick-quick settings is visible. */
val isQuickSettingsVisible: Flow<Boolean>
- /** Represents the current state of the KeyguardRootView visibility */
- val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState>
-
/** Receive an event for doze time tick */
val dozeTimeTick: Flow<Long>
@@ -192,9 +186,6 @@
/** Observable updated when keyguardDone should be called either now or soon. */
val keyguardDone: Flow<KeyguardDone>
- /** Receive SMALL or LARGE clock should be displayed on keyguard. */
- val clockSize: Flow<Int>
-
/** Receive whether clock should be centered on lockscreen. */
val clockShouldBeCentered: Flow<Boolean>
@@ -216,12 +207,6 @@
/** Sets the current amount of alpha that should be used for rendering the keyguard. */
fun setKeyguardAlpha(alpha: Float)
- fun setKeyguardVisibility(
- statusBarState: Int,
- goingToFullShade: Boolean,
- occlusionTransitionRunning: Boolean
- )
-
/**
* Sets the relative offset of the lock-screen clock from its natural position on the screen.
*/
@@ -247,8 +232,6 @@
suspend fun setKeyguardDone(keyguardDoneType: KeyguardDone)
- fun setClockSize(@ClockSize size: Int)
-
fun setClockShouldBeCentered(shouldBeCentered: Boolean)
}
@@ -293,9 +276,6 @@
private val _clockPosition = MutableStateFlow(Position(0, 0))
override val clockPosition = _clockPosition.asStateFlow()
- private val _clockSize = MutableStateFlow(LARGE)
- override val clockSize: Flow<Int> = _clockSize.asStateFlow()
-
private val _clockShouldBeCentered = MutableStateFlow(true)
override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered.asStateFlow()
@@ -631,17 +611,6 @@
private val _isActiveDreamLockscreenHosted = MutableStateFlow(false)
override val isActiveDreamLockscreenHosted = _isActiveDreamLockscreenHosted.asStateFlow()
- private val _keyguardRootViewVisibility =
- MutableStateFlow(
- KeyguardRootViewVisibilityState(
- com.android.systemui.statusbar.StatusBarState.SHADE,
- goingToFullShade = false,
- occlusionTransitionRunning = false,
- )
- )
- override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> =
- _keyguardRootViewVisibility.asStateFlow()
-
override fun setAnimateDozingTransitions(animate: Boolean) {
_animateBottomAreaDozingTransitions.value = animate
}
@@ -654,19 +623,6 @@
_keyguardAlpha.value = alpha
}
- override fun setKeyguardVisibility(
- statusBarState: Int,
- goingToFullShade: Boolean,
- occlusionTransitionRunning: Boolean
- ) {
- _keyguardRootViewVisibility.value =
- KeyguardRootViewVisibilityState(
- statusBarState,
- goingToFullShade,
- occlusionTransitionRunning
- )
- }
-
override fun setClockPosition(x: Int, y: Int) {
_clockPosition.value = Position(x, y)
}
@@ -681,10 +637,6 @@
_isActiveDreamLockscreenHosted.value = isLockscreenHosted
}
- override fun setClockSize(@ClockSize size: Int) {
- _clockSize.value = size
- }
-
override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
_clockShouldBeCentered.value = shouldBeCentered
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
index 5659623..6138330 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt
@@ -74,4 +74,6 @@
fun bind(impl: BouncerMessageAuditLogger): CoreStartable
@Binds fun trustRepository(impl: TrustRepositoryImpl): TrustRepository
+
+ @Binds fun keyguardClockRepository(impl: KeyguardClockRepositoryImpl): KeyguardClockRepository
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
index 5c76be8..0e487d2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepository.kt
@@ -103,7 +103,7 @@
private val _transitions =
MutableSharedFlow<TransitionStep>(
replay = 2,
- extraBufferCapacity = 10,
+ extraBufferCapacity = 20,
onBufferOverflow = BufferOverflow.DROP_OLDEST,
)
override val transitions = _transitions.asSharedFlow().distinctUntilChanged()
@@ -227,10 +227,7 @@
private fun emitTransition(nextStep: TransitionStep, isManual: Boolean = false) {
logAndTrace(nextStep, isManual)
- val emitted = _transitions.tryEmit(nextStep)
- if (!emitted) {
- Log.w(TAG, "Failed to emit next value without suspending")
- }
+ _transitions.tryEmit(nextStep)
lastStep = nextStep
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
index 2f103f6..3887e69 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt
@@ -18,6 +18,7 @@
package com.android.systemui.keyguard.domain.interactor
import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
import com.android.systemui.keyguard.shared.model.SettingsClockSize
@@ -25,6 +26,7 @@
import com.android.systemui.plugins.ClockId
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.StateFlow
private val TAG = KeyguardClockInteractor::class.simpleName
/** Manages keyguard clock for the lockscreen root view. */
@@ -33,7 +35,6 @@
class KeyguardClockInteractor
@Inject
constructor(
- val eventController: ClockEventController,
private val keyguardClockRepository: KeyguardClockRepository,
) {
@@ -41,11 +42,17 @@
val currentClockId: Flow<ClockId> = keyguardClockRepository.currentClockId
- val currentClock: Flow<ClockController> = keyguardClockRepository.currentClock
+ val currentClock: StateFlow<ClockController?> = keyguardClockRepository.currentClock
- var clock: ClockController?
- get() = eventController.clock
- set(value) {
- eventController.clock = value
+ var clock: ClockController? by keyguardClockRepository.clockEventController::clock
+
+ val clockSize: StateFlow<Int> = keyguardClockRepository.clockSize
+ fun setClockSize(@ClockSize size: Int) {
+ keyguardClockRepository.setClockSize(size)
+ }
+
+ val clockEventController: ClockEventController
+ get() {
+ return keyguardClockRepository.clockEventController
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
index e58d771..b8c3925 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt
@@ -23,13 +23,12 @@
import android.graphics.Point
import android.util.MathUtils
import com.android.app.animation.Interpolators
-import com.android.keyguard.KeyguardClockSwitch.ClockSize
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging
import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow
import com.android.systemui.common.shared.model.NotificationContainerBounds
import com.android.systemui.common.shared.model.Position
-import com.android.systemui.common.ui.data.repository.ConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
@@ -77,7 +76,7 @@
powerInteractor: PowerInteractor,
sceneContainerFlags: SceneContainerFlags,
bouncerRepository: KeyguardBouncerRepository,
- configurationRepository: ConfigurationRepository,
+ configurationInteractor: ConfigurationInteractor,
shadeRepository: ShadeRepository,
sceneInteractorProvider: Provider<SceneInteractor>,
) {
@@ -213,37 +212,29 @@
/** The approximate location on the screen of the face unlock sensor, if one is available. */
val faceSensorLocation: Flow<Point?> = repository.faceSensorLocation
- /** Notifies when a new configuration is set */
- val configurationChange: Flow<Unit> =
- configurationRepository.onAnyConfigurationChange.onStart { emit(Unit) }
-
/** The position of the keyguard clock. */
val clockPosition: Flow<Position> = repository.clockPosition
val keyguardAlpha: Flow<Float> = repository.keyguardAlpha
val keyguardTranslationY: Flow<Float> =
- configurationChange.flatMapLatest {
- val translationDistance =
- configurationRepository.getDimensionPixelSize(
- R.dimen.keyguard_translate_distance_on_swipe_up
- )
- shadeRepository.shadeModel.map {
- if (it.expansionAmount == 0f) {
- // Reset the translation value
- 0f
- } else {
- // On swipe up, translate the keyguard to reveal the bouncer
- MathUtils.lerp(
- translationDistance,
- 0,
- Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(it.expansionAmount)
- )
+ configurationInteractor
+ .dimensionPixelSize(R.dimen.keyguard_translate_distance_on_swipe_up)
+ .flatMapLatest { translationDistance ->
+ shadeRepository.shadeModel.map {
+ if (it.expansionAmount == 0f) {
+ // Reset the translation value
+ 0f
+ } else {
+ // On swipe up, translate the keyguard to reveal the bouncer
+ MathUtils.lerp(
+ translationDistance,
+ 0,
+ Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(it.expansionAmount)
+ )
+ }
}
}
- }
-
- val clockSize: Flow<Int> = repository.clockSize.distinctUntilChanged()
val clockShouldBeCentered: Flow<Boolean> = repository.clockShouldBeCentered
@@ -297,18 +288,6 @@
repository.setQuickSettingsVisible(isVisible)
}
- fun setKeyguardRootVisibility(
- statusBarState: Int,
- goingToFullShade: Boolean,
- isOcclusionTransitionRunning: Boolean
- ) {
- repository.setKeyguardVisibility(
- statusBarState,
- goingToFullShade,
- isOcclusionTransitionRunning
- )
- }
-
fun setClockPosition(x: Int, y: Int) {
repository.setClockPosition(x, y)
}
@@ -321,10 +300,6 @@
repository.setAnimateDozingTransitions(animate)
}
- fun setClockSize(@ClockSize size: Int) {
- repository.setClockSize(size)
- }
-
fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
repository.setClockShouldBeCentered(shouldBeCentered)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
index ae356cd..532df4a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt
@@ -29,6 +29,7 @@
import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository
@@ -69,6 +70,7 @@
private val context: Context,
@Application private val applicationScope: CoroutineScope,
@Main private val mainDispatcher: CoroutineDispatcher,
+ @Background private val backgroundDispatcher: CoroutineDispatcher,
private val repository: DeviceEntryFaceAuthRepository,
private val primaryBouncerInteractor: Lazy<PrimaryBouncerInteractor>,
private val alternateBouncerInteractor: AlternateBouncerInteractor,
@@ -104,6 +106,7 @@
fallbackToDetect = false
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
alternateBouncerInteractor.isVisible
@@ -115,6 +118,7 @@
fallbackToDetect = false
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
merge(
@@ -143,6 +147,7 @@
fallbackToDetect = true
)
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
deviceEntryFingerprintAuthRepository.isLockedOut
@@ -155,6 +160,7 @@
}
}
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
// User switching should stop face auth and then when it is complete we should trigger face
@@ -178,6 +184,7 @@
)
}
}
+ .flowOn(backgroundDispatcher)
.launchIn(applicationScope)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt
deleted file mode 100644
index 9a57aef..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardRootViewVisibilityState.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package com.android.systemui.keyguard.shared.model
-
-/**
- * Provides a stateful representation of the visibility of the KeyguardRootView
- *
- * @param statusBarState State of the status bar represented by [StatusBarState]
- * @param goingToFullShade Whether status bar is going to full shade
- * @param occlusionTransitionRunning Whether the occlusion transition is running in this instant
- */
-data class KeyguardRootViewVisibilityState(
- val statusBarState: Int,
- val goingToFullShade: Boolean,
- val occlusionTransitionRunning: Boolean,
-)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
index d5ad7ab..64ff3b0c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
@@ -17,97 +17,134 @@
import android.view.animation.Interpolator
import com.android.app.animation.Interpolators.LINEAR
+import com.android.keyguard.logging.KeyguardTransitionAnimationLogger
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.shared.model.TransitionState.CANCELED
import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
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 javax.inject.Inject
import kotlin.math.max
import kotlin.math.min
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.shareIn
/**
- * For the given transition params, construct a flow using [createFlow] for the specified portion of
- * the overall transition.
+ * Assists in creating sub-flows for a KeyguardTransition. Call [setup] once for a transition, and
+ * then [sharedFlow] for each sub animation that should be trigged when the overall transition runs.
*/
-class KeyguardTransitionAnimationFlow(
- private val transitionDuration: Duration,
- private val transitionFlow: Flow<TransitionStep>,
+@SysUISingleton
+class KeyguardTransitionAnimationFlow
+@Inject
+constructor(
+ @Application private val scope: CoroutineScope,
+ private val logger: KeyguardTransitionAnimationLogger,
) {
+
/**
- * Transitions will occur over a [transitionDuration] with [TransitionStep]s being emitted in
- * the range of [0, 1]. View animations should begin and end within a subset of this range. This
- * function maps the [startTime] and [duration] into [0, 1], when this subset is valid.
+ * Invoke once per transition between FROM->TO states to get access to
+ * [SharedFlowBuilder#sharedFlow].
*/
- fun createFlow(
+ fun setup(
duration: Duration,
- onStep: (Float) -> Float,
- startTime: Duration = 0.milliseconds,
- onStart: (() -> Unit)? = null,
- onCancel: (() -> Float)? = null,
- onFinish: (() -> Float)? = null,
- interpolator: Interpolator = LINEAR,
- ): Flow<Float> {
- if (!duration.isPositive()) {
- throw IllegalArgumentException("duration must be a positive number: $duration")
- }
- if ((startTime + duration).compareTo(transitionDuration) > 0) {
- throw IllegalArgumentException(
- "startTime($startTime) + duration($duration) must be" +
- " <= transitionDuration($transitionDuration)"
- )
- }
+ stepFlow: Flow<TransitionStep>,
+ ) = SharedFlowBuilder(duration, stepFlow)
- val start = (startTime / transitionDuration).toFloat()
- val chunks = (transitionDuration / duration).toFloat()
- var isComplete = true
-
- fun stepToValue(step: TransitionStep): Float? {
- val value = (step.value - start) * chunks
- return when (step.transitionState) {
- // When starting, make sure to always emit. If a transition is started from the
- // middle, it is possible this animation is being skipped but we need to inform
- // the ViewModels of the last update
- STARTED -> {
- isComplete = false
- onStart?.invoke()
- max(0f, min(1f, value))
- }
- // Always send a final value of 1. Because of rounding, [value] may never be
- // exactly 1.
- RUNNING ->
- if (isComplete) {
- null
- } else if (value >= 1f) {
- isComplete = true
- 1f
- } else if (value >= 0f) {
- value
- } else {
- null
- }
- else -> null
- }?.let { onStep(interpolator.getInterpolation(it)) }
- }
-
- return transitionFlow
- .map { step ->
- when (step.transitionState) {
- STARTED -> stepToValue(step)
- RUNNING -> stepToValue(step)
- CANCELED -> onCancel?.invoke()
- FINISHED -> onFinish?.invoke()
- }
+ inner class SharedFlowBuilder(
+ private val transitionDuration: Duration,
+ private val stepFlow: Flow<TransitionStep>,
+ ) {
+ /**
+ * Transitions will occur over a [transitionDuration] with [TransitionStep]s being emitted
+ * in the range of [0, 1]. View animations should begin and end within a subset of this
+ * range. This function maps the [startTime] and [duration] into [0, 1], when this subset is
+ * valid.
+ *
+ * Will produce a [SharedFlow], so that identical animations can use the same value.
+ */
+ fun sharedFlow(
+ duration: Duration,
+ onStep: (Float) -> Float,
+ startTime: Duration = 0.milliseconds,
+ onStart: (() -> Unit)? = null,
+ onCancel: (() -> Float)? = null,
+ onFinish: (() -> Float)? = null,
+ interpolator: Interpolator = LINEAR,
+ name: String? = null
+ ): SharedFlow<Float> {
+ if (!duration.isPositive()) {
+ throw IllegalArgumentException("duration must be a positive number: $duration")
}
- .filterNotNull()
- }
+ if ((startTime + duration).compareTo(transitionDuration) > 0) {
+ throw IllegalArgumentException(
+ "startTime($startTime) + duration($duration) must be" +
+ " <= transitionDuration($transitionDuration)"
+ )
+ }
- /** Immediately (after 1ms) emits the given value for every step of the KeyguardTransition. */
- fun immediatelyTransitionTo(value: Float): Flow<Float> {
- return createFlow(duration = 1.milliseconds, onStep = { value }, onFinish = { value })
+ val start = (startTime / transitionDuration).toFloat()
+ val chunks = (transitionDuration / duration).toFloat()
+ logger.logCreate(name, start)
+ var isComplete = true
+
+ fun stepToValue(step: TransitionStep): Float? {
+ val value = (step.value - start) * chunks
+ return when (step.transitionState) {
+ // When starting, make sure to always emit. If a transition is started from the
+ // middle, it is possible this animation is being skipped but we need to inform
+ // the ViewModels of the last update
+ STARTED -> {
+ isComplete = false
+ onStart?.invoke()
+ max(0f, min(1f, value))
+ }
+ // Always send a final value of 1. Because of rounding, [value] may never be
+ // exactly 1.
+ RUNNING ->
+ if (isComplete) {
+ null
+ } else if (value >= 1f) {
+ isComplete = true
+ 1f
+ } else if (value >= 0f) {
+ value
+ } else {
+ null
+ }
+ else -> null
+ }?.let { onStep(interpolator.getInterpolation(it)) }
+ }
+
+ return stepFlow
+ .map { step ->
+ val value =
+ when (step.transitionState) {
+ STARTED -> stepToValue(step)
+ RUNNING -> stepToValue(step)
+ CANCELED -> onCancel?.invoke()
+ FINISHED -> onFinish?.invoke()
+ }
+ logger.logTransitionStep(name, step, value)
+ value
+ }
+ .filterNotNull()
+ .shareIn(scope, SharingStarted.WhileSubscribed())
+ }
+
+ /**
+ * Immediately (after 1ms) emits the given value for every step of the KeyguardTransition.
+ */
+ fun immediatelyTransitionTo(value: Float): Flow<Float> {
+ return sharedFlow(duration = 1.milliseconds, onStep = { value }, onFinish = { value })
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
index 594865d3..d1d323f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AlternateBouncerViewBinder.kt
@@ -49,7 +49,7 @@
swipeUpAnywhereGestureHandler: SwipeUpAnywhereGestureHandler,
tapGestureDetector: TapGestureDetector,
) {
- DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()
+ if (DeviceEntryUdfpsRefactor.isUnexpectedlyInLegacyMode()) return
scope.launch {
// forcePluginOpen is necessary to show over occluded apps.
// This cannot be tied to the view's lifecycle because setting this allows the view
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
index c688cfff..48f6092 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt
@@ -17,15 +17,16 @@
package com.android.systemui.keyguard.ui.binder
import android.transition.TransitionManager
+import androidx.annotation.VisibleForTesting
+import androidx.constraintlayout.helper.widget.Layer
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.plugins.ClockController
@@ -40,13 +41,12 @@
clockSection: ClockSection,
keyguardRootView: ConstraintLayout,
viewModel: KeyguardClockViewModel,
- keyguardBlueprintInteractor: KeyguardBlueprintInteractor,
keyguardClockInteractor: KeyguardClockInteractor,
featureFlags: FeatureFlagsClassic,
) {
keyguardRootView.repeatWhenAttached {
repeatOnLifecycle(Lifecycle.State.CREATED) {
- keyguardClockInteractor.eventController.registerListeners(keyguardRootView)
+ keyguardClockInteractor.clockEventController.registerListeners(keyguardRootView)
}
}
keyguardRootView.repeatWhenAttached {
@@ -54,10 +54,11 @@
launch {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
viewModel.currentClock.collect { currentClock ->
- viewModel.clock?.let { clock -> cleanupClockViews(clock, keyguardRootView) }
+ cleanupClockViews(viewModel.clock, keyguardRootView, viewModel.burnInLayer)
viewModel.clock = currentClock
- addClockViews(currentClock, keyguardRootView)
- keyguardBlueprintInteractor.refreshBlueprint()
+ addClockViews(currentClock, keyguardRootView, viewModel.burnInLayer)
+ viewModel.burnInLayer?.updatePostLayout(keyguardRootView)
+ applyConstraints(clockSection, keyguardRootView, true)
}
}
// TODO: Weather clock dozing animation
@@ -71,13 +72,61 @@
}
launch {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
- viewModel.clockShouldBeCentered.collect { shouldBeCentered ->
- clockSection.setClockShouldBeCentered(
- viewModel.useLargeClock && shouldBeCentered
- )
+ viewModel.clockShouldBeCentered.collect {
applyConstraints(clockSection, keyguardRootView, true)
}
}
+ launch {
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) return@launch
+ viewModel.hasCustomWeatherDataDisplay.collect {
+ applyConstraints(clockSection, keyguardRootView, true)
+ }
+ }
+ }
+ }
+ }
+
+ private fun cleanupClockViews(
+ clockController: ClockController?,
+ rootView: ConstraintLayout,
+ burnInLayer: Layer?
+ ) {
+ clockController?.let { clock ->
+ clock.smallClock.layout.views.forEach {
+ burnInLayer?.removeView(it)
+ rootView.removeView(it)
+ }
+ // add large clock to burn in layer only when it will have same transition with other
+ // components in AOD
+ // otherwise, it will have a separate scale transition while other components only have
+ // translate transition
+ if (clock.config.useAlternateSmartspaceAODTransition) {
+ clock.largeClock.layout.views.forEach { burnInLayer?.removeView(it) }
+ }
+ clock.largeClock.layout.views.forEach { rootView.removeView(it) }
+ }
+ }
+
+ @VisibleForTesting
+ fun addClockViews(
+ clockController: ClockController?,
+ rootView: ConstraintLayout,
+ burnInLayer: Layer?
+ ) {
+ clockController?.let { clock ->
+ clock.smallClock.layout.views[0].id = R.id.lockscreen_clock_view
+ if (clock.largeClock.layout.views.size == 1) {
+ clock.largeClock.layout.views[0].id = R.id.lockscreen_clock_view_large
+ }
+ // small clock should either be a single view or container with id
+ // `lockscreen_clock_view`
+ clock.smallClock.layout.views.forEach {
+ rootView.addView(it)
+ burnInLayer?.addView(it)
+ }
+ clock.largeClock.layout.views.forEach { rootView.addView(it) }
+ if (clock.config.useAlternateSmartspaceAODTransition) {
+ clock.largeClock.layout.views.forEach { burnInLayer?.addView(it) }
}
}
}
@@ -92,22 +141,6 @@
if (animated) {
TransitionManager.beginDelayedTransition(rootView)
}
-
constraintSet.applyTo(rootView)
}
-
- private fun cleanupClockViews(clock: ClockController, rootView: ConstraintLayout) {
- clock.smallClock.layout.views.forEach { rootView.removeView(it) }
- clock.largeClock.layout.views.forEach { rootView.removeView(it) }
- }
-
- private fun addClockViews(clock: ClockController, rootView: ConstraintLayout) {
- clock.smallClock.layout.views[0].id = R.id.lockscreen_clock_view
- if (clock.largeClock.layout.views.size == 1) {
- clock.largeClock.layout.views[0].id = R.id.lockscreen_clock_view_large
- }
- // small clock should either be a single view or container with id `lockscreen_clock_view`
- clock.smallClock.layout.views.forEach { rootView.addView(it) }
- clock.largeClock.layout.views.forEach { rootView.addView(it) }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
index 1a8f625..4efd9ef 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardIndicationAreaBinder.kt
@@ -23,10 +23,10 @@
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import com.android.systemui.Flags.keyguardBottomAreaRefactor
-import com.android.systemui.res.R
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.lifecycle.repeatWhenAttached
+import com.android.systemui.res.R
import com.android.systemui.statusbar.KeyguardIndicationController
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
index c0d3d33..0addbd8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt
@@ -41,6 +41,7 @@
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor
import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
@@ -88,7 +89,7 @@
vibratorHelper: VibratorHelper?,
): DisposableHandle {
var onLayoutChangeListener: OnLayoutChange? = null
- val childViews = mutableMapOf<Int, View?>()
+ val childViews = mutableMapOf<Int, View>()
val statusViewId = R.id.keyguard_status_view
val burnInLayerId = R.id.burn_in_layer
val aodNotificationIconContainerId = R.id.aod_notification_icon_container
@@ -113,7 +114,12 @@
}
if (keyguardBottomAreaRefactor()) {
- launch { viewModel.alpha.collect { alpha -> view.alpha = alpha } }
+ launch {
+ viewModel.alpha.collect { alpha ->
+ view.alpha = alpha
+ childViews[statusViewId]?.alpha = alpha
+ }
+ }
}
if (KeyguardShadeMigrationNssl.isEnabled) {
@@ -140,25 +146,35 @@
}
launch {
+ // When translation happens in burnInLayer, it won't be weather clock
+ // large clock isn't added to burnInLayer due to its scale transition
+ // so we also need to add translation to it here
+ // same as translationX
viewModel.translationY.collect { y ->
childViews[burnInLayerId]?.translationY = y
+ childViews[largeClockId]?.translationY = y
}
}
launch {
viewModel.translationX.collect { x ->
childViews[burnInLayerId]?.translationX = x
+ childViews[largeClockId]?.translationX = x
}
}
launch {
viewModel.scale.collect { (scale, scaleClockOnly) ->
if (scaleClockOnly) {
+ // For clocks except weather clock, we have scale transition
+ // besides translate
childViews[largeClockId]?.let {
it.scaleX = scale
it.scaleY = scale
}
} else {
+ // For weather clock, large clock should have only scale
+ // transition with other parts in burnInLayer
childViews[burnInLayerId]?.scaleX = scale
childViews[burnInLayerId]?.scaleY = scale
}
@@ -247,7 +263,10 @@
}
}
}
- viewModel.clockControllerProvider = clockControllerProvider
+
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ viewModel.clockControllerProvider = clockControllerProvider
+ }
onLayoutChangeListener = OnLayoutChange(viewModel)
view.addOnLayoutChangeListener(onLayoutChangeListener)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
index 41a2e50..954d2cf 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardSmartspaceViewBinder.kt
@@ -1,3 +1,19 @@
+/*
+ * 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.keyguard.ui.binder
import androidx.constraintlayout.widget.ConstraintLayout
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
index 0bee48a..560e4ad 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt
@@ -19,11 +19,10 @@
import android.animation.ValueAnimator
import android.graphics.Point
import com.android.systemui.CoreStartable
+import com.android.systemui.Flags
import com.android.systemui.biometrics.SideFpsController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.ui.view.SideFpsProgressBar
import com.android.systemui.keyguard.ui.viewmodel.SideFpsProgressBarViewModel
import com.android.systemui.log.SideFpsLogger
@@ -50,11 +49,10 @@
private val sfpsController: dagger.Lazy<SideFpsController>,
private val logger: SideFpsLogger,
private val commandRegistry: CommandRegistry,
- private val featureFlagsClassic: FeatureFlagsClassic,
) : CoreStartable {
override fun start() {
- if (!featureFlagsClassic.isEnabled(Flags.REST_TO_UNLOCK)) {
+ if (!Flags.restToUnlock()) {
return
}
// When the rest to unlock feature is disabled by the user, stop any coroutines that are
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
index 59c798b..fde5357 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt
@@ -27,6 +27,8 @@
import android.os.Bundle
import android.os.Handler
import android.os.IBinder
+import android.provider.Settings
+import android.util.Log
import android.view.ContextThemeWrapper
import android.view.Display
import android.view.Display.DEFAULT_DISPLAY
@@ -47,6 +49,7 @@
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.common.ui.ConfigurationState
import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
@@ -64,6 +67,7 @@
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessageViewModel
import com.android.systemui.monet.ColorScheme
+import com.android.systemui.monet.Style
import com.android.systemui.plugins.ClockController
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.res.R
@@ -79,13 +83,21 @@
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator
+import com.android.systemui.util.settings.SecureSettings
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withContext
+import org.json.JSONException
+import org.json.JSONObject
/** Renders the preview of the lock screen. */
class KeyguardPreviewRenderer
@@ -93,8 +105,10 @@
@AssistedInject
constructor(
@Application private val context: Context,
+ @Application applicationScope: CoroutineScope,
@Main private val mainDispatcher: CoroutineDispatcher,
@Main private val mainHandler: Handler,
+ @Background private val backgroundDispatcher: CoroutineDispatcher,
private val clockViewModel: KeyguardPreviewClockViewModel,
private val smartspaceViewModel: KeyguardPreviewSmartspaceViewModel,
private val bottomAreaViewModel: KeyguardBottomAreaViewModel,
@@ -118,8 +132,8 @@
private val chipbarCoordinator: ChipbarCoordinator,
private val screenOffAnimationController: ScreenOffAnimationController,
private val shadeInteractor: ShadeInteractor,
+ private val secureSettings: SecureSettings,
) {
-
val hostToken: IBinder? = bundle.getBinder(KEY_HOST_TOKEN)
private val width: Int = bundle.getInt(KEY_VIEW_WIDTH)
private val height: Int = bundle.getInt(KEY_VIEW_HEIGHT)
@@ -157,7 +171,13 @@
private val shortcutsBindings = mutableSetOf<KeyguardQuickAffordanceViewBinder.Binding>()
+ private val coroutineScope: CoroutineScope
+ private var themeStyle: Style? = null
+
init {
+ coroutineScope = CoroutineScope(applicationScope.coroutineContext + Job())
+ disposables.add(DisposableHandle { coroutineScope.cancel() })
+
if (keyguardBottomAreaRefactor()) {
quickAffordancesCombinedViewModel.enablePreviewMode(
initiallySelectedSlotId =
@@ -554,29 +574,54 @@
}
private fun onClockChanged() {
- val clock = clockRegistry.createCurrentClock()
- clockController.clock = clock
+ coroutineScope.launch {
+ val clock = clockRegistry.createCurrentClock()
+ clockController.clock = clock
- if (clockRegistry.seedColor == null) {
- // Seed color null means users do override any color on the clock. The default color
- // will need to use wallpaper's extracted color and consider if the wallpaper's color
- // is dark or a light.
- // TODO(b/277832214) we can potentially simplify this code by checking for
- // wallpaperColors being null in the if clause above and removing the many ?.
- val wallpaperColorScheme = wallpaperColors?.let { ColorScheme(it, darkTheme = false) }
- val lightClockColor = wallpaperColorScheme?.accent1?.s100
- val darkClockColor = wallpaperColorScheme?.accent2?.s600
+ val colors = wallpaperColors
+ if (clockRegistry.seedColor == null && colors != null) {
+ // Seed color null means users do not override any color on the clock. The default
+ // color will need to use wallpaper's extracted color and consider if the
+ // wallpaper's color is dark or light.
+ val style = themeStyle ?: fetchThemeStyleFromSetting().also { themeStyle = it }
+ val wallpaperColorScheme = ColorScheme(colors, darkTheme = false, style)
+ val lightClockColor = wallpaperColorScheme.accent1.s100
+ val darkClockColor = wallpaperColorScheme.accent2.s600
- // Note that when [wallpaperColors] is null, isWallpaperDark is true.
- val isWallpaperDark: Boolean =
- (wallpaperColors?.colorHints?.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) == 0
- clock.events.onSeedColorChanged(
- if (isWallpaperDark) lightClockColor else darkClockColor
- )
+ // Note that when [wallpaperColors] is null, isWallpaperDark is true.
+ val isWallpaperDark: Boolean =
+ (colors.colorHints.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) == 0
+ clock.events.onSeedColorChanged(
+ if (isWallpaperDark) lightClockColor else darkClockColor
+ )
+ }
+
+ updateLargeClock(clock)
+ updateSmallClock(clock)
}
+ }
- updateLargeClock(clock)
- updateSmallClock(clock)
+ private suspend fun fetchThemeStyleFromSetting(): Style {
+ val overlayPackageJson =
+ withContext(backgroundDispatcher) {
+ secureSettings.getString(
+ Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES,
+ )
+ }
+ return if (!overlayPackageJson.isNullOrEmpty()) {
+ try {
+ val jsonObject = JSONObject(overlayPackageJson)
+ Style.valueOf(jsonObject.getString(OVERLAY_CATEGORY_THEME_STYLE))
+ } catch (e: (JSONException)) {
+ Log.i(TAG, "Failed to parse THEME_CUSTOMIZATION_OVERLAY_PACKAGES.", e)
+ Style.TONAL_SPOT
+ } catch (e: IllegalArgumentException) {
+ Log.i(TAG, "Failed to parse THEME_CUSTOMIZATION_OVERLAY_PACKAGES.", e)
+ Style.TONAL_SPOT
+ }
+ } else {
+ Style.TONAL_SPOT
+ }
}
private fun updateLargeClock(clock: ClockController) {
@@ -602,6 +647,8 @@
}
companion object {
+ private const val TAG = "KeyguardPreviewRenderer"
+ private const val OVERLAY_CATEGORY_THEME_STYLE = "android.theme.customization.theme_style"
private const val KEY_HOST_TOKEN = "host_token"
private const val KEY_VIEW_WIDTH = "width"
private const val KEY_VIEW_HEIGHT = "height"
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
index fa27442..1c6a2ab 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprint.kt
@@ -21,9 +21,9 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
import com.android.systemui.keyguard.shared.model.KeyguardSection
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection
@@ -75,10 +75,10 @@
defaultStatusBarSection,
defaultNotificationStackScrollLayoutSection,
aodNotificationIconsSection,
+ smartspaceSection,
aodBurnInSection,
communalTutorialIndicatorSection,
clockSection,
- smartspaceSection,
defaultDeviceEntrySection, // Add LAST: Intentionally has z-order above other views.
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
index 484d351..df9ae41 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodBurnInSection.kt
@@ -22,8 +22,12 @@
import androidx.constraintlayout.helper.widget.Layer
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.shared.KeyguardShadeMigrationNssl
import com.android.systemui.keyguard.shared.model.KeyguardSection
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
+import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
import com.android.systemui.res.R
import javax.inject.Inject
@@ -32,21 +36,31 @@
@Inject
constructor(
private val context: Context,
+ private val clockViewModel: KeyguardClockViewModel,
+ private val smartspaceViewModel: KeyguardSmartspaceViewModel,
+ private val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
+ lateinit var burnInLayer: Layer
override fun addViews(constraintLayout: ConstraintLayout) {
if (!KeyguardShadeMigrationNssl.isEnabled) {
return
}
- val statusView = constraintLayout.requireViewById<View>(R.id.keyguard_status_view)
val nic = constraintLayout.requireViewById<View>(R.id.aod_notification_icon_container)
- val burnInLayer =
+ burnInLayer =
Layer(context).apply {
id = R.id.burn_in_layer
addView(nic)
- addView(statusView)
+ if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ val statusView =
+ constraintLayout.requireViewById<View>(R.id.keyguard_status_view)
+ addView(statusView)
+ }
}
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ addSmartspaceViews(constraintLayout)
+ }
constraintLayout.addView(burnInLayer)
}
@@ -54,6 +68,9 @@
if (!KeyguardShadeMigrationNssl.isEnabled) {
return
}
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ clockViewModel.burnInLayer = burnInLayer
+ }
}
override fun applyConstraints(constraintSet: ConstraintSet) {
@@ -65,4 +82,22 @@
override fun removeViews(constraintLayout: ConstraintLayout) {
constraintLayout.removeView(R.id.burn_in_layer)
}
+
+ private fun addSmartspaceViews(constraintLayout: ConstraintLayout) {
+ burnInLayer.apply {
+ if (smartspaceViewModel.isSmartspaceEnabled) {
+ val smartspaceView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.smartspaceViewId)
+ addView(smartspaceView)
+ if (smartspaceViewModel.isDateWeatherDecoupled) {
+ val dateView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.dateId)
+ val weatherView =
+ constraintLayout.requireViewById<View>(smartspaceViewModel.weatherId)
+ addView(weatherView)
+ addView(dateView)
+ }
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
index 941c295..021f064 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt
@@ -15,7 +15,7 @@
*
*/
-package com.android.systemui.keyguard.ui.view.layout.items
+package com.android.systemui.keyguard.ui.view.layout.sections
import android.content.Context
import android.view.View
@@ -28,7 +28,6 @@
import androidx.constraintlayout.widget.ConstraintSet.TOP
import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT
import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.binder.KeyguardClockViewBinder
@@ -39,7 +38,6 @@
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.SplitShadeStateController
import com.android.systemui.util.Utils
-import dagger.Lazy
import javax.inject.Inject
internal fun ConstraintSet.setVisibility(
@@ -60,7 +58,6 @@
val smartspaceViewModel: KeyguardSmartspaceViewModel,
private val context: Context,
private val splitShadeStateController: SplitShadeStateController,
- private val keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>,
private val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
override fun addViews(constraintLayout: ConstraintLayout) {}
@@ -70,7 +67,6 @@
this,
constraintLayout,
keyguardClockViewModel,
- keyguardBlueprintInteractor.get(),
clockInteractor,
featureFlags
)
@@ -109,15 +105,15 @@
return previousValue != largeClockEndGuideline
}
- fun getTargetClockFace(clock: ClockController): ClockFaceLayout =
+ private fun getTargetClockFace(clock: ClockController): ClockFaceLayout =
if (keyguardClockViewModel.useLargeClock) getLargeClockFace(clock)
else getSmallClockFace(clock)
- fun getNonTargetClockFace(clock: ClockController): ClockFaceLayout =
+ private fun getNonTargetClockFace(clock: ClockController): ClockFaceLayout =
if (keyguardClockViewModel.useLargeClock) getSmallClockFace(clock)
else getLargeClockFace(clock)
- fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout
- fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout
+ private fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout
+ private fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout
fun applyDefaultConstraints(constraints: ConstraintSet) {
constraints.apply {
connect(R.id.lockscreen_clock_view_large, START, PARENT_ID, START)
@@ -138,6 +134,7 @@
)
}
connect(R.id.lockscreen_clock_view_large, TOP, PARENT_ID, TOP, largeClockTopMargin)
+ constrainHeight(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
constrainWidth(R.id.lockscreen_clock_view_large, WRAP_CONTENT)
constrainWidth(R.id.lockscreen_clock_view, WRAP_CONTENT)
constrainHeight(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
index 8aef7c2..56f717d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultIndicationAreaSection.kt
@@ -22,12 +22,12 @@
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.android.systemui.Flags.keyguardBottomAreaRefactor
-import com.android.systemui.res.R
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.binder.KeyguardIndicationAreaBinder
import com.android.systemui.keyguard.ui.view.KeyguardIndicationArea
import com.android.systemui.keyguard.ui.viewmodel.KeyguardIndicationAreaViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
+import com.android.systemui.res.R
import com.android.systemui.statusbar.KeyguardIndicationController
import javax.inject.Inject
import kotlinx.coroutines.DisposableHandle
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
index 4abcca9..851a45f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultStatusViewSection.kt
@@ -53,7 +53,7 @@
private val keyguardViewConfigurator: Lazy<KeyguardViewConfigurator>,
private val notificationPanelViewController: Lazy<NotificationPanelViewController>,
private val keyguardMediaController: KeyguardMediaController,
- private val splitShadeStateController: SplitShadeStateController
+ private val splitShadeStateController: SplitShadeStateController,
) : KeyguardSection() {
private val statusViewId = R.id.keyguard_status_view
@@ -76,6 +76,9 @@
keyguardStatusView.findViewById<View>(R.id.left_aligned_notification_icon_container)?.let {
it.setVisibility(View.GONE)
}
+ // Should keep this even if flag, migrating clocks to blueprint, is on
+ // cause some events in clockEventController rely on keyguardStatusViewController
+ // TODO(b/313499340): clean up
constraintLayout.addView(keyguardStatusView)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
index 25931a6..a005692 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt
@@ -47,9 +47,9 @@
val keyguardUnlockAnimationController: KeyguardUnlockAnimationController,
val featureFlags: FeatureFlagsClassic,
) : KeyguardSection() {
- var smartspaceView: View? = null
- var weatherView: View? = null
- var dateView: View? = null
+ private var smartspaceView: View? = null
+ private var weatherView: View? = null
+ private var dateView: View? = null
override fun addViews(constraintLayout: ConstraintLayout) {
if (!featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
@@ -65,16 +65,11 @@
constraintLayout.addView(dateView)
}
}
-
keyguardUnlockAnimationController.lockscreenSmartspace = smartspaceView
}
override fun bindData(constraintLayout: ConstraintLayout) {
- KeyguardSmartspaceViewBinder.bind(
- this,
- constraintLayout,
- keyguardClockViewModel,
- )
+ KeyguardSmartspaceViewBinder.bind(this, constraintLayout, keyguardClockViewModel)
}
override fun applyConstraints(constraintSet: ConstraintSet) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
index bb7bcd9..8e729f7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModel.kt
@@ -38,15 +38,17 @@
constructor(
private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
transitionInteractor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
// When we're fully transitioned to the AlternateBouncer, the alpha of the scrim should be:
private val alternateBouncerScrimAlpha = .66f
private val toAlternateBouncerTransition =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TRANSITION_DURATION_MS,
- transitionFlow = transitionInteractor.anyStateToAlternateBouncerTransition,
+ animationFlow
+ .setup(
+ duration = TRANSITION_DURATION_MS,
+ stepFlow = transitionInteractor.anyStateToAlternateBouncerTransition,
)
- .createFlow(
+ .sharedFlow(
duration = TRANSITION_DURATION_MS,
onStep = { it },
onFinish = { 1f },
@@ -55,11 +57,12 @@
interpolator = Interpolators.FAST_OUT_SLOW_IN,
)
private val fromAlternateBouncerTransition =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TRANSITION_DURATION_MS,
- transitionFlow = transitionInteractor.transitionStepsFromState(ALTERNATE_BOUNCER),
+ animationFlow
+ .setup(
+ TRANSITION_DURATION_MS,
+ transitionInteractor.transitionStepsFromState(ALTERNATE_BOUNCER),
)
- .createFlow(
+ .sharedFlow(
duration = TRANSITION_DURATION_MS,
onStep = { 1f - it },
// Reset on cancel
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModel.kt
index 4d2af0c..2b14521 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModel.kt
@@ -32,12 +32,13 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromAodTransitionInteractor.TO_GONE_DURATION,
- transitionFlow = interactor.transition(KeyguardState.AOD, KeyguardState.GONE),
+ animationFlow.setup(
+ duration = FromAodTransitionInteractor.TO_GONE_DURATION,
+ stepFlow = interactor.transition(KeyguardState.AOD, KeyguardState.GONE),
)
override val deviceEntryParentViewAlpha = transitionAnimation.immediatelyTransitionTo(0f)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
index 1864437..5e552e1 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
@@ -39,24 +39,25 @@
constructor(
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_LOCKSCREEN_DURATION,
- transitionFlow = interactor.aodToLockscreenTransition,
+ animationFlow.setup(
+ duration = TO_LOCKSCREEN_DURATION,
+ stepFlow = interactor.aodToLockscreenTransition,
)
/** Ensure alpha is set to be visible */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 500.milliseconds,
onStart = { 1f },
onStep = { 1f },
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 167.milliseconds,
startTime = 67.milliseconds,
onStep = { it },
@@ -67,7 +68,7 @@
deviceEntryUdfpsInteractor.isUdfpsSupported.flatMapLatest { isUdfps ->
if (isUdfps) {
// fade in
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
onFinish = { 1f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
index 06661d0..d283af3 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModel.kt
@@ -30,11 +30,12 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromAodTransitionInteractor.TO_OCCLUDED_DURATION,
- transitionFlow = interactor.transition(KeyguardState.AOD, KeyguardState.OCCLUDED),
+ animationFlow.setup(
+ duration = FromAodTransitionInteractor.TO_OCCLUDED_DURATION,
+ stepFlow = interactor.transition(KeyguardState.AOD, KeyguardState.OCCLUDED),
)
override val deviceEntryParentViewAlpha = transitionAnimation.immediatelyTransitionTo(0f)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
index da74f2f..41dc157 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlows.kt
@@ -47,6 +47,7 @@
private val keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>,
private val featureFlags: FeatureFlagsClassic,
private val shadeInteractor: ShadeInteractor,
+ private val animationFlow: KeyguardTransitionAnimationFlow,
) {
/** Common fade for scrim alpha values during *BOUNCER->GONE */
fun scrimAlpha(duration: Duration, fromState: KeyguardState): Flow<ScrimAlpha> {
@@ -73,14 +74,14 @@
var leaveShadeOpen: Boolean = false
var willRunDismissFromKeyguard: Boolean = false
val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = duration,
- transitionFlow = interactor.transition(fromState, GONE)
+ animationFlow.setup(
+ duration = duration,
+ stepFlow = interactor.transition(fromState, GONE)
)
return shadeInteractor.shadeExpansion.flatMapLatest { shadeExpansion ->
transitionAnimation
- .createFlow(
+ .sharedFlow(
duration = duration,
interpolator = EMPHASIZED_ACCELERATE,
onStart = {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
index 5b5a103..bd6aae8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt
@@ -57,7 +57,6 @@
private val sceneContainerFlags: SceneContainerFlags,
private val keyguardViewController: Lazy<KeyguardViewController>,
private val deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor,
- udfpsInteractor: DeviceEntryUdfpsInteractor,
private val deviceEntryInteractor: DeviceEntryInteractor,
) {
private val intEvaluator = IntEvaluator()
@@ -149,7 +148,7 @@
}
val iconType: Flow<DeviceEntryIconView.IconType> =
combine(
- udfpsInteractor.isListeningForUdfps,
+ deviceEntryUdfpsInteractor.isListeningForUdfps,
deviceEntryInteractor.isUnlocked,
) { isListeningForUdfps, isUnlocked ->
if (isUnlocked) {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
index a728a28..0b34326 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModel.kt
@@ -35,15 +35,16 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
- private val transitionAnimation: KeyguardTransitionAnimationFlow =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromDozingTransitionInteractor.TO_LOCKSCREEN_DURATION,
- transitionFlow = interactor.dozingToLockscreenTransition,
+ private val transitionAnimation =
+ animationFlow.setup(
+ duration = FromDozingTransitionInteractor.TO_LOCKSCREEN_DURATION,
+ stepFlow = interactor.dozingToLockscreenTransition,
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 150.milliseconds,
onStep = { it },
onCancel = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt
index 58235ae..8bcf3f8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingHostedToLockscreenTransitionViewModel.kt
@@ -29,16 +29,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_LOCKSCREEN_DURATION,
- transitionFlow = interactor.dreamingLockscreenHostedToLockscreenTransition
+ animationFlow.setup(
+ duration = TO_LOCKSCREEN_DURATION,
+ stepFlow = interactor.dreamingLockscreenHostedToLockscreenTransition,
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
onCancel = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
index f943bdf..5f620af 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
@@ -45,13 +45,14 @@
keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val fromDreamingTransitionInteractor: FromDreamingTransitionInteractor,
private val deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
fun startTransition() = fromDreamingTransitionInteractor.startToLockscreenTransition()
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_LOCKSCREEN_DURATION,
- transitionFlow = keyguardTransitionInteractor.dreamingToLockscreenTransition,
+ animationFlow.setup(
+ duration = TO_LOCKSCREEN_DURATION,
+ stepFlow = keyguardTransitionInteractor.dreamingToLockscreenTransition,
)
val transitionEnded =
@@ -62,7 +63,7 @@
/** Dream overlay y-translation on exit */
fun dreamOverlayTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = TO_LOCKSCREEN_DURATION,
onStep = { it * translatePx },
interpolator = EMPHASIZED,
@@ -71,14 +72,14 @@
/** Dream overlay views alpha - fade out */
val dreamOverlayAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
)
/** Lockscreen views y-translation */
fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = TO_LOCKSCREEN_DURATION,
onStep = { value -> -translatePx + value * translatePx },
// Reset on cancel or finish
@@ -90,14 +91,14 @@
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
startTime = 233.milliseconds,
duration = 250.milliseconds,
onStep = { it },
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
startTime = 233.milliseconds,
duration = 250.milliseconds,
onStep = { it },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
index 62b2281..3f27eb0 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
@@ -38,17 +38,18 @@
constructor(
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_AOD_DURATION,
- transitionFlow = interactor.goneToAodTransition,
+ animationFlow.setup(
+ duration = TO_AOD_DURATION,
+ stepFlow = interactor.goneToAodTransition,
)
/** y-translation from the top of the screen for AOD */
fun enterFromTopTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
startTime = 600.milliseconds,
duration = 500.milliseconds,
onStart = { translatePx },
@@ -61,7 +62,7 @@
/** alpha animation upon entering AOD */
val enterFromTopAnimationAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
startTime = 600.milliseconds,
duration = 500.milliseconds,
onStart = { 0f },
@@ -74,7 +75,7 @@
if (udfpsEnrolled) {
// fade in at the end of the transition to give time for FP to start running
// and avoid a flicker of the unlocked icon
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
startTime = 1100.milliseconds,
duration = 200.milliseconds,
onStep = { it },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingLockscreenHostedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingLockscreenHostedTransitionViewModel.kt
index 113f01c..bba790a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingLockscreenHostedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingLockscreenHostedTransitionViewModel.kt
@@ -33,17 +33,18 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_DREAMING_DURATION,
- transitionFlow = interactor.goneToDreamingLockscreenHostedTransition,
+ animationFlow.setup(
+ duration = TO_DREAMING_DURATION,
+ stepFlow = interactor.goneToDreamingLockscreenHostedTransition,
)
/** Lockscreen views alpha - hide immediately */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 1.milliseconds,
onStep = { 0f },
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt
index c135786..6762ba6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt
@@ -31,17 +31,18 @@
@Inject
constructor(
private val interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_DREAMING_DURATION,
- transitionFlow = interactor.goneToDreamingTransition,
+ animationFlow.setup(
+ duration = TO_DREAMING_DURATION,
+ stepFlow = interactor.goneToDreamingTransition,
)
/** Lockscreen views y-translation */
fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = 500.milliseconds,
onStep = { it * translatePx },
// Reset on cancel or finish
@@ -53,7 +54,7 @@
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt
index 5804a20..adae8ab 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToLockscreenTransitionViewModel.kt
@@ -29,16 +29,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_LOCKSCREEN_DURATION,
- transitionFlow = interactor.goneToLockscreenTransition
+ animationFlow.setup(
+ duration = TO_LOCKSCREEN_DURATION,
+ stepFlow = interactor.goneToLockscreenTransition
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
onCancel = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
index c54f47b..7ffa149 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt
@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.ui.viewmodel
+import androidx.constraintlayout.helper.widget.Layer
import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.keyguard.KeyguardClockSwitch.SMALL
import com.android.systemui.dagger.SysUISingleton
@@ -29,7 +30,6 @@
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.stateIn
@SysUISingleton
@@ -40,19 +40,14 @@
val keyguardClockInteractor: KeyguardClockInteractor,
@Application private val applicationScope: CoroutineScope,
) {
+ var burnInLayer: Layer? = null
val useLargeClock: Boolean
get() = clockSize.value == LARGE
- var clock: ClockController?
- set(value) {
- keyguardClockInteractor.clock = value
- }
- get() {
- return keyguardClockInteractor.clock
- }
+ var clock: ClockController? by keyguardClockInteractor::clock
val clockSize =
- combine(keyguardClockInteractor.selectedClockSize, keyguardInteractor.clockSize) {
+ combine(keyguardClockInteractor.selectedClockSize, keyguardClockInteractor.clockSize) {
selectedSize,
clockSize ->
if (selectedSize == SettingsClockSize.SMALL) {
@@ -61,7 +56,6 @@
clockSize
}
}
- .distinctUntilChanged()
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
@@ -72,16 +66,23 @@
val hasCustomWeatherDataDisplay =
combine(clockSize, currentClock) { size, clock ->
- (if (size == LARGE) clock.largeClock.config.hasCustomWeatherDataDisplay
- else clock.smallClock.config.hasCustomWeatherDataDisplay)
+ clock?.let {
+ (if (size == LARGE) clock.largeClock.config.hasCustomWeatherDataDisplay
+ else clock.smallClock.config.hasCustomWeatherDataDisplay)
+ }
+ ?: false
}
- .distinctUntilChanged()
.stateIn(
scope = applicationScope,
started = SharingStarted.WhileSubscribed(),
- initialValue = false
+ initialValue = currentClock.value?.largeClock?.config?.hasCustomWeatherDataDisplay
+ ?: false
)
val clockShouldBeCentered: Flow<Boolean> =
- keyguardInteractor.clockShouldBeCentered.distinctUntilChanged()
+ keyguardInteractor.clockShouldBeCentered.stateIn(
+ scope = applicationScope,
+ started = SharingStarted.WhileSubscribed(),
+ initialValue = true
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
index 2327c02..6458eda 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModel.kt
@@ -17,6 +17,7 @@
package com.android.systemui.keyguard.ui.viewmodel
import com.android.systemui.Flags.keyguardBottomAreaRefactor
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
@@ -35,10 +36,11 @@
keyguardBottomAreaViewModel: KeyguardBottomAreaViewModel,
private val burnInHelperWrapper: BurnInHelperWrapper,
private val shortcutsCombinedViewModel: KeyguardQuickAffordancesCombinedViewModel,
+ configurationInteractor: ConfigurationInteractor,
) {
/** Notifies when a new configuration is set */
- val configurationChange: Flow<Unit> = keyguardInteractor.configurationChange
+ val configurationChange: Flow<Unit> = configurationInteractor.onAnyConfigurationChange
/** An observable for the alpha level for the entire bottom area. */
val alpha: Flow<Float> = keyguardBottomAreaViewModel.alpha
@@ -47,17 +49,18 @@
val isIndicationAreaPadded: Flow<Boolean> =
if (keyguardBottomAreaRefactor()) {
combine(shortcutsCombinedViewModel.startButton, shortcutsCombinedViewModel.endButton) {
- startButtonModel,
- endButtonModel ->
- startButtonModel.isVisible || endButtonModel.isVisible
- }
+ startButtonModel,
+ endButtonModel ->
+ startButtonModel.isVisible || endButtonModel.isVisible
+ }
.distinctUntilChanged()
} else {
- combine(keyguardBottomAreaViewModel.startButton, keyguardBottomAreaViewModel.endButton) {
- startButtonModel,
- endButtonModel ->
- startButtonModel.isVisible || endButtonModel.isVisible
- }
+ combine(
+ keyguardBottomAreaViewModel.startButton,
+ keyguardBottomAreaViewModel.endButton
+ ) { startButtonModel, endButtonModel ->
+ startButtonModel.isVisible || endButtonModel.isVisible
+ }
.distinctUntilChanged()
}
/** An observable for the x-offset by which the indication area should be translated. */
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
index f63afeb..889464d 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt
@@ -17,20 +17,24 @@
package com.android.systemui.keyguard.ui.viewmodel
-import android.content.Context
import android.util.MathUtils
import android.view.View.VISIBLE
import com.android.app.animation.Interpolators
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.Flags.newAodTransition
import com.android.systemui.common.shared.model.NotificationContainerBounds
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.flags.FeatureFlagsClassic
+import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.BurnInModel
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.GONE
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.plugins.ClockController
import com.android.systemui.res.R
@@ -61,18 +65,29 @@
class KeyguardRootViewModel
@Inject
constructor(
- private val context: Context,
+ configurationInteractor: ConfigurationInteractor,
private val deviceEntryInteractor: DeviceEntryInteractor,
private val dozeParameters: DozeParameters,
private val keyguardInteractor: KeyguardInteractor,
private val keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val notificationsKeyguardInteractor: NotificationsKeyguardInteractor,
private val burnInInteractor: BurnInInteractor,
+ private val keyguardClockViewModel: KeyguardClockViewModel,
private val goneToAodTransitionViewModel: GoneToAodTransitionViewModel,
private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
+ private val occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
screenOffAnimationController: ScreenOffAnimationController,
+ // TODO(b/310989341): remove after changing migrate_clocks_to_blueprint to aconfig
+ private val featureFlags: FeatureFlagsClassic,
) {
var clockControllerProvider: Provider<ClockController>? = null
+ get() {
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ return Provider { keyguardClockViewModel.clock }
+ } else {
+ return field
+ }
+ }
/** System insets that keyguard needs to stay out of */
var topInset: Int = 0
@@ -84,14 +99,18 @@
.filter { it == AOD || it == LOCKSCREEN }
.map { VISIBLE }
- val goneToAodTransition = keyguardTransitionInteractor.goneToAodTransition
+ val goneToAodTransition = keyguardTransitionInteractor.transition(from = GONE, to = AOD)
/** the shared notification container bounds *on the lockscreen* */
val notificationBounds: StateFlow<NotificationContainerBounds> =
keyguardInteractor.notificationContainerBounds
/** An observable for the alpha level for the entire keyguard root view. */
- val alpha: Flow<Float> = keyguardInteractor.keyguardAlpha.distinctUntilChanged()
+ val alpha: Flow<Float> =
+ merge(
+ keyguardInteractor.keyguardAlpha.distinctUntilChanged(),
+ occludedToLockscreenTransitionViewModel.lockscreenAlpha,
+ )
private fun burnIn(): Flow<BurnInModel> {
val dozingAmount: Flow<Float> =
@@ -103,7 +122,8 @@
return combine(dozingAmount, burnInInteractor.keyguardBurnIn) { dozeAmount, burnIn ->
val interpolation = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(dozeAmount)
val useScaleOnly =
- clockControllerProvider?.get()?.config?.useAlternateSmartspaceAODTransition ?: false
+ (clockControllerProvider?.get()?.config?.useAlternateSmartspaceAODTransition
+ ?: false) && keyguardClockViewModel.clockSize.value == LARGE
if (useScaleOnly) {
BurnInModel(
translationX = 0,
@@ -113,7 +133,12 @@
} else {
// Ensure the desired translation doesn't encroach on the top inset
val burnInY = MathUtils.lerp(0, burnIn.translationY, interpolation).toInt()
- val translationY = -(statusViewTop - Math.max(topInset, statusViewTop + burnInY))
+ val translationY =
+ if (featureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
+ burnInY
+ } else {
+ -(statusViewTop - Math.max(topInset, statusViewTop + burnInY))
+ }
BurnInModel(
translationX = MathUtils.lerp(0, burnIn.translationX, interpolation).toInt(),
translationY = translationY,
@@ -131,22 +156,28 @@
val burnInLayerAlpha: Flow<Float> = goneToAodTransitionViewModel.enterFromTopAnimationAlpha
val translationY: Flow<Float> =
- keyguardInteractor.configurationChange.flatMapLatest { _ ->
- val enterFromTopAmount =
- context.resources.getDimensionPixelSize(
- R.dimen.keyguard_enter_from_top_translation_y
- )
- combine(
- keyguardInteractor.keyguardTranslationY.onStart { emit(0f) },
- burnIn().map { it.translationY.toFloat() }.onStart { emit(0f) },
- goneToAodTransitionViewModel.enterFromTopTranslationY(enterFromTopAmount).onStart {
- emit(0f)
- },
- ) { keyguardTransitionY, burnInTranslationY, goneToAodTransitionTranslationY ->
- // All 3 values need to be combined for a smooth translation
- keyguardTransitionY + burnInTranslationY + goneToAodTransitionTranslationY
+ configurationInteractor
+ .dimensionPixelSize(R.dimen.keyguard_enter_from_top_translation_y)
+ .flatMapLatest { enterFromTopAmount ->
+ combine(
+ keyguardInteractor.keyguardTranslationY.onStart { emit(0f) },
+ burnIn().map { it.translationY.toFloat() }.onStart { emit(0f) },
+ goneToAodTransitionViewModel
+ .enterFromTopTranslationY(enterFromTopAmount)
+ .onStart { emit(0f) },
+ occludedToLockscreenTransitionViewModel.lockscreenTranslationY,
+ ) {
+ keyguardTransitionY,
+ burnInTranslationY,
+ goneToAodTransitionTranslationY,
+ occludedToLockscreenTransitionTranslationY ->
+ // All values need to be combined for a smooth translation
+ keyguardTransitionY +
+ burnInTranslationY +
+ goneToAodTransitionTranslationY +
+ occludedToLockscreenTransitionTranslationY
+ }
}
- }
val translationX: Flow<Float> = burnIn().map { it.translationX.toFloat() }
@@ -194,7 +225,6 @@
.distinctUntilChanged()
fun onNotificationContainerBoundsChanged(top: Float, bottom: Float) {
-
keyguardInteractor.setNotificationContainerBounds(NotificationContainerBounds(top, bottom))
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
index 8e33651..4541458 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModel.kt
@@ -30,16 +30,21 @@
val isWeatherEnabled: Boolean = smartspaceController.isWeatherEnabled()
val isDateWeatherDecoupled: Boolean = smartspaceController.isDateWeatherDecoupled()
val smartspaceViewId: Int
- get() {
- return context.resources
- .getIdentifier("bc_smartspace_view", "id", context.packageName)
- .also {
- if (it == 0) {
- Log.d(TAG, "Cannot resolve id bc_smartspace_view")
- }
- }
- }
+ get() = getId("bc_smartspace_view")
+ val dateId: Int
+ get() = getId("date_smartspace_view")
+
+ val weatherId: Int
+ get() = getId("weather_smartspace_view")
+
+ private fun getId(name: String): Int {
+ return context.resources.getIdentifier(name, "id", context.packageName).also {
+ if (it == 0) {
+ Log.d(TAG, "Cannot resolve id $name")
+ }
+ }
+ }
fun getDimen(name: String): Int {
val res = context.packageManager.getResourcesForApplication(context.packageName)
val id = res.getIdentifier(name, "dimen", context.packageName)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
index 8e8fd75c..65614f4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
@@ -39,19 +39,20 @@
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
shadeDependentFlows: ShadeDependentFlows,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromLockscreenTransitionInteractor.TO_AOD_DURATION,
- transitionFlow = interactor.lockscreenToAodTransition,
+ animationFlow.setup(
+ duration = FromLockscreenTransitionInteractor.TO_AOD_DURATION,
+ stepFlow = interactor.lockscreenToAodTransition,
)
val deviceEntryBackgroundViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
flowWhenShadeIsNotExpanded =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
@@ -59,7 +60,7 @@
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
@@ -72,7 +73,7 @@
if (isUdfpsEnrolledAndEnabled) {
shadeDependentFlows.transitionFlow(
flowWhenShadeIsExpanded = // fade in
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { it },
onFinish = { 1f },
@@ -83,7 +84,7 @@
shadeDependentFlows.transitionFlow(
flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
flowWhenShadeIsNotExpanded = // fade out
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 200.milliseconds,
onStep = { 1f - it },
onFinish = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
index 263ed11..accb20c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDozingTransitionViewModel.kt
@@ -29,16 +29,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_DOZING_DURATION,
- transitionFlow = interactor.lockscreenToDozingTransition
+ animationFlow.setup(
+ duration = TO_DOZING_DURATION,
+ stepFlow = interactor.lockscreenToDozingTransition
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt
index 1701505..c649b12 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingHostedTransitionViewModel.kt
@@ -29,16 +29,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_DREAMING_HOSTED_DURATION,
- transitionFlow = interactor.lockscreenToDreamingLockscreenHostedTransition
+ animationFlow.setup(
+ duration = TO_DREAMING_HOSTED_DURATION,
+ stepFlow = interactor.lockscreenToDreamingLockscreenHostedTransition
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
index 401c0ff..7f75b54 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
@@ -36,16 +36,17 @@
constructor(
interactor: KeyguardTransitionInteractor,
shadeDependentFlows: ShadeDependentFlows,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_DREAMING_DURATION,
- transitionFlow = interactor.lockscreenToDreamingTransition,
+ animationFlow.setup(
+ duration = TO_DREAMING_DURATION,
+ stepFlow = interactor.lockscreenToDreamingTransition,
)
/** Lockscreen views y-translation */
fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = 500.milliseconds,
onStep = { it * translatePx },
// Reset on cancel or finish
@@ -57,13 +58,13 @@
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
index cfb4bf5..9e19713 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModel.kt
@@ -36,16 +36,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromLockscreenTransitionInteractor.TO_GONE_DURATION,
- transitionFlow = interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.GONE),
+ animationFlow.setup(
+ duration = FromLockscreenTransitionInteractor.TO_GONE_DURATION,
+ stepFlow = interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.GONE),
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
index a6136f9..9db0b77 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
@@ -17,14 +17,17 @@
package com.android.systemui.keyguard.ui.viewmodel
import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_OCCLUDED_DURATION
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.res.R
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.flatMapLatest
/**
* Breaks down LOCKSCREEN->OCCLUDED transition into discrete steps for corresponding views to
@@ -36,22 +39,26 @@
constructor(
interactor: KeyguardTransitionInteractor,
shadeDependentFlows: ShadeDependentFlows,
+ configurationInteractor: ConfigurationInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
+
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_OCCLUDED_DURATION,
- transitionFlow = interactor.lockscreenToOccludedTransition,
+ animationFlow.setup(
+ duration = TO_OCCLUDED_DURATION,
+ stepFlow = interactor.lockscreenToOccludedTransition,
)
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
+ name = "LOCKSCREEN->OCCLUDED: lockscreenAlpha",
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1 - it },
onFinish = { 0f },
@@ -59,16 +66,19 @@
)
/** Lockscreen views y-translation */
- fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
- duration = TO_OCCLUDED_DURATION,
- onStep = { value -> value * translatePx },
- // Reset on cancel or finish
- onFinish = { 0f },
- onCancel = { 0f },
- interpolator = EMPHASIZED_ACCELERATE,
- )
- }
+ val lockscreenTranslationY: Flow<Float> =
+ configurationInteractor
+ .dimensionPixelSize(R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y)
+ .flatMapLatest { translatePx ->
+ transitionAnimation.sharedFlow(
+ duration = TO_OCCLUDED_DURATION,
+ onStep = { value -> value * translatePx },
+ // Reset on cancel or finish
+ onFinish = { 0f },
+ onCancel = { 0f },
+ interpolator = EMPHASIZED_ACCELERATE,
+ )
+ }
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
index 07dd4ef..52e3257 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
@@ -39,11 +39,12 @@
constructor(
interactor: KeyguardTransitionInteractor,
shadeDependentFlows: ShadeDependentFlows,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION,
- transitionFlow =
+ animationFlow.setup(
+ duration = FromLockscreenTransitionInteractor.TO_PRIMARY_BOUNCER_DURATION,
+ stepFlow =
interactor.transition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER),
)
@@ -55,7 +56,7 @@
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
flowWhenShadeIsNotExpanded =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
onFinish = { 0f }
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModel.kt
index f7cff9b..ed5e83c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModel.kt
@@ -37,11 +37,12 @@
constructor(
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromOccludedTransitionInteractor.TO_AOD_DURATION,
- transitionFlow = interactor.transition(KeyguardState.OCCLUDED, KeyguardState.AOD),
+ animationFlow.setup(
+ duration = FromOccludedTransitionInteractor.TO_AOD_DURATION,
+ stepFlow = interactor.transition(KeyguardState.OCCLUDED, KeyguardState.AOD),
)
val deviceEntryBackgroundViewAlpha: Flow<Float> =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
index 58be093..4c24f83 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
@@ -17,12 +17,14 @@
package com.android.systemui.keyguard.ui.viewmodel
import com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.res.R
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -40,26 +42,32 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
- deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor
+ deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ configurationInteractor: ConfigurationInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
+
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_LOCKSCREEN_DURATION,
- transitionFlow = interactor.occludedToLockscreenTransition,
+ animationFlow.setup(
+ duration = TO_LOCKSCREEN_DURATION,
+ stepFlow = interactor.occludedToLockscreenTransition,
)
/** Lockscreen views y-translation */
- fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
- return transitionAnimation.createFlow(
- duration = TO_LOCKSCREEN_DURATION,
- onStep = { value -> -translatePx + value * translatePx },
- interpolator = EMPHASIZED_DECELERATE,
- onCancel = { 0f },
- )
- }
+ val lockscreenTranslationY: Flow<Float> =
+ configurationInteractor
+ .dimensionPixelSize(R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y)
+ .flatMapLatest { translatePx ->
+ transitionAnimation.sharedFlow(
+ duration = TO_LOCKSCREEN_DURATION,
+ onStep = { value -> -translatePx + value * translatePx },
+ interpolator = EMPHASIZED_DECELERATE,
+ onCancel = { 0f },
+ )
+ }
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
onCancel = { 0f },
@@ -67,10 +75,12 @@
/** Lockscreen views alpha */
val lockscreenAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
startTime = 233.milliseconds,
duration = 250.milliseconds,
onStep = { it },
+ onStart = { 0f },
+ name = "OCCLUDED->LOCKSCREEN: lockscreenAlpha",
)
val deviceEntryBackgroundViewAlpha: Flow<Float> =
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
index c3bc799..93482ea 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OffToLockscreenTransitionViewModel.kt
@@ -28,16 +28,17 @@
@Inject
constructor(
interactor: KeyguardTransitionInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = 250.milliseconds,
- transitionFlow = interactor.offToLockscreenTransition
+ animationFlow.setup(
+ duration = 250.milliseconds,
+ stepFlow = interactor.offToLockscreenTransition
)
val shortcutsAlpha: Flow<Float> =
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
onCancel = { 0f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
index 05a6d58..b0e2aa2 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
@@ -41,12 +41,12 @@
constructor(
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromPrimaryBouncerTransitionInteractor.TO_AOD_DURATION,
- transitionFlow =
- interactor.transition(KeyguardState.PRIMARY_BOUNCER, KeyguardState.AOD),
+ animationFlow.setup(
+ duration = FromPrimaryBouncerTransitionInteractor.TO_AOD_DURATION,
+ stepFlow = interactor.transition(KeyguardState.PRIMARY_BOUNCER, KeyguardState.AOD),
)
val deviceEntryBackgroundViewAlpha: Flow<Float> =
@@ -62,7 +62,7 @@
deviceEntryUdfpsInteractor.isUdfpsEnrolledAndEnabled.flatMapLatest {
isUdfpsEnrolledAndEnabled ->
if (isUdfpsEnrolledAndEnabled) {
- transitionAnimation.createFlow(
+ transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { it },
onFinish = { 1f },
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
index 0e95be2..9dbe97f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt
@@ -50,11 +50,12 @@
keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>,
featureFlags: FeatureFlagsClassic,
bouncerToGoneFlows: BouncerToGoneFlows,
+ animationFlow: KeyguardTransitionAnimationFlow,
) {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = TO_GONE_DURATION,
- transitionFlow = interactor.transition(PRIMARY_BOUNCER, GONE)
+ animationFlow.setup(
+ duration = TO_GONE_DURATION,
+ stepFlow = interactor.transition(PRIMARY_BOUNCER, GONE)
)
private var leaveShadeOpen: Boolean = false
@@ -71,7 +72,7 @@
createBouncerAlphaFlow(primaryBouncerInteractor::willRunDismissFromKeyguard)
}
private fun createBouncerAlphaFlow(willRunAnimationOnKeyguard: () -> Boolean): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = 200.milliseconds,
onStart = { willRunDismissFromKeyguard = willRunAnimationOnKeyguard() },
onStep = {
@@ -95,7 +96,7 @@
createLockscreenAlpha(primaryBouncerInteractor::willRunDismissFromKeyguard)
}
private fun createLockscreenAlpha(willRunAnimationOnKeyguard: () -> Boolean): Flow<Float> {
- return transitionAnimation.createFlow(
+ return transitionAnimation.sharedFlow(
duration = 50.milliseconds,
onStart = {
leaveShadeOpen = statusBarStateController.leaveOpenOnKeyguardHide()
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
index 7ef8374..b2eed60 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModel.kt
@@ -41,11 +41,12 @@
constructor(
interactor: KeyguardTransitionInteractor,
deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor,
+ animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
private val transitionAnimation =
- KeyguardTransitionAnimationFlow(
- transitionDuration = FromPrimaryBouncerTransitionInteractor.TO_LOCKSCREEN_DURATION,
- transitionFlow =
+ animationFlow.setup(
+ duration = FromPrimaryBouncerTransitionInteractor.TO_LOCKSCREEN_DURATION,
+ stepFlow =
interactor.transition(KeyguardState.PRIMARY_BOUNCER, KeyguardState.LOCKSCREEN),
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
index a0f5baf..2d0712c 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt
@@ -20,14 +20,13 @@
import android.content.Context
import android.graphics.Point
import androidx.core.animation.doOnEnd
+import com.android.systemui.Flags
import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor
import com.android.systemui.biometrics.domain.interactor.SideFpsSensorInteractor
import com.android.systemui.biometrics.shared.model.DisplayRotation
import com.android.systemui.biometrics.shared.model.isDefaultOrientation
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.flags.FeatureFlagsClassic
-import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.ErrorFingerprintAuthenticationStatus
@@ -58,7 +57,6 @@
private val sfpsSensorInteractor: SideFpsSensorInteractor,
displayStateInteractor: DisplayStateInteractor,
@Application private val applicationScope: CoroutineScope,
- private val featureFlagsClassic: FeatureFlagsClassic,
) {
private val _progress = MutableStateFlow(0.0f)
private val _visible = MutableStateFlow(false)
@@ -155,7 +153,7 @@
sfpsSensorInteractor.isProlongedTouchRequiredForAuthentication
init {
- if (featureFlagsClassic.isEnabled(Flags.REST_TO_UNLOCK)) {
+ if (Flags.restToUnlock()) {
launchAnimator()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
index 702a23e..e1c6f41 100644
--- a/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/log/ScreenDecorationsLogger.kt
@@ -35,7 +35,7 @@
*
* To enable logcat echoing for an entire buffer:
* ```
- * adb shell settings put global systemui/buffer/ScreenDecorationsLog <logLevel>
+ * adb shell cmd statusbar echo -b ScreenDecorationsLog:<logLevel>
*
* ```
*/
@@ -134,33 +134,35 @@
}
fun cameraProtectionShownOrHidden(
+ showAnimationNow: Boolean,
faceDetectionRunning: Boolean,
biometricPromptShown: Boolean,
- requestedState: Boolean,
+ faceAuthenticated: Boolean,
+ isCameraActive: Boolean,
currentlyShowing: Boolean
) {
logBuffer.log(
TAG,
DEBUG,
{
+ str1 = "$showAnimationNow"
bool1 = faceDetectionRunning
bool2 = biometricPromptShown
- bool3 = requestedState
+ str2 = "$faceAuthenticated"
+ bool3 = isCameraActive
bool4 = currentlyShowing
},
{
- "isFaceDetectionRunning: $bool1, " +
+ "cameraProtectionShownOrHidden showAnimationNow: $str1, " +
+ "isFaceDetectionRunning: $bool1, " +
"isBiometricPromptShowing: $bool2, " +
- "requestedState: $bool3, " +
+ "faceAuthenticated: $str2, " +
+ "isCameraActive: $bool3, " +
"currentState: $bool4"
}
)
}
- fun biometricEvent(@CompileTimeConstant info: String) {
- logBuffer.log(TAG, DEBUG, info)
- }
-
fun cameraProtectionEvent(@CompileTimeConstant cameraProtectionEvent: String) {
logBuffer.log(TAG, DEBUG, cameraProtectionEvent)
}
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardTransitionAnimationLog.kt b/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardTransitionAnimationLog.kt
new file mode 100644
index 0000000..ef06588
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/KeyguardTransitionAnimationLog.kt
@@ -0,0 +1,28 @@
+/*
+ * 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.log.dagger
+
+import javax.inject.Qualifier
+
+/**
+ * A [com.android.systemui.log.LogBuffer] for keyguard transition animations. Should be used mostly
+ * for adding temporary logs or logging from smaller classes when creating new separate log class
+ * might be an overkill.
+ */
+@Qualifier
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+annotation class KeyguardTransitionAnimationLog
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
index 0b3bbb5..dc55179f 100644
--- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
+++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java
@@ -525,6 +525,16 @@
}
/**
+ * Provides a {@link LogBuffer} for keyguard transition animation logs.
+ */
+ @Provides
+ @SysUISingleton
+ @KeyguardTransitionAnimationLog
+ public static LogBuffer provideKeyguardTransitionAnimationLogBuffer(LogBufferFactory factory) {
+ return factory.create("KeyguardTransitionAnimationLog", 250);
+ }
+
+ /**
* Provides a {@link LogBuffer} for Scrims like LightRevealScrim.
*/
@Provides
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 a252470..9cdf857 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
@@ -271,6 +271,10 @@
private val isReorderingAllowed: Boolean
get() = visualStabilityProvider.isReorderingAllowed
+ /** Size provided by the scene framework container */
+ private var widthInSceneContainerPx = 0
+ private var heightInSceneContainerPx = 0
+
init {
dumpManager.registerDumpable(TAG, this)
mediaFrame = inflateMediaCarousel()
@@ -581,6 +585,15 @@
}
}
+ fun setSceneContainerSize(width: Int, height: Int) {
+ if (width == widthInSceneContainerPx && height == heightInSceneContainerPx) {
+ return
+ }
+ widthInSceneContainerPx = width
+ heightInSceneContainerPx = height
+ updatePlayers(recreateMedia = true)
+ }
+
private fun reorderAllPlayers(
previousVisiblePlayerKey: MediaPlayerData.MediaSortKey?,
key: String? = null
@@ -638,6 +651,11 @@
.elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
if (existingPlayer == null) {
val newPlayer = mediaControlPanelFactory.get()
+ if (mediaFlags.isSceneContainerEnabled()) {
+ newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx
+ newPlayer.mediaViewController.heightInSceneContainerPx =
+ heightInSceneContainerPx
+ }
newPlayer.attachPlayer(
MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
index cce4cda..2551da8 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java
@@ -81,7 +81,6 @@
import com.android.internal.widget.CachingIconView;
import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.ActivityIntentHelper;
-import com.android.systemui.res.R;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.GhostedViewLaunchAnimatorController;
import com.android.systemui.bluetooth.BroadcastDialogController;
@@ -102,6 +101,7 @@
import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData;
import com.android.systemui.media.controls.pipeline.MediaDataManager;
import com.android.systemui.media.controls.util.MediaDataUtils;
+import com.android.systemui.media.controls.util.MediaFlags;
import com.android.systemui.media.controls.util.MediaUiEventLogger;
import com.android.systemui.media.controls.util.SmallHash;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
@@ -109,6 +109,7 @@
import com.android.systemui.monet.Style;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.res.R;
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -190,6 +191,7 @@
@VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L;
private final SeekBarViewModel mSeekBarViewModel;
+ private final MediaFlags mMediaFlags;
private SeekBarObserver mSeekBarObserver;
protected final Executor mBackgroundExecutor;
private final DelayableExecutor mMainExecutor;
@@ -280,7 +282,8 @@
NotificationLockscreenUserManager lockscreenUserManager,
BroadcastDialogController broadcastDialogController,
FeatureFlags featureFlags,
- GlobalSettings globalSettings
+ GlobalSettings globalSettings,
+ MediaFlags mediaFlags
) {
mContext = context;
mBackgroundExecutor = backgroundExecutor;
@@ -299,6 +302,7 @@
mActivityIntentHelper = activityIntentHelper;
mLockscreenUserManager = lockscreenUserManager;
mBroadcastDialogController = broadcastDialogController;
+ mMediaFlags = mediaFlags;
mSeekBarViewModel.setLogSeek(() -> {
if (mPackageName != null && mInstanceId != null) {
@@ -575,7 +579,10 @@
// to something which might impact the measurement
// State refresh interferes with the translation animation, only run it if it's not running.
if (!mMetadataAnimationHandler.isRunning()) {
- mMediaViewController.refreshState();
+ // Don't refresh in scene framework, because it will calculate with invalid layout sizes
+ if (!mMediaFlags.isSceneContainerEnabled()) {
+ mMediaViewController.refreshState();
+ }
}
// Turbulence noise
@@ -669,7 +676,7 @@
mLogger.logOpenBroadcastDialog(mUid, mPackageName, mInstanceId);
mCurrentBroadcastApp = device.getName().toString();
mBroadcastDialogController.createBroadcastDialog(mCurrentBroadcastApp,
- mPackageName, true, mMediaViewHolder.getSeamlessButton());
+ mPackageName, mMediaViewHolder.getSeamlessButton());
} else {
mLogger.logOpenOutputSwitcher(mUid, mPackageName, mInstanceId);
mMediaOutputDialogFactory.create(mPackageName, true,
@@ -805,7 +812,14 @@
// Capture width & height from views in foreground for artwork scaling in background
int width = mMediaViewHolder.getAlbumView().getMeasuredWidth();
int height = mMediaViewHolder.getAlbumView().getMeasuredHeight();
+ if (mMediaFlags.isSceneContainerEnabled() && (width <= 0 || height <= 0)) {
+ // TODO(b/312714128): ensure we have a valid size before setting background
+ width = mMediaViewController.getWidthInSceneContainerPx();
+ height = mMediaViewController.getHeightInSceneContainerPx();
+ }
+ final int finalWidth = width;
+ final int finalHeight = height;
mBackgroundExecutor.execute(() -> {
// Album art
ColorScheme mutableColorScheme = null;
@@ -815,7 +829,8 @@
WallpaperColors wallpaperColors = getWallpaperColor(artworkIcon);
if (wallpaperColors != null) {
mutableColorScheme = new ColorScheme(wallpaperColors, true, Style.CONTENT);
- artwork = addGradientToPlayerAlbum(artworkIcon, mutableColorScheme, width, height);
+ artwork = addGradientToPlayerAlbum(artworkIcon, mutableColorScheme, finalWidth,
+ finalHeight);
isArtworkBound = true;
} else {
// If there's no artwork, use colors from the app icon
@@ -857,8 +872,10 @@
TransitionDrawable transitionDrawable = new TransitionDrawable(
new Drawable[]{mPrevArtwork, artwork});
- scaleTransitionDrawableLayer(transitionDrawable, 0, width, height);
- scaleTransitionDrawableLayer(transitionDrawable, 1, width, height);
+ scaleTransitionDrawableLayer(transitionDrawable, 0, finalWidth,
+ finalHeight);
+ scaleTransitionDrawableLayer(transitionDrawable, 1, finalWidth,
+ finalHeight);
transitionDrawable.setLayerGravity(0, Gravity.CENTER);
transitionDrawable.setLayerGravity(1, Gravity.CENTER);
transitionDrawable.setCrossFadeEnabled(true);
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 9d6e9b4..0385aeb 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
@@ -43,6 +43,7 @@
import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.res.R
@@ -108,6 +109,7 @@
@Application private val coroutineScope: CoroutineScope,
private val splitShadeStateController: SplitShadeStateController,
private val logger: MediaViewLogger,
+ private val mediaFlags: MediaFlags,
) {
/** Track the media player setting status on lock screen. */
@@ -215,6 +217,7 @@
}
private val mediaHosts = arrayOfNulls<MediaHost>(LOCATION_COMMUNAL_HUB + 1)
+
/**
* The last location where this view was at before going to the desired location. This is useful
* for guided transitions.
@@ -458,6 +461,15 @@
// the
// location of the previous state to still be up to date when the animation
// starts
+ if (
+ newState == StatusBarState.SHADE_LOCKED &&
+ oldState == StatusBarState.KEYGUARD &&
+ fullShadeTransitionProgress < 1.0f
+ ) {
+ // Since the new state is SHADE_LOCKED, we need to set the transition amount
+ // to maximum if the progress is not 1f.
+ setTransitionToFullShadeAmount(distanceForFullShadeTransition.toFloat())
+ }
statusbarState = newState
updateDesiredLocation()
}
@@ -1041,6 +1053,17 @@
private fun updateHostAttachment() =
traceSection("MediaHierarchyManager#updateHostAttachment") {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ // No need to manage transition states - just update the desired location directly
+ logger.logMediaHostAttachment(desiredLocation)
+ mediaCarouselController.onDesiredLocationChanged(
+ desiredLocation = desiredLocation,
+ desiredHostState = getHost(desiredLocation),
+ animate = false,
+ )
+ return
+ }
+
var newLocation = resolveLocationForFading()
// Don't use the overlay when fading or when we don't have active media
var canUseOverlay = !isCurrentlyFading() && hasActiveMediaOrRecommendation
@@ -1124,6 +1147,7 @@
(!bypassController.bypassEnabled && (statusbarState == StatusBarState.KEYGUARD))
val location =
when {
+ mediaFlags.isSceneContainerEnabled() -> desiredLocation
dreamOverlayActive && dreamMediaComplicationActive -> LOCATION_DREAM_OVERLAY
(qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS
qsExpansion > 0.4f && onLockscreen -> LOCATION_QS
@@ -1282,7 +1306,7 @@
MediaHierarchyManager.LOCATION_QQS,
MediaHierarchyManager.LOCATION_LOCKSCREEN,
MediaHierarchyManager.LOCATION_DREAM_OVERLAY,
- MediaHierarchyManager.LOCATION_COMMUNAL_HUB
+ MediaHierarchyManager.LOCATION_COMMUNAL_HUB,
]
)
@Retention(AnnotationRetention.SOURCE)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
index d277f32..a99c51c2 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaViewController.kt
@@ -28,6 +28,7 @@
import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.res.R
import com.android.systemui.statusbar.policy.ConfigurationController
+import com.android.systemui.util.animation.MeasurementInput
import com.android.systemui.util.animation.MeasurementOutput
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.animation.TransitionLayoutController
@@ -207,6 +208,10 @@
var isGutsVisible = false
private set
+ /** Size provided by the scene framework container */
+ var widthInSceneContainerPx = 0
+ var heightInSceneContainerPx = 0
+
init {
mediaHostStatesManager.addController(this)
layoutController.sizeChangedListener = { width: Int, height: Int ->
@@ -420,6 +425,10 @@
state: MediaHostState?,
isGutsAnimation: Boolean = false
): TransitionViewState? {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ return obtainSceneContainerViewState()
+ }
+
if (state == null || state.measurementInput == null) {
return null
}
@@ -670,6 +679,24 @@
refreshState()
}
+ /** Get a view state based on the width and height set by the scene */
+ private fun obtainSceneContainerViewState(): TransitionViewState? {
+ logger.logMediaSize("scene container", widthInSceneContainerPx, heightInSceneContainerPx)
+
+ // Similar to obtainViewState: Let's create a new measurement
+ val result =
+ transitionLayout?.calculateViewState(
+ MeasurementInput(widthInSceneContainerPx, heightInSceneContainerPx),
+ expandedLayout,
+ TransitionViewState()
+ )
+ result?.let {
+ // And then ensure the guts visibility is set correctly
+ setGutsViewState(it)
+ }
+ return result
+ }
+
/**
* Retrieves the [TransitionViewState] and [MediaHostState] of a [@MediaLocation]. In the event
* of [location] not being visible, [locationWhenHidden] will be used instead.
@@ -681,6 +708,10 @@
*/
private fun obtainViewStateForLocation(@MediaLocation location: Int): TransitionViewState? {
val mediaHostState = mediaHostStatesManager.mediaHostStates[location] ?: return null
+ if (mediaFlags.isSceneContainerEnabled()) {
+ return obtainSceneContainerViewState()
+ }
+
val viewState = obtainViewState(mediaHostState)
if (viewState != null) {
// update the size of the viewstate for the location with the override
@@ -708,6 +739,21 @@
/** Clear all existing measurements and refresh the state to match the view. */
fun refreshState() =
traceSection("MediaViewController#refreshState") {
+ if (mediaFlags.isSceneContainerEnabled()) {
+ // We don't need to recreate measurements for scene container, since it's a known
+ // size. Just get the view state and update the layout controller
+ obtainSceneContainerViewState()?.let {
+ // Get scene container state, then setCurrentState
+ layoutController.setState(
+ state = it,
+ applyImmediately = true,
+ animate = false,
+ isGuts = false,
+ )
+ }
+ return
+ }
+
// Let's clear all of our measurements and recreate them!
viewStates.clear()
if (firstRefresh) {
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
index 44232ff..15747b9 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaFlags.kt
@@ -55,7 +55,7 @@
/** Check whether we allow remote media to generate resume controls */
fun isRemoteResumeAllowed() = featureFlags.isEnabled(Flags.MEDIA_REMOTE_RESUME)
- /** Check whether to use flexiglass layout */
- fun isFlexiglassEnabled() =
+ /** Check whether to use scene framework */
+ fun isSceneContainerEnabled() =
sceneContainerFlags.isEnabled() && MediaInSceneContainerFlag.isEnabled
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index e2e94da..0a72a2f 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -400,8 +400,8 @@
}
@Override
- public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
- mView.getHomeHandle().animateLongPress(isTouchDown, durationMs);
+ public void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
+ mView.getHomeHandle().animateLongPress(isTouchDown, shrink, durationMs);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
index 5fe830e..5739abc 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
@@ -247,10 +247,10 @@
}
}
- public void animateLongPress(boolean isTouchDown, long durationMs) {
+ public void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
for (int i = 0; i < mViews.size(); i++) {
if (mViews.get(i) instanceof ButtonInterface) {
- ((ButtonInterface) mViews.get(i)).animateLongPress(isTouchDown, durationMs);
+ ((ButtonInterface) mViews.get(i)).animateLongPress(isTouchDown, shrink, durationMs);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
index 356b2f7..5f8fafd 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
@@ -35,9 +35,10 @@
* Animate the button being long-pressed.
*
* @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
- * released or canceled)
- * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
- * should be the same as the amount of time to trigger a long-press)
+ * released or canceled)
+ * @param shrink {@code true} if the handle should shrink, {@code false} if it should grow
+ * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
+ * should be the same as the amount of time to trigger a long-press)
*/
- default void animateLongPress(boolean isTouchDown, long durationMs) {}
+ default void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
index 5bfc7dc..d1ce1f6 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
@@ -44,7 +44,9 @@
protected final float mBottom;
private final float mAdditionalWidthForAnimation;
private final float mAdditionalHeightForAnimation;
+ private final float mShrinkWidthForAnimation;
private boolean mRequiresInvalidate;
+ private boolean mShrink;
private ObjectAnimator mPulseAnimator = null;
private float mPulseAnimationProgress;
@@ -75,6 +77,8 @@
res.getDimension(R.dimen.navigation_home_handle_additional_width_for_animation);
mAdditionalHeightForAnimation =
res.getDimension(R.dimen.navigation_home_handle_additional_height_for_animation);
+ mShrinkWidthForAnimation =
+ res.getDimension(R.dimen.navigation_home_handle_shrink_width_for_animation);
final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme);
final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme);
@@ -101,12 +105,20 @@
// Draw that bar
int navHeight = getHeight();
- float additionalHeight = mAdditionalHeightForAnimation * mPulseAnimationProgress;
+ float additionalHeight;
+ float additionalWidth;
+ if (mShrink) {
+ additionalHeight = 0;
+ additionalWidth = -mShrinkWidthForAnimation * mPulseAnimationProgress;
+ } else {
+ additionalHeight = mAdditionalHeightForAnimation * mPulseAnimationProgress;
+ additionalWidth = mAdditionalWidthForAnimation * mPulseAnimationProgress;
+ }
+
float height = mRadius * 2 + additionalHeight;
- float additionalWidth = mAdditionalWidthForAnimation * mPulseAnimationProgress;
float width = getWidth() + additionalWidth;
- float x = -(additionalWidth / 2);
- float y = navHeight - mBottom - height - (additionalHeight / 2);
+ float x = -additionalWidth;
+ float y = navHeight - mBottom - height + (additionalHeight / 2);
float adjustedRadius = height / 2;
canvas.drawRoundRect(x, y, width, y + height, adjustedRadius, adjustedRadius, mPaint);
}
@@ -138,26 +150,32 @@
public void setDelayTouchFeedback(boolean shouldDelay) {}
@Override
- public void animateLongPress(boolean isTouchDown, long durationMs) {
+ public void animateLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
if (mPulseAnimator != null) {
mPulseAnimator.cancel();
}
+ mShrink = shrink;
Interpolator interpolator;
- if (isTouchDown) {
- // For now we animate the navbar expanding and contracting so that the navbar is the
- // original size by the end of {@code duration}. This is because a screenshot is taken
- // at that point and we don't want to capture the larger navbar.
- // TODO(b/306400785): Determine a way to exclude navbar from the screenshot.
+ if (shrink) {
+ interpolator = Interpolators.LEGACY_DECELERATE;
+ } else {
+ if (isTouchDown) {
+ // For now we animate the navbar expanding and contracting so that the navbar is
+ // the original size by the end of {@code duration}. This is because a screenshot
+ // is taken at that point and we don't want to capture the larger navbar.
+ // TODO(b/306400785): Determine a way to exclude navbar from the screenshot.
- // Fraction of the touch down animation to expand; remaining is used to contract again.
- float expandFraction = 0.9f;
- interpolator = t -> t <= expandFraction
+ // Fraction of the touch down animation to expand; remaining is used to contract
+ // again.
+ float expandFraction = 0.9f;
+ interpolator = t -> t <= expandFraction
? Interpolators.clampToProgress(Interpolators.LEGACY, t, 0, expandFraction)
: 1 - Interpolators.clampToProgress(
Interpolators.LINEAR, t, expandFraction, 1);
- } else {
- interpolator = Interpolators.LEGACY_DECELERATE;
+ } else {
+ interpolator = Interpolators.LEGACY_DECELERATE;
+ }
}
mPulseAnimator =
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index 3884184..0cb695c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -171,6 +171,7 @@
public void onRtlChanged() {
updateAnimators();
+ setCurrentPosition();
}
/**
@@ -210,6 +211,7 @@
@Override
public void onViewAttachedToWindow(@NonNull View view) {
updateAnimators();
+ setCurrentPosition();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
index 5e19439..9fe316f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt
@@ -17,6 +17,7 @@
package com.android.systemui.qs.tiles.base.viewmodel
import android.os.UserHandle
+import com.android.systemui.Dumpable
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger
@@ -34,6 +35,7 @@
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.throttle
import com.android.systemui.util.time.SystemClock
+import java.io.PrintWriter
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -81,7 +83,7 @@
private val systemClock: SystemClock,
private val backgroundDispatcher: CoroutineDispatcher,
private val tileScope: CoroutineScope = CoroutineScope(SupervisorJob()),
-) : QSTileViewModel {
+) : QSTileViewModel, Dumpable {
private val users: MutableStateFlow<UserHandle> =
MutableStateFlow(userRepository.getSelectedUserInfo().userHandle)
@@ -137,6 +139,13 @@
tileScope.cancel()
}
+ override fun dump(pw: PrintWriter, args: Array<out String>) =
+ with(pw) {
+ println("${config.tileSpec.spec}:")
+ print(" ")
+ println(state.replayCache.lastOrNull().toString())
+ }
+
private fun createTileDataFlow(): SharedFlow<DATA_TYPE> =
users
.flatMapLatest { user ->
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
index e8623f9..977df81 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt
@@ -22,6 +22,7 @@
import android.view.View
import androidx.annotation.GuardedBy
import com.android.internal.logging.InstanceId
+import com.android.systemui.Dumpable
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.qs.QSTile
@@ -31,6 +32,7 @@
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import java.io.PrintWriter
import java.util.function.Supplier
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -47,7 +49,7 @@
@Application private val applicationScope: CoroutineScope,
private val qsHost: QSHost,
@Assisted private val qsTileViewModel: QSTileViewModel,
-) : QSTile {
+) : QSTile, Dumpable {
private val context
get() = qsHost.context
@@ -201,6 +203,10 @@
override fun getTileSpec(): String = qsTileViewModel.config.tileSpec.spec
+ override fun dump(pw: PrintWriter, args: Array<out String>) =
+ (qsTileViewModel as? Dumpable)?.dump(pw, args)
+ ?: pw.println("${getTileSpec()}: QSTileViewModel isn't dumpable")
+
private companion object {
const val DEBUG = false
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
index b4340f5..ce840ee 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
@@ -19,7 +19,6 @@
import android.content.Context
import android.os.Bundle
import android.view.View
-import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.asynclayoutinflater.view.AsyncLayoutInflater
import com.android.systemui.dagger.SysUISingleton
@@ -30,6 +29,10 @@
import com.android.systemui.qs.dagger.QSSceneComponent
import com.android.systemui.res.R
import com.android.systemui.util.kotlin.sample
+import javax.inject.Inject
+import javax.inject.Provider
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
@@ -40,10 +43,6 @@
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import javax.inject.Inject
-import javax.inject.Provider
-import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
// TODO(307945185) Split View concerns into a ViewBinder
/** Adapter to use between Scene system and [QSImpl] */
@@ -61,9 +60,9 @@
* Inflate an instance of [QSImpl] for this context. Once inflated, it will be available in
* [qsView]
*/
- suspend fun inflate(context: Context, parent: ViewGroup? = null)
+ suspend fun inflate(context: Context)
- /** Set the current state for QS. [state] must not be [State.INITIAL]. */
+ /** Set the current state for QS. [state]. */
fun setState(state: State)
sealed class State(
@@ -71,8 +70,15 @@
val expansion: Float,
) {
data object CLOSED : State(false, 0f)
- data object QQS : State(true, 0f)
- data object QS : State(true, 1f)
+ data class Expanding(val progress: Float) : State(true, progress)
+
+ companion object {
+ // These are special cases of the expansion.
+ val QQS = Expanding(0f)
+ val QS = Expanding(1f)
+
+ fun Collapsing(progress: Float) = Expanding(1f - progress)
+ }
}
}
@@ -128,11 +134,11 @@
override fun setDetailShowing(showing: Boolean) {}
- override suspend fun inflate(context: Context, parent: ViewGroup?) {
+ override suspend fun inflate(context: Context) {
withContext(mainDispatcher) {
val inflater = asyncLayoutInflaterFactory(context)
val view = suspendCoroutine { continuation ->
- inflater.inflate(R.layout.qs_panel, parent) { view, _, _ ->
+ inflater.inflate(R.layout.qs_panel, null) { view, _, _ ->
continuation.resume(view)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 377803f..45917e8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -248,9 +248,9 @@
}
@Override
- public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
+ public void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {
verifyCallerAndClearCallingIdentityPostMain("animateNavBarLongPress", () ->
- notifyAnimateNavBarLongPress(isTouchDown, durationMs));
+ notifyAnimateNavBarLongPress(isTouchDown, shrink, durationMs));
}
@Override
@@ -929,9 +929,10 @@
}
}
- private void notifyAnimateNavBarLongPress(boolean isTouchDown, long durationMs) {
+ private void notifyAnimateNavBarLongPress(boolean isTouchDown, boolean shrink,
+ long durationMs) {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
- mConnectionCallbacks.get(i).animateNavBarLongPress(isTouchDown, durationMs);
+ mConnectionCallbacks.get(i).animateNavBarLongPress(isTouchDown, shrink, durationMs);
}
}
@@ -1079,7 +1080,7 @@
default void onAssistantGestureCompletion(float velocity) {}
default void startAssistant(Bundle bundle) {}
default void setAssistantOverridesRequested(int[] invocationTypes) {}
- default void animateNavBarLongPress(boolean isTouchDown, long durationMs) {}
+ default void animateNavBarLongPress(boolean isTouchDown, boolean shrink, long durationMs) {}
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
index bff0b93..62d8fb9 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java
@@ -177,7 +177,8 @@
activityStarter,
mUserContextProvider,
onStartRecordingClicked,
- mMediaProjectionMetricsLogger))
+ mMediaProjectionMetricsLogger,
+ mDialogFactory))
: new ScreenRecordDialog(
context,
/* controller= */ this,
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
index 3f6c58d..10d51a5 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt
@@ -28,6 +28,7 @@
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
+import android.view.accessibility.AccessibilityNodeInfo
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
@@ -54,6 +55,7 @@
private val userContextProvider: UserContextProvider,
private val onStartRecordingClicked: Runnable?,
mediaProjectionMetricsLogger: MediaProjectionMetricsLogger,
+ private val systemUIDialogFactory: SystemUIDialog.Factory
) :
BaseMediaProjectionPermissionDialogDelegate<SystemUIDialog>(
createOptionList(),
@@ -62,14 +64,18 @@
mediaProjectionMetricsLogger,
R.drawable.ic_screenrecord,
R.color.screenrecord_icon_color
- ) {
+ ), SystemUIDialog.Delegate {
private lateinit var tapsSwitch: Switch
private lateinit var tapsView: View
private lateinit var audioSwitch: Switch
private lateinit var options: Spinner
+ override fun createDialog(): SystemUIDialog {
+ return systemUIDialogFactory.create(this)
+ }
+
override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
- super.onCreate(dialog, savedInstanceState)
+ super<BaseMediaProjectionPermissionDialogDelegate>.onCreate(dialog, savedInstanceState)
setDialogTitle(R.string.screenrecord_permission_dialog_title)
dialog.setTitle(R.string.screenrecord_title)
setStartButtonText(R.string.screenrecord_permission_dialog_continue)
@@ -129,6 +135,19 @@
options.setOnItemClickListenerInt { _: AdapterView<*>?, _: View?, _: Int, _: Long ->
audioSwitch.isChecked = true
}
+
+ // disable redundant Touch & Hold accessibility action for Switch Access
+ options.accessibilityDelegate =
+ object : View.AccessibilityDelegate() {
+ override fun onInitializeAccessibilityNodeInfo(
+ host: View,
+ info: AccessibilityNodeInfo
+ ) {
+ info.removeAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK)
+ super.onInitializeAccessibilityNodeInfo(host, info)
+ }
+ }
+ options.isLongClickable = false
}
override fun onItemSelected(adapterView: AdapterView<*>?, view: View, pos: Int, id: Long) {
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 67ec03f..fa3e172 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -130,6 +130,7 @@
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewConfigurator;
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
@@ -542,6 +543,7 @@
private final NPVCDownEventState.Buffer mLastDownEvents;
private final KeyguardBottomAreaViewModel mKeyguardBottomAreaViewModel;
private final KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
+ private final KeyguardClockInteractor mKeyguardClockInteractor;
private float mMinExpandHeight;
private boolean mPanelUpdateWhenAnimatorEnds;
private boolean mHasVibratedOnOpen = false;
@@ -561,7 +563,6 @@
private boolean mHasLayoutedSinceDown;
private float mUpdateFlingVelocity;
private boolean mUpdateFlingOnLayout;
- private boolean mClosing;
private boolean mTouchSlopExceeded;
private int mTrackingPointer;
private int mTouchSlop;
@@ -615,10 +616,8 @@
private boolean mIsOcclusionTransitionRunning = false;
private boolean mIsGoneToDreamingLockscreenHostedTransitionRunning;
private int mDreamingToLockscreenTransitionTranslationY;
- private int mOccludedToLockscreenTransitionTranslationY;
private int mLockscreenToDreamingTransitionTranslationY;
private int mGoneToDreamingTransitionTranslationY;
- private int mLockscreenToOccludedTransitionTranslationY;
private SplitShadeStateController mSplitShadeStateController;
private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */,
mNextCollapseSpeedUpFactor, false /* expandBecauseOfFalsing */);
@@ -760,6 +759,7 @@
SystemClock systemClock,
KeyguardBottomAreaViewModel keyguardBottomAreaViewModel,
KeyguardBottomAreaInteractor keyguardBottomAreaInteractor,
+ KeyguardClockInteractor keyguardClockInteractor,
AlternateBouncerInteractor alternateBouncerInteractor,
DreamingToLockscreenTransitionViewModel dreamingToLockscreenTransitionViewModel,
OccludedToLockscreenTransitionViewModel occludedToLockscreenTransitionViewModel,
@@ -964,6 +964,7 @@
updateUserSwitcherFlags();
mKeyguardBottomAreaViewModel = keyguardBottomAreaViewModel;
mKeyguardBottomAreaInteractor = keyguardBottomAreaInteractor;
+ mKeyguardClockInteractor = keyguardClockInteractor;
KeyguardLongPressViewBinder.bind(
mView.requireViewById(R.id.keyguard_long_press),
keyguardLongPressViewModel,
@@ -1157,11 +1158,13 @@
// Occluded->Lockscreen
collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(),
mOccludedToLockscreenTransition, mMainDispatcher);
- collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(),
+ if (!KeyguardShadeMigrationNssl.isEnabled()) {
+ collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(),
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
- collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(
- mOccludedToLockscreenTransitionTranslationY),
- setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
+ collectFlow(mView,
+ mOccludedToLockscreenTransitionViewModel.getLockscreenTranslationY(),
+ setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
+ }
// Lockscreen->Dreaming
collectFlow(mView, mKeyguardTransitionInteractor.getLockscreenToDreamingTransition(),
@@ -1187,8 +1190,7 @@
mLockscreenToOccludedTransition, mMainDispatcher);
collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha(),
setTransitionAlpha(mNotificationStackScrollLayoutController), mMainDispatcher);
- collectFlow(mView, mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(
- mLockscreenToOccludedTransitionTranslationY),
+ collectFlow(mView, mLockscreenToOccludedTransitionViewModel.getLockscreenTranslationY(),
setTransitionY(mNotificationStackScrollLayoutController), mMainDispatcher);
// Primary bouncer->Gone (ensures lockscreen content is not visible on successful auth)
@@ -1220,14 +1222,10 @@
R.dimen.split_shade_scrim_transition_distance);
mDreamingToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize(
R.dimen.dreaming_to_lockscreen_transition_lockscreen_translation_y);
- mOccludedToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize(
- R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y);
mLockscreenToDreamingTransitionTranslationY = mResources.getDimensionPixelSize(
R.dimen.lockscreen_to_dreaming_transition_lockscreen_translation_y);
mGoneToDreamingTransitionTranslationY = mResources.getDimensionPixelSize(
R.dimen.gone_to_dreaming_transition_lockscreen_translation_y);
- mLockscreenToOccludedTransitionTranslationY = mResources.getDimensionPixelSize(
- R.dimen.lockscreen_to_occluded_transition_lockscreen_translation_y);
// TODO (b/265193930): remove this and make QsController listen to NotificationPanelViews
mQsController.loadDimens();
}
@@ -1610,7 +1608,7 @@
boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled();
boolean shouldAnimateClockChange = mScreenOffAnimationController.shouldAnimateClockChange();
if (mFeatureFlags.isEnabled(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT)) {
- mKeyguardInteractor.setClockSize(computeDesiredClockSize());
+ mKeyguardClockInteractor.setClockSize(computeDesiredClockSize());
} else {
mKeyguardStatusViewController.displayClock(computeDesiredClockSize(),
shouldAnimateClockChange);
@@ -2935,10 +2933,7 @@
@VisibleForTesting
void setClosing(boolean isClosing) {
- if (mClosing != isClosing) {
- mClosing = isClosing;
- mShadeExpansionStateManager.notifyPanelCollapsingChanged(isClosing);
- }
+ mShadeRepository.setLegacyIsClosing(isClosing);
mAmbientState.setIsClosing(isClosing);
}
@@ -3469,7 +3464,7 @@
ipw.print("mHasLayoutedSinceDown="); ipw.println(mHasLayoutedSinceDown);
ipw.print("mUpdateFlingVelocity="); ipw.println(mUpdateFlingVelocity);
ipw.print("mUpdateFlingOnLayout="); ipw.println(mUpdateFlingOnLayout);
- ipw.print("mClosing="); ipw.println(mClosing);
+ ipw.print("isClosing()="); ipw.println(isClosing());
ipw.print("mTouchSlopExceeded="); ipw.println(mTouchSlopExceeded);
ipw.print("mTrackingPointer="); ipw.println(mTrackingPointer);
ipw.print("mTouchSlop="); ipw.println(mTouchSlop);
@@ -3808,7 +3803,7 @@
}
private void endClosing() {
- if (mClosing) {
+ if (isClosing()) {
setClosing(false);
onClosingFinished();
}
@@ -3928,7 +3923,7 @@
mExpandedHeight = Math.min(h, maxPanelHeight);
// If we are closing the panel and we are almost there due to a slow decelerating
// interpolator, abort the animation.
- if (mExpandedHeight < 1f && mExpandedHeight != 0f && mClosing) {
+ if (mExpandedHeight < 1f && mExpandedHeight != 0f && isClosing()) {
mExpandedHeight = 0f;
if (mHeightAnimator != null) {
mHeightAnimator.end();
@@ -4003,7 +3998,7 @@
@Override
public boolean isCollapsing() {
- return mClosing || mIsLaunchAnimationRunning;
+ return isClosing() || mIsLaunchAnimationRunning;
}
public boolean isTracking() {
@@ -4012,7 +4007,7 @@
@Override
public boolean canBeCollapsed() {
- return !isFullyCollapsed() && !isTracking() && !mClosing;
+ return !isFullyCollapsed() && !isTracking() && !isClosing();
}
@Override
@@ -4127,7 +4122,7 @@
@VisibleForTesting
boolean isClosing() {
- return mClosing;
+ return mShadeRepository.getLegacyIsClosing().getValue();
}
@Override
@@ -4834,15 +4829,17 @@
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
- mCentralSurfaces.userActivity();
+ if (!KeyguardShadeMigrationNssl.isEnabled()) {
+ mCentralSurfaces.userActivity();
+ }
mAnimatingOnDown = mHeightAnimator != null && !mIsSpringBackAnimation;
mMinExpandHeight = 0.0f;
mDownTime = mSystemClock.uptimeMillis();
- if (mAnimatingOnDown && mClosing) {
+ if (mAnimatingOnDown && isClosing()) {
cancelHeightAnimator();
mTouchSlopExceeded = true;
mShadeLog.v("NotificationPanelViewController MotionEvent intercepted:"
- + " mAnimatingOnDown: true, mClosing: true");
+ + " mAnimatingOnDown: true, isClosing(): true");
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
index cf1dfdc..73537ed 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java
@@ -311,6 +311,9 @@
mTouchActive = true;
mTouchCancelled = false;
mDownEvent = ev;
+ if (KeyguardShadeMigrationNssl.isEnabled()) {
+ mService.userActivity();
+ }
} else if (ev.getActionMasked() == MotionEvent.ACTION_UP
|| ev.getActionMasked() == MotionEvent.ACTION_CANCEL) {
mTouchActive = false;
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeEmptyImplModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeEmptyImplModule.kt
index 53eccfd..832fefc 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeEmptyImplModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeEmptyImplModule.kt
@@ -17,6 +17,8 @@
package com.android.systemui.shade
import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractorEmptyImpl
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.domain.interactor.ShadeInteractorEmptyImpl
import dagger.Binds
@@ -36,4 +38,10 @@
@Binds
@SysUISingleton
abstract fun bindsShadeInteractor(si: ShadeInteractorEmptyImpl): ShadeInteractor
+
+ @Binds
+ @SysUISingleton
+ abstract fun bindsShadeAnimationInteractor(
+ sai: ShadeAnimationInteractorEmptyImpl
+ ): ShadeAnimationInteractor
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
index e20534c..d6db19e 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt
@@ -163,12 +163,6 @@
}
}
- fun notifyPanelCollapsingChanged(isCollapsing: Boolean) {
- for (cb in shadeStateEventsListeners) {
- cb.onPanelCollapsingChanged(isCollapsing)
- }
- }
-
private fun debugLog(msg: String) {
if (!DEBUG) return
Log.v(TAG, msg)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
index 54467cf..d9b298d 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt
@@ -19,6 +19,9 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.scene.shared.flag.SceneContainerFlags
import com.android.systemui.shade.domain.interactor.BaseShadeInteractor
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractorLegacyImpl
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractorSceneContainerImpl
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.domain.interactor.ShadeInteractorImpl
import com.android.systemui.shade.domain.interactor.ShadeInteractorLegacyImpl
@@ -45,6 +48,20 @@
sceneContainerOff.get()
}
}
+
+ @Provides
+ @SysUISingleton
+ fun provideShadeAnimationInteractor(
+ sceneContainerFlags: SceneContainerFlags,
+ sceneContainerOn: Provider<ShadeAnimationInteractorSceneContainerImpl>,
+ sceneContainerOff: Provider<ShadeAnimationInteractorLegacyImpl>
+ ): ShadeAnimationInteractor {
+ return if (sceneContainerFlags.isEnabled()) {
+ sceneContainerOn.get()
+ } else {
+ sceneContainerOff.get()
+ }
+ }
}
@Binds
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt
index c8511d7..ff96ca3c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt
@@ -27,10 +27,6 @@
/** Callbacks for certain notification panel events. */
interface ShadeStateEventsListener {
-
- /** Invoked when the notification panel starts or stops collapsing. */
- fun onPanelCollapsingChanged(isCollapsing: Boolean) {}
-
/**
* Invoked when the notification panel starts or stops launching an [android.app.Activity].
*/
diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
index 47b08fe..e94a3eb 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt
@@ -105,6 +105,12 @@
/** True when QS is taking up the entire screen, i.e. fully expanded on a non-unfolded phone. */
@Deprecated("Use ShadeInteractor instead") val legacyQsFullscreen: StateFlow<Boolean>
+ /** NPVC.mClosing as a flow. */
+ @Deprecated("Use ShadeAnimationInteractor instead") val legacyIsClosing: StateFlow<Boolean>
+
+ /** Sets whether a closing animation is happening. */
+ @Deprecated("Use ShadeAnimationInteractor instead") fun setLegacyIsClosing(isClosing: Boolean)
+
/** */
@Deprecated("Use ShadeInteractor instead")
fun setLegacyQsFullscreen(legacyQsFullscreen: Boolean)
@@ -261,6 +267,15 @@
_legacyShadeTracking.value = tracking
}
+ private val _legacyIsClosing = MutableStateFlow(false)
+ @Deprecated("Use ShadeInteractor instead")
+ override val legacyIsClosing: StateFlow<Boolean> = _legacyIsClosing.asStateFlow()
+
+ @Deprecated("Use ShadeInteractor instead")
+ override fun setLegacyIsClosing(isClosing: Boolean) {
+ _legacyIsClosing.value = isClosing
+ }
+
@Deprecated("Should only be called by NPVC and tests")
override fun setLegacyLockscreenShadeTracking(tracking: Boolean) {
legacyLockscreenShadeTracking.value = tracking
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt
new file mode 100644
index 0000000..ff422b7
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractor.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.shade.domain.interactor
+
+import kotlinx.coroutines.flow.Flow
+
+/** Business logic related to shade animations and transitions. */
+interface ShadeAnimationInteractor {
+ /**
+ * Whether a short animation to close the shade or QS is running. This will be false if the user
+ * is manually closing the shade or QS but true if they lift their finger and an animation
+ * completes the close. Important: if QS is collapsing back to shade, this will be false because
+ * that is not considered "closing".
+ */
+ val isAnyCloseAnimationRunning: Flow<Boolean>
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt
new file mode 100644
index 0000000..b4a134f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorEmptyImpl.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.shade.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import javax.inject.Inject
+import kotlinx.coroutines.flow.flowOf
+
+/** Implementation of ShadeAnimationInteractor for shadeless SysUI variants. */
+@SysUISingleton
+class ShadeAnimationInteractorEmptyImpl @Inject constructor() : ShadeAnimationInteractor {
+ override val isAnyCloseAnimationRunning = flowOf(false)
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt
new file mode 100644
index 0000000..d514093
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorLegacyImpl.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.shade.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.shade.data.repository.ShadeRepository
+import javax.inject.Inject
+
+/** Implementation of ShadeAnimationInteractor compatible with NPVC. */
+@SysUISingleton
+class ShadeAnimationInteractorLegacyImpl
+@Inject
+constructor(
+ shadeRepository: ShadeRepository,
+) : ShadeAnimationInteractor {
+ override val isAnyCloseAnimationRunning = shadeRepository.legacyIsClosing
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt
new file mode 100644
index 0000000..7c0762d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImpl.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.shade.domain.interactor
+
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.model.ObservableTransitionState
+import com.android.systemui.scene.shared.model.SceneKey
+import javax.inject.Inject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.map
+
+/** Implementation of ShadeAnimationInteractor compatible with the scene container framework. */
+@SysUISingleton
+class ShadeAnimationInteractorSceneContainerImpl
+@Inject
+constructor(
+ sceneInteractor: SceneInteractor,
+) : ShadeAnimationInteractor {
+ @OptIn(ExperimentalCoroutinesApi::class)
+ override val isAnyCloseAnimationRunning =
+ sceneInteractor.transitionState
+ .flatMapLatest { state ->
+ when (state) {
+ is ObservableTransitionState.Idle -> flowOf(false)
+ is ObservableTransitionState.Transition ->
+ if (
+ (state.fromScene == SceneKey.Shade &&
+ state.toScene != SceneKey.QuickSettings) ||
+ (state.fromScene == SceneKey.QuickSettings &&
+ state.toScene != SceneKey.Shade)
+ ) {
+ state.isUserInputOngoing.map { !it }
+ } else {
+ flowOf(false)
+ }
+ }
+ }
+ .distinctUntilChanged()
+}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
index 6a9757f..31a4de4 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractor.kt
@@ -39,7 +39,7 @@
* input (i.e. dragging a pointer). This will be true even if the user's input gesture had ended
* but a transition they initiated is still animating.
*/
- val isUserInteracting: Flow<Boolean>
+ val isUserInteracting: StateFlow<Boolean>
/** Are touches allowed on the notification panel? */
val isShadeTouchable: Flow<Boolean>
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
index d41c5a6..6defbcf 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorEmptyImpl.kt
@@ -39,7 +39,7 @@
override val isAnyExpanded: StateFlow<Boolean> = inactiveFlowBoolean
override val isUserInteractingWithShade: Flow<Boolean> = inactiveFlowBoolean
override val isUserInteractingWithQs: Flow<Boolean> = inactiveFlowBoolean
- override val isUserInteracting: Flow<Boolean> = inactiveFlowBoolean
+ override val isUserInteracting: StateFlow<Boolean> = inactiveFlowBoolean
override val isShadeTouchable: Flow<Boolean> = inactiveFlowBoolean
override val isExpandToQsEnabled: Flow<Boolean> = inactiveFlowBoolean
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
index 68600e9..7a340d2 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorImpl.kt
@@ -65,9 +65,10 @@
override val isShadeFullyExpanded: Flow<Boolean> =
baseShadeInteractor.shadeExpansion.map { it >= 1f }.distinctUntilChanged()
- override val isUserInteracting: Flow<Boolean> =
+ override val isUserInteracting: StateFlow<Boolean> =
combine(isUserInteractingWithShade, isUserInteractingWithQs) { shade, qs -> shade || qs }
.distinctUntilChanged()
+ .stateIn(scope, SharingStarted.Eagerly, false)
override val isShadeTouchable: Flow<Boolean> =
combine(
diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
index 7cff8ea..3fd070c 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImpl.kt
@@ -71,14 +71,11 @@
override val isQsBypassingShade: Flow<Boolean> =
sceneInteractor.transitionState
- .flatMapLatest { state ->
+ .map { state ->
when (state) {
- is ObservableTransitionState.Idle -> flowOf(false)
+ is ObservableTransitionState.Idle -> false
is ObservableTransitionState.Transition ->
- flowOf(
- state.toScene == SceneKey.QuickSettings &&
- state.fromScene != SceneKey.Shade
- )
+ state.toScene == SceneKey.QuickSettings && state.fromScene != SceneKey.Shade
}
}
.distinctUntilChanged()
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
index 0065db3..d0da945 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt
@@ -19,10 +19,16 @@
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
+import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.ui.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.MediaHost
+import com.android.systemui.media.controls.ui.MediaHostState
+import com.android.systemui.media.dagger.MediaModule
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import javax.inject.Inject
+import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
@@ -39,6 +45,8 @@
val qsSceneAdapter: QSSceneAdapter,
val shadeHeaderViewModel: ShadeHeaderViewModel,
val notifications: NotificationsPlaceholderViewModel,
+ val mediaDataManager: MediaDataManager,
+ @Named(MediaModule.QUICK_QS_PANEL) private val mediaHost: MediaHost,
) {
/** The key of the scene we should switch to when swiping up. */
val upDestinationSceneKey: StateFlow<SceneKey> =
@@ -74,4 +82,15 @@
else -> SceneKey.Lockscreen
}
}
+
+ init {
+ mediaHost.expansion = MediaHostState.EXPANDED
+ mediaHost.showsOnlyActiveMedia = true
+ mediaHost.init(MediaHierarchyManager.LOCATION_QQS)
+ }
+
+ fun isMediaVisible(): Boolean {
+ // TODO(b/296122467): handle updates to carousel visibility while scene is still visible
+ return mediaDataManager.hasActiveMediaOrRecommendation()
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
index c1a630f..909cff37 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyboardShortcutListSearch.java
@@ -493,11 +493,11 @@
Arrays.asList(
Pair.create(KeyEvent.KEYCODE_SLASH, KeyEvent.META_META_ON))),
/* Back: go back to previous state (back button) */
- /* Meta + Grave, Meta + backspace, Meta + left arrow */
+ /* Meta + Escape, Meta + Grave, Meta + backspace, Meta + left arrow */
new ShortcutKeyGroupMultiMappingInfo(
context.getString(R.string.group_system_go_back),
Arrays.asList(
- Pair.create(KeyEvent.KEYCODE_GRAVE, KeyEvent.META_META_ON),
+ Pair.create(KeyEvent.KEYCODE_ESCAPE, KeyEvent.META_META_ON),
Pair.create(KeyEvent.KEYCODE_DEL, KeyEvent.META_META_ON),
Pair.create(KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.META_META_ON))),
/* Access home screen: Meta + H, Meta + Enter */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
index a2379b2..46e2391 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java
@@ -29,6 +29,7 @@
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shade.ShadeStateEvents;
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.ListEntry;
@@ -39,6 +40,7 @@
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.Compile;
import com.android.systemui.util.concurrency.DelayableExecutor;
+import com.android.systemui.util.kotlin.JavaAdapter;
import java.io.PrintWriter;
import java.util.HashMap;
@@ -62,7 +64,9 @@
private final DelayableExecutor mDelayableExecutor;
private final HeadsUpManager mHeadsUpManager;
private final ShadeStateEvents mShadeStateEvents;
+ private final ShadeAnimationInteractor mShadeAnimationInteractor;
private final StatusBarStateController mStatusBarStateController;
+ private final JavaAdapter mJavaAdapter;
private final VisibilityLocationProvider mVisibilityLocationProvider;
private final VisualStabilityProvider mVisualStabilityProvider;
private final WakefulnessLifecycle mWakefulnessLifecycle;
@@ -95,11 +99,15 @@
DumpManager dumpManager,
HeadsUpManager headsUpManager,
ShadeStateEvents shadeStateEvents,
+ ShadeAnimationInteractor shadeAnimationInteractor,
+ JavaAdapter javaAdapter,
StatusBarStateController statusBarStateController,
VisibilityLocationProvider visibilityLocationProvider,
VisualStabilityProvider visualStabilityProvider,
WakefulnessLifecycle wakefulnessLifecycle) {
mHeadsUpManager = headsUpManager;
+ mShadeAnimationInteractor = shadeAnimationInteractor;
+ mJavaAdapter = javaAdapter;
mVisibilityLocationProvider = visibilityLocationProvider;
mVisualStabilityProvider = visualStabilityProvider;
mWakefulnessLifecycle = wakefulnessLifecycle;
@@ -119,6 +127,8 @@
mStatusBarStateController.addCallback(mStatusBarStateControllerListener);
mPulsing = mStatusBarStateController.isPulsing();
mShadeStateEvents.addShadeStateEventsListener(this);
+ mJavaAdapter.alwaysCollectFlow(mShadeAnimationInteractor.isAnyCloseAnimationRunning(),
+ this::onShadeOrQsClosingChanged);
pipeline.setVisualStabilityManager(mNotifStabilityManager);
}
@@ -322,10 +332,9 @@
}
}
- @Override
- public void onPanelCollapsingChanged(boolean isCollapsing) {
- mNotifPanelCollapsing = isCollapsing;
- updateAllowedStates("notifPanelCollapsing", isCollapsing);
+ private void onShadeOrQsClosingChanged(boolean isClosing) {
+ mNotifPanelCollapsing = isClosing;
+ updateAllowedStates("notifPanelCollapsing", isClosing);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
index 3184d5e..3616fd6d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java
@@ -18,6 +18,8 @@
import static android.graphics.PorterDuff.Mode.SRC_ATOP;
+import static com.android.systemui.Flags.notificationBackgroundTintOptimization;
+
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.StringRes;
@@ -313,15 +315,16 @@
Resources.Theme theme = mContext.getTheme();
final @ColorInt int onSurface = Utils.getColorAttrDefaultColor(mContext,
com.android.internal.R.attr.materialColorOnSurface);
- final @ColorInt int scHigh = Utils.getColorAttrDefaultColor(mContext,
- com.android.internal.R.attr.materialColorSurfaceContainerHigh);
final Drawable clearAllBg = theme.getDrawable(R.drawable.notif_footer_btn_background);
final Drawable manageBg = theme.getDrawable(R.drawable.notif_footer_btn_background);
- // TODO(b/282173943): Remove redundant tinting once Resources are thread-safe
- final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP);
- if (scHigh != 0) {
- clearAllBg.setColorFilter(bgColorFilter);
- manageBg.setColorFilter(bgColorFilter);
+ if (!notificationBackgroundTintOptimization()) {
+ final @ColorInt int scHigh = Utils.getColorAttrDefaultColor(mContext,
+ com.android.internal.R.attr.materialColorSurfaceContainerHigh);
+ if (scHigh != 0) {
+ final ColorFilter bgColorFilter = new PorterDuffColorFilter(scHigh, SRC_ATOP);
+ clearAllBg.setColorFilter(bgColorFilter);
+ manageBg.setColorFilter(bgColorFilter);
+ }
}
mClearAllButton.setBackground(clearAllBg);
mClearAllButton.setTextColor(onSurface);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
index b1e52af..ecca973 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt
@@ -305,8 +305,6 @@
}
}
}
- // Recalculate all icon positions, to reflect our updates.
- view.calculateIconXTranslations()
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
index 3a2e21a..0331654 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/StatusBarIconViewBinder.kt
@@ -21,6 +21,7 @@
import com.android.internal.util.ContrastColorUtil
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView
+import com.android.systemui.statusbar.StatusBarIconView.NO_COLOR
import com.android.systemui.statusbar.notification.NotificationUtils
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconColors
import kotlinx.coroutines.flow.Flow
@@ -54,7 +55,8 @@
iconColors.collect { colors ->
val isPreL = java.lang.Boolean.TRUE == view.getTag(R.id.icon_is_pre_L)
val isColorized = !isPreL || NotificationUtils.isGrayscale(view, contrastColorUtil)
- view.staticDrawableColor = colors.staticDrawableColor(view.viewBounds, isColorized)
+ view.staticDrawableColor =
+ if (isColorized) colors.staticDrawableColor(view.viewBounds) else NO_COLOR
view.setDecorColor(colors.tint)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
index 97d1e1b..2365db4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconColors.kt
@@ -35,5 +35,5 @@
* Returns the color to be applied to an icon, based on that icon's view bounds and whether or
* not the notification icon is colorized.
*/
- fun staticDrawableColor(viewBounds: Rect, isColorized: Boolean): Int
+ fun staticDrawableColor(viewBounds: Rect): Int
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
index af37e49..6e5ac47 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModel.kt
@@ -117,8 +117,8 @@
override val tint: Int,
private val areas: Collection<Rect>,
) : NotificationIconColors {
- override fun staticDrawableColor(viewBounds: Rect, isColorized: Boolean): Int {
- return if (isColorized && DarkIconDispatcher.isInAreas(areas, viewBounds)) {
+ override fun staticDrawableColor(viewBounds: Rect): Int {
+ return if (DarkIconDispatcher.isInAreas(areas, viewBounds)) {
tint
} else {
DarkIconDispatcher.DEFAULT_ICON_TINT
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index 7c8d762..4fe05ec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.notification.row;
+import static com.android.systemui.Flags.notificationBackgroundTintOptimization;
+
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
@@ -309,8 +311,7 @@
protected void setBackgroundTintColor(int color) {
if (color != mCurrentBackgroundTint) {
mCurrentBackgroundTint = color;
- // TODO(282173943): re-enable this tinting optimization when Resources are thread-safe
- if (false && color == mNormalColor) {
+ if (notificationBackgroundTintOptimization() && color == mNormalColor) {
// We don't need to tint a normal notification
color = 0;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
index 8eda96f..f6431a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationBackgroundView.java
@@ -156,7 +156,7 @@
new int[]{com.android.internal.R.attr.state_hovered},
new int[]{}},
- new int[]{tintColor, tintColor, tintColor}
+ new int[]{tintColor, 0, tintColor}
);
mBackground.setTintMode(PorterDuff.Mode.SRC_ATOP);
mBackground.setTintList(stateList);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
index 5e60b5f..7b2caea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt
@@ -82,6 +82,8 @@
}
launch { viewModel.translationY.collect { controller.setTranslationY(it) } }
+
+ launch { viewModel.alpha.collect { controller.setMaxAlphaForExpansion(it) } }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
index 1febaf9..da847c0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt
@@ -24,6 +24,7 @@
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
import com.android.systemui.util.kotlin.sample
@@ -38,6 +39,7 @@
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
@@ -50,6 +52,7 @@
keyguardInteractor: KeyguardInteractor,
keyguardTransitionInteractor: KeyguardTransitionInteractor,
private val shadeInteractor: ShadeInteractor,
+ occludedToLockscreenTransitionViewModel: OccludedToLockscreenTransitionViewModel,
) {
private val statesForConstrainedNotifications =
setOf(
@@ -144,14 +147,20 @@
initialValue = NotificationContainerBounds(0f, 0f),
)
+ val alpha: Flow<Float> = occludedToLockscreenTransitionViewModel.lockscreenAlpha
+
/**
* Under certain scenarios, such as swiping up on the lockscreen, the container will need to be
* translated as the keyguard fades out.
*/
val translationY: Flow<Float> =
- combine(isOnLockscreen, keyguardInteractor.keyguardTranslationY) {
+ combine(
isOnLockscreen,
- translationY ->
+ merge(
+ keyguardInteractor.keyguardTranslationY,
+ occludedToLockscreenTransitionViewModel.lockscreenTranslationY,
+ )
+ ) { isOnLockscreen, translationY ->
if (isOnLockscreen) {
translationY
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 824de01..2df30dc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -90,8 +90,13 @@
private int mLastConfigurationWidthDp = -1;
private int mLastConfigurationHeightDp = -1;
- private List<Runnable> mOnCreateRunnables = new ArrayList<>();
+ private final List<Runnable> mOnCreateRunnables = new ArrayList<>();
+ /**
+ * @deprecated Don't subclass SystemUIDialog. Please subclass {@link Delegate} and pass it to
+ * {@link Factory#create(DialogDelegate)} to create a custom dialog.
+ */
+ @Deprecated
public SystemUIDialog(Context context) {
this(context, DEFAULT_THEME, DEFAULT_DISMISS_ON_DEVICE_LOCK);
}
@@ -109,27 +114,7 @@
Dependency.get(SystemUIDialogManager.class),
Dependency.get(SysUiState.class),
Dependency.get(BroadcastDispatcher.class),
- Dependency.get(DialogLaunchAnimator.class),
- new DialogDelegate<>() {});
- }
-
- @Inject
- public SystemUIDialog(
- @Application Context context,
- FeatureFlags featureFlags,
- SystemUIDialogManager systemUIDialogManager,
- SysUiState sysUiState,
- BroadcastDispatcher broadcastDispatcher,
- DialogLaunchAnimator dialogLaunchAnimator) {
- this(context,
- DEFAULT_THEME,
- DEFAULT_DISMISS_ON_DEVICE_LOCK,
- featureFlags,
- systemUIDialogManager,
- sysUiState,
- broadcastDispatcher,
- dialogLaunchAnimator,
- new DialogDelegate<>(){});
+ Dependency.get(DialogLaunchAnimator.class));
}
public static class Factory {
@@ -156,11 +141,25 @@
mDialogLaunchAnimator = dialogLaunchAnimator;
}
+ /** Creates a new instance of {@link SystemUIDialog} with no customized behavior.
+ *
+ * When you just need a dialog, call this.
+ */
+ public SystemUIDialog create() {
+ return create(new DialogDelegate<>(){});
+ }
+
/**
* Creates a new instance of {@link SystemUIDialog} with {@code delegate} as the {@link
- * DialogDelegate}.
+ * Delegate}.
+ *
+ * When you need to customize the dialog, pass it a delegate.
*/
- public SystemUIDialog create(DialogDelegate<SystemUIDialog> delegate) {
+ public SystemUIDialog create(Delegate delegate) {
+ return create((DialogDelegate<SystemUIDialog>) delegate);
+ }
+
+ private SystemUIDialog create(DialogDelegate<SystemUIDialog> dialogDelegate) {
return new SystemUIDialog(
mContext,
DEFAULT_THEME,
@@ -170,7 +169,7 @@
mSysUiState,
mBroadcastDispatcher,
mDialogLaunchAnimator,
- delegate);
+ dialogDelegate);
}
}
@@ -588,4 +587,18 @@
mDialog.dismiss();
}
}
+
+ /**
+ * A delegate class that should be implemented in place of sublcassing {@link SystemUIDialog}.
+ *
+ * Implement this interface and then pass an instance of your implementation to
+ * {@link SystemUIDialog.Factory#create(Delegate)}.
+ */
+ public interface Delegate extends DialogDelegate<SystemUIDialog> {
+ /**
+ * Returns a new {@link SystemUIDialog} which has been passed this Delegate in its
+ * construction.
+ */
+ SystemUIDialog createDialog();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
index f5e9034..93db916 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SysuiDarkIconDispatcher.java
@@ -46,7 +46,8 @@
/** Model for {@link #darkChangeFlow()} */
class DarkChange {
- public static final DarkChange EMPTY = new DarkChange(new ArrayList<>(), 0, 0);
+ public static final DarkChange EMPTY =
+ new DarkChange(new ArrayList<>(), /* darkIntensity= */ 0f, DEFAULT_ICON_TINT);
public DarkChange(Collection<Rect> areas, float darkIntensity, int tint) {
this.areas = areas;
diff --git a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
index 10fc83c..ff73e0e 100644
--- a/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/unfold/SysUIUnfoldModule.kt
@@ -21,6 +21,7 @@
import com.android.systemui.shade.NotificationPanelUnfoldAnimationController
import com.android.systemui.statusbar.phone.StatusBarMoveFromCenterAnimationController
import com.android.systemui.unfold.dagger.UnfoldBg
+import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder
import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityManager
@@ -106,4 +107,20 @@
fun getUnfoldLatencyTracker(): UnfoldLatencyTracker
fun getNaturalRotationUnfoldProgressProvider(): NaturalRotationUnfoldProgressProvider
+
+ /** Creates a UnfoldTransitionProgressProvider that calculates progress in the main thread. */
+ fun getUnfoldTransitionProgressProvider(): UnfoldTransitionProgressProvider
+
+ /** Creates a UnfoldTransitionProgressProvider that calculates progress in the background. */
+ @UnfoldBg
+ fun getBgUnfoldTransitionProgressProvider(): UnfoldTransitionProgressProvider
+
+ /** Creates a UnfoldTransitionProgressForwarder. */
+ fun getUnfoldTransitionProgressForwarder(): UnfoldTransitionProgressForwarder
+
+ /** Creates a FoldStateLoggingProvider. */
+ fun getFoldStateLoggingProvider(): Optional<FoldStateLoggingProvider>
+
+ /** Creates a FoldStateLogger. */
+ fun getFoldStateLogger(): Optional<FoldStateLogger>
}
diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
index e7e907a..e4f1c87 100644
--- a/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java
@@ -25,6 +25,7 @@
import android.content.IntentFilter;
import android.debug.IAdbManager;
import android.hardware.usb.UsbManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.ServiceManager;
@@ -69,8 +70,7 @@
super.onCreate(icicle);
// Emulator does not support reseating the usb cable to reshow the dialog.
- boolean isEmulator = SystemProperties.get("ro.boot.qemu").equals("1");
- if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0 && !isEmulator) {
+ if (SystemProperties.getInt("service.adb.tcp.port", 0) == 0 && !Build.IS_EMULATOR) {
mDisconnectedReceiver = new UsbDisconnectedReceiver(this);
IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
mBroadcastDispatcher.registerReceiver(mDisconnectedReceiver, filter);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
index 6c91c98..2d5c2ab 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt
@@ -27,8 +27,6 @@
import com.android.systemui.biometrics.AuthController
import com.android.systemui.decor.FaceScanningProviderFactory
import com.android.systemui.dump.logcatLogBuffer
-import com.android.systemui.flags.FakeFeatureFlags
-import com.android.systemui.flags.Flags
import com.android.systemui.log.ScreenDecorationsLogger
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.util.mockito.whenever
@@ -55,8 +53,6 @@
@Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
- @Mock private lateinit var display: Display
-
private val displayId = 2
@Before
@@ -82,8 +78,6 @@
R.bool.config_fillMainBuiltInDisplayCutout,
true
)
- val featureFlags = FakeFeatureFlags()
- featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true)
underTest =
FaceScanningProviderFactory(
authController,
@@ -92,7 +86,6 @@
keyguardUpdateMonitor,
mock(Executor::class.java),
ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")),
- featureFlags,
)
whenever(authController.faceSensorLocation).thenReturn(Point(10, 10))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index af88df7..639276e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -78,7 +78,6 @@
import androidx.annotation.Nullable;
import androidx.test.filters.SmallTest;
-import com.android.systemui.res.R;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.decor.CornerDecorProvider;
@@ -93,10 +92,9 @@
import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl;
import com.android.systemui.decor.PrivacyDotDecorProviderFactory;
import com.android.systemui.decor.RoundedCornerResDelegate;
-import com.android.systemui.flags.FakeFeatureFlags;
-import com.android.systemui.flags.Flags;
import com.android.systemui.log.ScreenDecorationsLogger;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.res.R;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.commandline.CommandRegistry;
@@ -229,16 +227,13 @@
doAnswer(it -> !(mMockCutoutList.isEmpty())).when(mCutoutFactory).getHasProviders();
doReturn(mMockCutoutList).when(mCutoutFactory).getProviders();
- FakeFeatureFlags featureFlags = new FakeFeatureFlags();
- featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true);
mFaceScanningDecorProvider = spy(new FaceScanningOverlayProviderImpl(
BOUNDS_POSITION_TOP,
mAuthController,
mStatusBarStateController,
mKeyguardUpdateMonitor,
mExecutor,
- new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")),
- featureFlags));
+ new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer"))));
mScreenDecorations = spy(new ScreenDecorations(mContext, mSecureSettings,
mCommandRegistry, mUserTracker, mDisplayTracker, mDotViewController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
index 993dbac..54d6b53 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt
@@ -95,6 +95,18 @@
}
@Test
+ fun enableDetector_isUserInteractingTrue_shouldNotPostRunnable() =
+ testComponent.runTest {
+ // GIVEN isInteracting starts true
+ shadeRepository.setLegacyShadeTracking(true)
+ runCurrent()
+ detector.enable(action)
+
+ // THEN action was not run
+ verifyZeroInteractions(action)
+ }
+
+ @Test
fun enableDetector_shadeExpandImmediate_shouldNotPostRunnable() =
testComponent.runTest {
// GIVEN shade is closed and detector is enabled
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
index 0ff8da5..8c8544c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationDialogFactoryTest.java
@@ -20,16 +20,14 @@
import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.FaceManager;
import android.hardware.fingerprint.FingerprintManager;
@@ -60,14 +58,13 @@
@Rule
public MockitoRule rule = MockitoJUnit.rule();
- @Mock
- FingerprintManager mFingerprintManager;
- @Mock
- FaceManager mFaceManager;
- @Mock
- SystemUIDialog mDialog;
+ @Mock Resources mResources;
+ @Mock FingerprintManager mFingerprintManager;
+ @Mock FaceManager mFaceManager;
+ @Mock SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Mock SystemUIDialog mDialog;
+ @Mock BiometricNotificationDialogFactory.ActivityStarter mActivityStarter;
- private Context mContextSpy;
private final ArgumentCaptor<DialogInterface.OnClickListener> mOnClickListenerArgumentCaptor =
ArgumentCaptor.forClass(DialogInterface.OnClickListener.class);
private final ArgumentCaptor<Intent> mIntentArgumentCaptor =
@@ -76,15 +73,16 @@
@Before
public void setUp() throws ExecutionException, InterruptedException {
- mContext.addMockSystemService(FingerprintManager.class, mFingerprintManager);
- mContext.addMockSystemService(FaceManager.class, mFaceManager);
- mContextSpy = spy(mContext);
-
when(mFingerprintManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
when(mFaceManager.hasEnrolledTemplates(anyInt())).thenReturn(true);
- doNothing().when(mContextSpy).startActivity(any());
+ when(mSystemUIDialogFactory.create()).thenReturn(mDialog);
- mDialogFactory = new BiometricNotificationDialogFactory();
+ mDialogFactory = new BiometricNotificationDialogFactory(
+ mResources,
+ mSystemUIDialogFactory,
+ mFingerprintManager,
+ mFaceManager
+ );
}
@Test
@@ -92,8 +90,7 @@
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FINGERPRINT);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FINGERPRINT);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -108,7 +105,7 @@
removalCallbackArgumentCaptor.getValue().onRemovalSucceeded(null /* fp */,
0 /* remaining */);
- verify(mContextSpy).startActivity(mIntentArgumentCaptor.capture());
+ verify(mActivityStarter).startActivity(mIntentArgumentCaptor.capture());
assertThat(mIntentArgumentCaptor.getValue().getAction()).isEqualTo(
Settings.ACTION_FINGERPRINT_ENROLL);
}
@@ -118,8 +115,7 @@
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FINGERPRINT);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FINGERPRINT);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -134,7 +130,7 @@
removalCallbackArgumentCaptor.getValue().onRemovalError(null /* fp */,
0 /* errmsgId */, "Error" /* errString */);
- verify(mContextSpy, never()).startActivity(any());
+ verify(mActivityStarter, never()).startActivity(any());
}
@Test
@@ -142,8 +138,7 @@
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FACE));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FACE);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FACE);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -158,7 +153,7 @@
removalCallbackArgumentCaptor.getValue().onRemovalSucceeded(null /* fp */,
0 /* remaining */);
- verify(mContextSpy).startActivity(mIntentArgumentCaptor.capture());
+ verify(mActivityStarter).startActivity(mIntentArgumentCaptor.capture());
assertThat(mIntentArgumentCaptor.getValue().getAction()).isEqualTo(
"android.settings.FACE_ENROLL");
}
@@ -168,8 +163,7 @@
assumeTrue(getContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_FACE));
- mDialogFactory.createReenrollDialog(mContextSpy, mDialog,
- BiometricSourceType.FACE);
+ mDialogFactory.createReenrollDialog(0, mActivityStarter, BiometricSourceType.FACE);
verify(mDialog).setPositiveButton(anyInt(), mOnClickListenerArgumentCaptor.capture());
@@ -184,6 +178,6 @@
removalCallbackArgumentCaptor.getValue().onRemovalError(null /* face */,
0 /* errmsgId */, "Error" /* errString */);
- verify(mContextSpy, never()).startActivity(any());
+ verify(mActivityStarter, never()).startActivity(any());
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
index 3c10678..c6771b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/BiometricNotificationServiceTest.java
@@ -18,9 +18,7 @@
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FACE_REENROLL_DIALOG;
import static com.android.systemui.biometrics.BiometricNotificationBroadcastReceiver.ACTION_SHOW_FINGERPRINT_REENROLL_DIALOG;
-
import static com.google.common.truth.Truth.assertThat;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
@@ -71,6 +69,8 @@
@Mock
NotificationManager mNotificationManager;
@Mock
+ BiometricNotificationDialogFactory mNotificationDialogFactory;
+ @Mock
Optional<FingerprintReEnrollNotification> mFingerprintReEnrollNotificationOptional;
@Mock
FingerprintReEnrollNotification mFingerprintReEnrollNotification;
@@ -103,9 +103,8 @@
mLooper = TestableLooper.get(this);
Handler handler = new Handler(mLooper.getLooper());
- BiometricNotificationDialogFactory dialogFactory = new BiometricNotificationDialogFactory();
BiometricNotificationBroadcastReceiver broadcastReceiver =
- new BiometricNotificationBroadcastReceiver(mContext, dialogFactory);
+ new BiometricNotificationBroadcastReceiver(mContext, mNotificationDialogFactory);
mBiometricNotificationService =
new BiometricNotificationService(mContext,
mKeyguardUpdateMonitor, mKeyguardStateController, handler,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt
new file mode 100644
index 0000000..575d8bf
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DefaultUdfpsTouchOverlayViewModelTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.biometrics.ui.viewmodel
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysUITestComponent
+import com.android.systemui.SysUITestModule
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.TestMocksModule
+import com.android.systemui.collectLastValue
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.flags.Flags
+import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
+import com.android.systemui.keyguard.shared.model.StatusBarState
+import com.android.systemui.runCurrent
+import com.android.systemui.runTest
+import com.android.systemui.shade.data.repository.FakeShadeRepository
+import com.android.systemui.shade.domain.model.ShadeModel
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth.assertThat
+import dagger.BindsInstance
+import dagger.Component
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(JUnit4::class)
+class DefaultUdfpsTouchOverlayViewModelTest : SysuiTestCase() {
+ @Captor
+ private lateinit var sysuiDialogListenerCaptor: ArgumentCaptor<SystemUIDialogManager.Listener>
+ private var systemUIDialogManager: SystemUIDialogManager = mock()
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @SysUISingleton
+ @Component(
+ modules =
+ [
+ SysUITestModule::class,
+ UserDomainLayerModule::class,
+ ]
+ )
+ interface TestComponent : SysUITestComponent<DefaultUdfpsTouchOverlayViewModel> {
+ val keyguardRepository: FakeKeyguardRepository
+ val shadeRepository: FakeShadeRepository
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance test: SysuiTestCase,
+ featureFlags: FakeFeatureFlagsClassicModule,
+ mocks: TestMocksModule,
+ ): TestComponent
+ }
+ }
+
+ private fun TestComponent.shadeExpanded(expanded: Boolean) {
+ if (expanded) {
+ shadeRepository.setShadeModel(
+ ShadeModel(
+ expansionAmount = 1f,
+ isExpanded = true,
+ isUserDragging = false,
+ )
+ )
+ shadeRepository.setLegacyExpandedOrAwaitingInputTransfer(true)
+ } else {
+ keyguardRepository.setStatusBarState(StatusBarState.SHADE)
+ shadeRepository.setShadeModel(
+ ShadeModel(
+ expansionAmount = 0f,
+ isExpanded = false,
+ isUserDragging = false,
+ )
+ )
+ shadeRepository.setLegacyExpandedOrAwaitingInputTransfer(false)
+ }
+ }
+
+ private val testComponent: TestComponent =
+ DaggerDefaultUdfpsTouchOverlayViewModelTest_TestComponent.factory()
+ .create(
+ test = this,
+ featureFlags =
+ FakeFeatureFlagsClassicModule { set(Flags.FULL_SCREEN_USER_SWITCHER, true) },
+ mocks = TestMocksModule(systemUIDialogManager = systemUIDialogManager),
+ )
+
+ @Test
+ fun shadeNotExpanded_noDialogShowing_shouldHandleTouchesTrue() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(false)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isTrue()
+ }
+
+ @Test
+ fun shadeNotExpanded_dialogShowing_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(false)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(true)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun shadeExpanded_noDialogShowing_shouldHandleTouchesFalse() =
+ testComponent.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+ runCurrent()
+
+ shadeExpanded(true)
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+ runCurrent()
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt
new file mode 100644
index 0000000..f5f1622
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelTest.kt
@@ -0,0 +1,119 @@
+/*
+ * 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.biometrics.ui.viewmodel
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.flags.Flags
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.keyguard.ui.viewmodel.deviceEntryIconViewModelTransitionsMock
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
+import com.android.systemui.statusbar.phone.systemUIDialogManager
+import com.android.systemui.testKosmos
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@SmallTest
+@RunWith(JUnit4::class)
+class DeviceEntryUdfpsTouchOverlayViewModelTest : SysuiTestCase() {
+ val kosmos =
+ testKosmos().apply {
+ featureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, true) }
+ }
+ val testScope = kosmos.testScope
+
+ private val testDeviceEntryIconTransitionAlpha = MutableStateFlow(0f)
+ private val testDeviceEntryIconTransition: DeviceEntryIconTransition
+ get() =
+ object : DeviceEntryIconTransition {
+ override val deviceEntryParentViewAlpha: Flow<Float> =
+ testDeviceEntryIconTransitionAlpha.asStateFlow()
+ }
+
+ init {
+ kosmos.deviceEntryIconViewModelTransitionsMock.add(testDeviceEntryIconTransition)
+ }
+ val systemUIDialogManager = kosmos.systemUIDialogManager
+ private val underTest = kosmos.deviceEntryUdfpsTouchOverlayViewModel
+
+ @Captor
+ private lateinit var sysuiDialogListenerCaptor: ArgumentCaptor<SystemUIDialogManager.Listener>
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @Test
+ fun dialogShowing_shouldHandleTouchesFalse() =
+ testScope.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+
+ testDeviceEntryIconTransitionAlpha.value = 1f
+ runCurrent()
+
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(true)
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun transitionAlphaIsSmall_shouldHandleTouchesFalse() =
+ testScope.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+
+ testDeviceEntryIconTransitionAlpha.value = .3f
+ runCurrent()
+
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+
+ assertThat(shouldHandleTouches).isFalse()
+ }
+
+ @Test
+ fun alphaFullyShowing_noDialog_shouldHandleTouchesTrue() =
+ testScope.runTest {
+ val shouldHandleTouches by collectLastValue(underTest.shouldHandleTouches)
+
+ testDeviceEntryIconTransitionAlpha.value = 1f
+ runCurrent()
+
+ verify(systemUIDialogManager).registerListener(sysuiDialogListenerCaptor.capture())
+ sysuiDialogListenerCaptor.value.shouldHideAffordances(false)
+
+ assertThat(shouldHandleTouches).isTrue()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java
similarity index 61%
rename from packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java
rename to packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java
index eee0ed4..4022d43 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/BroadcastDialogDelegateTest.java
@@ -16,8 +16,10 @@
package com.android.systemui.bluetooth;
+import static com.android.systemui.statusbar.phone.SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK;
import static com.google.common.truth.Truth.assertThat;
-
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
@@ -26,31 +28,41 @@
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.test.filters.SmallTest;
-import com.android.internal.logging.UiEventLogger;
+import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
-import com.android.systemui.res.R;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.animation.DialogLaunchAnimator;
+import com.android.systemui.broadcast.BroadcastSender;
+import com.android.systemui.flags.FakeFeatureFlags;
+import com.android.systemui.flags.Flags;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
+import com.android.systemui.model.SysUiState;
+import com.android.systemui.res.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.phone.SystemUIDialogManager;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.time.FakeSystemClock;
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)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
-public class BroadcastDialogTest extends SysuiTestCase {
+public class BroadcastDialogDelegateTest extends SysuiTestCase {
private static final String CURRENT_BROADCAST_APP = "Music";
private static final String SWITCH_APP = "System UI";
@@ -61,33 +73,64 @@
private final LocalBluetoothLeBroadcast mLocalBluetoothLeBroadcast = mock(
LocalBluetoothLeBroadcast.class);
private final BroadcastSender mBroadcastSender = mock(BroadcastSender.class);
- private BroadcastDialog mBroadcastDialog;
- private View mDialogView;
+ private BroadcastDialogDelegate mBroadcastDialogDelegate;
+ private FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
+ @Mock SystemUIDialog.Factory mSystemUIDialogFactory;
+ @Mock SystemUIDialogManager mDialogManager;
+ @Mock SysUiState mSysUiState;
+ @Mock DialogLaunchAnimator mDialogLaunchAnimator;
+ @Mock MediaOutputDialogFactory mMediaOutputDialogFactory;
+ private SystemUIDialog mDialog;
private TextView mTitle;
private TextView mSubTitle;
private Button mSwitchBroadcastAppButton;
private Button mChangeOutputButton;
+ private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null);
- mBroadcastDialog = new BroadcastDialog(mContext, mock(MediaOutputDialogFactory.class),
- mLocalBluetoothManager, CURRENT_BROADCAST_APP, TEST_PACKAGE,
- mock(UiEventLogger.class), mBroadcastSender);
- mBroadcastDialog.show();
- mDialogView = mBroadcastDialog.mDialogView;
+
+ mFeatureFlags.set(Flags.WM_ENABLE_PREDICTIVE_BACK_QS_DIALOG_ANIM, true);
+ when(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState);
+ when(mSystemUIDialogFactory.create(any())).thenReturn(mDialog);
+
+ mBroadcastDialogDelegate = new BroadcastDialogDelegate(
+ mContext,
+ mMediaOutputDialogFactory,
+ mLocalBluetoothManager,
+ new UiEventLoggerFake(),
+ mFakeExecutor,
+ mBroadcastSender,
+ mSystemUIDialogFactory,
+ CURRENT_BROADCAST_APP,
+ TEST_PACKAGE);
+
+ mDialog = new SystemUIDialog(
+ mContext,
+ 0,
+ DEFAULT_DISMISS_ON_DEVICE_LOCK,
+ mFeatureFlags,
+ mDialogManager,
+ mSysUiState,
+ getFakeBroadcastDispatcher(),
+ mDialogLaunchAnimator,
+ mBroadcastDialogDelegate
+ );
+
+ mDialog.show();
}
@After
public void tearDown() {
- mBroadcastDialog.dismiss();
+ mDialog.dismiss();
}
@Test
public void onCreate_withCurrentApp_titleIsCurrentAppName() {
- mTitle = mDialogView.requireViewById(R.id.dialog_title);
+ mTitle = mDialog.requireViewById(R.id.dialog_title);
assertThat(mTitle.getText().toString()).isEqualTo(mContext.getString(
R.string.bt_le_audio_broadcast_dialog_title, CURRENT_BROADCAST_APP));
@@ -95,7 +138,7 @@
@Test
public void onCreate_withCurrentApp_subTitleIsSwitchAppName() {
- mSubTitle = mDialogView.requireViewById(R.id.dialog_subtitle);
+ mSubTitle = mDialog.requireViewById(R.id.dialog_subtitle);
assertThat(mSubTitle.getText()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_sub_title, SWITCH_APP));
@@ -103,7 +146,7 @@
@Test
public void onCreate_withCurrentApp_switchBtnIsSwitchAppName() {
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_switch_app, SWITCH_APP));
@@ -111,17 +154,17 @@
@Test
public void onClick_withChangeOutput_dismissBroadcastDialog() {
- mChangeOutputButton = mDialogView.requireViewById(R.id.change_output);
+ mChangeOutputButton = mDialog.requireViewById(R.id.change_output);
mChangeOutputButton.performClick();
- assertThat(mBroadcastDialog.isShowing()).isFalse();
+ assertThat(mDialog.isShowing()).isFalse();
}
@Test
public void onClick_withSwitchBroadcast_stopCurrentBroadcast() {
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(
mLocalBluetoothLeBroadcast);
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
mSwitchBroadcastAppButton.performClick();
verify(mLocalBluetoothLeBroadcast).stopLatestBroadcast();
@@ -129,7 +172,7 @@
@Test
public void onClick_withSwitchBroadcast_stopCurrentBroadcastFailed() {
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
mSwitchBroadcastAppButton.performClick();
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
@@ -139,9 +182,9 @@
@Test
public void handleLeBroadcastStopped_withBroadcastProfileNull_doRefreshButton() {
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null);
- mSwitchBroadcastAppButton = mDialogView.requireViewById(R.id.switch_broadcast);
+ mSwitchBroadcastAppButton = mDialog.requireViewById(R.id.switch_broadcast);
- mBroadcastDialog.handleLeBroadcastStopped();
+ mBroadcastDialogDelegate.handleLeBroadcastStopped();
assertThat(mSwitchBroadcastAppButton.getText().toString()).isEqualTo(
mContext.getString(R.string.bt_le_audio_broadcast_dialog_switch_app, SWITCH_APP));
@@ -152,7 +195,7 @@
when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(
mLocalBluetoothLeBroadcast);
- mBroadcastDialog.handleLeBroadcastStopped();
+ mBroadcastDialogDelegate.handleLeBroadcastStopped();
verify(mLocalBluetoothLeBroadcast).startBroadcast(eq(SWITCH_APP), any());
}
@@ -160,17 +203,17 @@
@Test
public void handleLeBroadcastMetadataChanged_withNotLaunchFlag_doNotDismissDialog() {
- mBroadcastDialog.handleLeBroadcastMetadataChanged();
+ mBroadcastDialogDelegate.handleLeBroadcastMetadataChanged();
- assertThat(mBroadcastDialog.isShowing()).isTrue();
+ assertThat(mDialog.isShowing()).isTrue();
}
@Test
public void handleLeBroadcastMetadataChanged_withLaunchFlag_dismissDialog() {
- mBroadcastDialog.handleLeBroadcastStarted();
- mBroadcastDialog.handleLeBroadcastMetadataChanged();
+ mBroadcastDialogDelegate.handleLeBroadcastStarted();
+ mBroadcastDialogDelegate.handleLeBroadcastMetadataChanged();
- assertThat(mBroadcastDialog.isShowing()).isFalse();
+ assertThat(mDialog.isShowing()).isFalse();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
index 9671966..c425e82 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/clipboardoverlay/ClipboardOverlayControllerTest.java
@@ -444,6 +444,7 @@
verify(mClipboardOverlayView, never()).setMinimized(true);
verify(mClipboardOverlayView).setMinimized(false);
+ verify(mClipboardOverlayView).getEnterAnimation();
verify(mClipboardOverlayView).showTextPreview("Test Item", false);
}
@@ -458,6 +459,7 @@
verify(mClipboardOverlayView).setMinimized(true);
verify(mUiEventLogger, times(1)).log(CLIPBOARD_OVERLAY_SHOWN_MINIMIZED, 0, "abc");
+ verify(mClipboardOverlayView).getEnterAnimation();
verify(mClipboardOverlayView, never()).setMinimized(false);
verify(mClipboardOverlayView, never()).showTextPreview(any(), anyBoolean());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt
new file mode 100644
index 0000000..c5c0208
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorTest.kt
@@ -0,0 +1,82 @@
+/*
+ * 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.common.ui.domain.interactor
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.coroutines.collectLastValue
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.MockitoAnnotations
+
+@ExperimentalCoroutinesApi
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ConfigurationInteractorTest : SysuiTestCase() {
+ private lateinit var testScope: TestScope
+ private lateinit var underTest: ConfigurationInteractor
+ private lateinit var configurationRepository: FakeConfigurationRepository
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ configurationRepository = FakeConfigurationRepository()
+ testScope = TestScope()
+ underTest = ConfigurationInteractor(configurationRepository)
+ }
+
+ @Test
+ fun dimensionPixelSize() =
+ testScope.runTest {
+ val resourceId = 1001
+ val pixelSize = 501
+ configurationRepository.setDimensionPixelSize(resourceId, pixelSize)
+
+ val dimensionPixelSize by collectLastValue(underTest.dimensionPixelSize(resourceId))
+
+ configurationRepository.onAnyConfigurationChange()
+
+ assertThat(dimensionPixelSize).isEqualTo(pixelSize)
+ }
+
+ @Test
+ fun dimensionPixelSizes() =
+ testScope.runTest {
+ val resourceId1 = 1001
+ val pixelSize1 = 501
+ val resourceId2 = 1002
+ val pixelSize2 = 502
+ configurationRepository.setDimensionPixelSize(resourceId1, pixelSize1)
+ configurationRepository.setDimensionPixelSize(resourceId2, pixelSize2)
+
+ val dimensionPixelSizes by
+ collectLastValue(underTest.dimensionPixelSize(setOf(resourceId1, resourceId2)))
+
+ configurationRepository.onAnyConfigurationChange()
+
+ assertThat(dimensionPixelSizes!![resourceId1]).isEqualTo(pixelSize1)
+ assertThat(dimensionPixelSizes!![resourceId2]).isEqualTo(pixelSize2)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt
new file mode 100644
index 0000000..e931384
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogDelegateTest.kt
@@ -0,0 +1,101 @@
+/*
+ * 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.contrast
+
+import android.app.UiModeManager
+import android.app.UiModeManager.ContrastUtils.fromContrastLevel
+import android.os.Looper
+import android.provider.Settings
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper.RunWithLooper
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.animation.DialogLaunchAnimator
+import com.android.systemui.flags.FakeFeatureFlags
+import com.android.systemui.flags.FeatureFlags
+import com.android.systemui.model.SysUiState
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.statusbar.phone.SystemUIDialog
+import com.android.systemui.util.concurrency.FakeExecutor
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.SecureSettings
+import com.android.systemui.util.time.FakeSystemClock
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+/** Test the behaviour of buttons of the [ContrastDialogDelegate]. */
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@RunWithLooper
+class ContrastDialogDelegateTest : SysuiTestCase() {
+
+ private val mainExecutor = FakeExecutor(FakeSystemClock())
+ private lateinit var mContrastDialogDelegate: ContrastDialogDelegate
+ @Mock private lateinit var sysuiDialogFactory: SystemUIDialog.Factory
+ @Mock private lateinit var sysuiDialog: SystemUIDialog
+ @Mock private lateinit var mockUiModeManager: UiModeManager
+ @Mock private lateinit var mockUserTracker: UserTracker
+ @Mock private lateinit var mockSecureSettings: SecureSettings
+ @Mock private lateinit var sysuiState: SysUiState
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ mDependency.injectTestDependency(FeatureFlags::class.java, FakeFeatureFlags())
+ mDependency.injectTestDependency(SysUiState::class.java, sysuiState)
+ mDependency.injectMockDependency(DialogLaunchAnimator::class.java)
+ whenever(sysuiState.setFlag(any(), any())).thenReturn(sysuiState)
+ whenever(sysuiDialogFactory.create(any())).thenReturn(sysuiDialog)
+ whenever(sysuiDialog.layoutInflater).thenReturn(LayoutInflater.from(mContext))
+
+ whenever(mockUserTracker.userId).thenReturn(context.userId)
+ if (Looper.myLooper() == null) Looper.prepare()
+
+ mContrastDialogDelegate =
+ ContrastDialogDelegate(
+ sysuiDialogFactory,
+ mainExecutor,
+ mockUiModeManager,
+ mockUserTracker,
+ mockSecureSettings
+ )
+ }
+
+ @Test
+ fun testClickButtons_putsContrastInSettings() {
+ mContrastDialogDelegate.onCreate(sysuiDialog, null)
+
+ mContrastDialogDelegate.contrastButtons.forEach {
+ (contrastLevel: Int, clickedButton: FrameLayout) ->
+ clickedButton.performClick()
+ mainExecutor.runAllReady()
+ verify(mockSecureSettings)
+ .putFloatForUser(
+ eq(Settings.Secure.CONTRAST_LEVEL),
+ eq(fromContrastLevel(contrastLevel)),
+ eq(context.userId)
+ )
+ }
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
deleted file mode 100644
index 7753197..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/contrast/ContrastDialogTest.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.contrast
-
-import android.app.UiModeManager
-import android.app.UiModeManager.ContrastUtils.fromContrastLevel
-import android.os.Looper
-import android.provider.Settings
-import android.testing.AndroidTestingRunner
-import android.widget.FrameLayout
-import androidx.test.filters.SmallTest
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.settings.UserTracker
-import com.android.systemui.util.mockito.whenever
-import com.android.systemui.util.settings.SecureSettings
-import com.google.common.util.concurrent.MoreExecutors
-import java.util.concurrent.Executor
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.eq
-import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
-
-/** Test the behaviour of buttons of the [ContrastDialog]. */
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-class ContrastDialogTest : SysuiTestCase() {
-
- private lateinit var mainExecutor: Executor
- private lateinit var contrastDialog: ContrastDialog
- @Mock private lateinit var mockUiModeManager: UiModeManager
- @Mock private lateinit var mockUserTracker: UserTracker
- @Mock private lateinit var mockSecureSettings: SecureSettings
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
- mainExecutor = MoreExecutors.directExecutor()
- whenever(mockUserTracker.userId).thenReturn(context.userId)
- }
-
- @Test
- fun testClickButtons_putsContrastInSettings() {
- if (Looper.myLooper() == null) Looper.prepare()
- contrastDialog =
- ContrastDialog(
- context,
- mainExecutor,
- mockUiModeManager,
- mockUserTracker,
- mockSecureSettings
- )
- contrastDialog.show()
- try {
- contrastDialog.contrastButtons.forEach {
- (contrastLevel: Int, clickedButton: FrameLayout) ->
- clickedButton.performClick()
- verify(mockSecureSettings)
- .putFloatForUser(
- eq(Settings.Secure.CONTRAST_LEVEL),
- eq(fromContrastLevel(contrastLevel)),
- eq(context.userId)
- )
- }
- } finally {
- contrastDialog.dismiss()
- }
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
index 50914c8..7133e8b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LifecycleTest.java
@@ -16,8 +16,7 @@
package com.android.systemui.keyguard;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
import android.testing.AndroidTestingRunner;
@@ -52,8 +51,7 @@
mLifecycle.addObserver(mObj1);
mLifecycle.dispatch(mDispatchedObjects::add);
-
- assertTrue(mDispatchedObjects.contains(mObj1));
+ assertThat(mDispatchedObjects).contains(mObj1);
}
@Test
@@ -63,7 +61,7 @@
mLifecycle.dispatch(mDispatchedObjects::add);
- assertFalse(mDispatchedObjects.contains(mObj1));
+ assertThat(mDispatchedObjects).isEmpty();
}
@Test
@@ -73,8 +71,7 @@
mLifecycle.dispatch(mDispatchedObjects::add);
- assertTrue(mDispatchedObjects.contains(mObj1));
- assertTrue(mDispatchedObjects.contains(mObj2));
+ assertThat(mDispatchedObjects).containsExactly(mObj1, mObj2);
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
index bc40c2d..d75cbec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryTest.kt
@@ -18,6 +18,7 @@
import android.provider.Settings
import androidx.test.filters.SmallTest
+import com.android.keyguard.ClockEventController
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.SettingsClockSize
@@ -47,6 +48,7 @@
private lateinit var underTest: KeyguardClockRepository
private lateinit var fakeSettings: FakeSettings
@Mock private lateinit var clockRegistry: ClockRegistry
+ @Mock private lateinit var clockEventController: ClockEventController
@Before
fun setup() {
@@ -55,7 +57,14 @@
scheduler = TestCoroutineScheduler()
dispatcher = StandardTestDispatcher(scheduler)
scope = TestScope(dispatcher)
- underTest = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
+ underTest =
+ KeyguardClockRepositoryImpl(
+ fakeSettings,
+ clockRegistry,
+ clockEventController,
+ dispatcher,
+ scope.backgroundScope
+ )
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
index b3e8fed..de12b8f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt
@@ -130,6 +130,7 @@
mContext,
testScope.backgroundScope,
dispatcher,
+ dispatcher,
faceAuthRepository,
{
PrimaryBouncerInteractor(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
index a04ea2e..edd781d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt
@@ -24,8 +24,10 @@
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.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.time.Duration.Companion.milliseconds
+import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -35,125 +37,138 @@
@SmallTest
@RunWith(JUnit4::class)
class KeyguardTransitionAnimationFlowTest : SysuiTestCase() {
- private lateinit var underTest: KeyguardTransitionAnimationFlow
+ private lateinit var underTest: KeyguardTransitionAnimationFlow.SharedFlowBuilder
private lateinit var repository: FakeKeyguardTransitionRepository
+ private lateinit var testScope: TestScope
@Before
fun setUp() {
+ testScope = TestScope()
repository = FakeKeyguardTransitionRepository()
underTest =
KeyguardTransitionAnimationFlow(
- 1000.milliseconds,
- repository.transitions,
- )
+ testScope.backgroundScope,
+ mock(),
+ )
+ .setup(
+ duration = 1000.milliseconds,
+ stepFlow = repository.transitions,
+ )
}
@Test(expected = IllegalArgumentException::class)
- fun zeroDurationThrowsException() = runTest {
- val flow = underTest.createFlow(duration = 0.milliseconds, onStep = { it })
- }
+ fun zeroDurationThrowsException() =
+ testScope.runTest {
+ val flow = underTest.sharedFlow(duration = 0.milliseconds, onStep = { it })
+ }
@Test(expected = IllegalArgumentException::class)
- fun startTimePlusDurationGreaterThanTransitionDurationThrowsException() = runTest {
- val flow =
- underTest.createFlow(
- startTime = 300.milliseconds,
- duration = 800.milliseconds,
- onStep = { it }
- )
- }
+ fun startTimePlusDurationGreaterThanTransitionDurationThrowsException() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ startTime = 300.milliseconds,
+ duration = 800.milliseconds,
+ onStep = { it }
+ )
+ }
@Test
- fun onFinishRunsWhenSpecified() = runTest {
- val flow =
- underTest.createFlow(
- duration = 100.milliseconds,
- onStep = { it },
- onFinish = { 10f },
- )
- var animationValues = collectLastValue(flow)
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED), validateStep = false)
- assertThat(animationValues()).isEqualTo(10f)
- }
+ fun onFinishRunsWhenSpecified() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ duration = 100.milliseconds,
+ onStep = { it },
+ onFinish = { 10f },
+ )
+ var animationValues = collectLastValue(flow)
+ repository.sendTransitionStep(step(1f, TransitionState.FINISHED), validateStep = false)
+ assertThat(animationValues()).isEqualTo(10f)
+ }
@Test
- fun onCancelRunsWhenSpecified() = runTest {
- val flow =
- underTest.createFlow(
- duration = 100.milliseconds,
- onStep = { it },
- onCancel = { 100f },
- )
- var animationValues = collectLastValue(flow)
- repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))
- assertThat(animationValues()).isEqualTo(100f)
- }
+ fun onCancelRunsWhenSpecified() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ duration = 100.milliseconds,
+ onStep = { it },
+ onCancel = { 100f },
+ )
+ var animationValues = collectLastValue(flow)
+ repository.sendTransitionStep(step(0.5f, TransitionState.CANCELED))
+ assertThat(animationValues()).isEqualTo(100f)
+ }
@Test
- fun usesStartTime() = runTest {
- val flow =
- underTest.createFlow(
- startTime = 500.milliseconds,
- duration = 500.milliseconds,
- onStep = { it },
- )
- var animationValues = collectLastValue(flow)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(animationValues()).isEqualTo(0f)
+ fun usesStartTime() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ startTime = 500.milliseconds,
+ duration = 500.milliseconds,
+ onStep = { it },
+ )
+ var animationValues = collectLastValue(flow)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(animationValues()).isEqualTo(0f)
- // Should not emit a value
- repository.sendTransitionStep(step(0.1f, TransitionState.RUNNING))
+ // Should not emit a value
+ repository.sendTransitionStep(step(0.1f, TransitionState.RUNNING))
- repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
- assertFloat(animationValues(), 0f)
- repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
- assertFloat(animationValues(), 0.2f)
- repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
- assertFloat(animationValues(), 0.6f)
- repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
- assertFloat(animationValues(), 1f)
- }
+ repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 0f)
+ repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 0.2f)
+ repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 0.6f)
+ repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 1f)
+ }
@Test
- fun usesInterpolator() = runTest {
- val flow =
- underTest.createFlow(
- duration = 1000.milliseconds,
- interpolator = EMPHASIZED_ACCELERATE,
- onStep = { it },
- )
- var animationValues = collectLastValue(flow)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0f))
- repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
- assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.5f))
- repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
- assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.6f))
- repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
- assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.8f))
- repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
- assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(1f))
- }
+ fun usesInterpolator() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ duration = 1000.milliseconds,
+ interpolator = EMPHASIZED_ACCELERATE,
+ onStep = { it },
+ )
+ var animationValues = collectLastValue(flow)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0f))
+ repository.sendTransitionStep(step(0.5f, TransitionState.RUNNING))
+ assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.5f))
+ repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
+ assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.6f))
+ repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
+ assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(0.8f))
+ repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
+ assertFloat(animationValues(), EMPHASIZED_ACCELERATE.getInterpolation(1f))
+ }
@Test
- fun usesOnStepToDoubleValue() = runTest {
- val flow =
- underTest.createFlow(
- duration = 1000.milliseconds,
- onStep = { it * 2 },
- )
- var animationValues = collectLastValue(flow)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertFloat(animationValues(), 0f)
- repository.sendTransitionStep(step(0.3f, TransitionState.RUNNING))
- assertFloat(animationValues(), 0.6f)
- repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
- assertFloat(animationValues(), 1.2f)
- repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
- assertFloat(animationValues(), 1.6f)
- repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
- assertFloat(animationValues(), 2f)
- }
+ fun usesOnStepToDoubleValue() =
+ testScope.runTest {
+ val flow =
+ underTest.sharedFlow(
+ duration = 1000.milliseconds,
+ onStep = { it * 2 },
+ )
+ var animationValues = collectLastValue(flow)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertFloat(animationValues(), 0f)
+ repository.sendTransitionStep(step(0.3f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 0.6f)
+ repository.sendTransitionStep(step(0.6f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 1.2f)
+ repository.sendTransitionStep(step(0.8f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 1.6f)
+ repository.sendTransitionStep(step(1f, TransitionState.RUNNING))
+ assertFloat(animationValues(), 2f)
+ }
private fun assertFloat(actual: Float?, expected: Float) {
assertThat(actual!!).isWithin(0.01f).of(expected)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt
new file mode 100644
index 0000000..0981c62
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinderTest.kt
@@ -0,0 +1,103 @@
+/*
+ * 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.keyguard.ui.binder
+
+import android.view.View
+import androidx.constraintlayout.helper.widget.Layer
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.plugins.ClockConfig
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.ClockFaceController
+import com.android.systemui.plugins.ClockFaceLayout
+import com.android.systemui.util.mockito.whenever
+import kotlin.test.Test
+import org.junit.Before
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@kotlinx.coroutines.ExperimentalCoroutinesApi
+class KeyguardClockViewBinderTest : SysuiTestCase() {
+ @Mock private lateinit var rootView: ConstraintLayout
+ @Mock private lateinit var burnInLayer: Layer
+ @Mock private lateinit var clock: ClockController
+ @Mock private lateinit var largeClock: ClockFaceController
+ @Mock private lateinit var smallClock: ClockFaceController
+ @Mock private lateinit var largeClockView: View
+ @Mock private lateinit var smallClockView: View
+ @Mock private lateinit var smallClockFaceLayout: ClockFaceLayout
+ @Mock private lateinit var largeClockFaceLayout: ClockFaceLayout
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ }
+
+ @Test
+ fun addClockViews_nonWeatherClock() {
+ setupNonWeatherClock()
+ KeyguardClockViewBinder.addClockViews(clock, rootView, burnInLayer)
+ verify(rootView).addView(smallClockView)
+ verify(rootView).addView(largeClockView)
+ verify(burnInLayer).addView(smallClockView)
+ verify(burnInLayer, never()).addView(largeClockView)
+ }
+
+ @Test
+ fun addClockViews_WeatherClock() {
+ setupWeatherClock()
+ KeyguardClockViewBinder.addClockViews(clock, rootView, burnInLayer)
+ verify(rootView).addView(smallClockView)
+ verify(rootView).addView(largeClockView)
+ verify(burnInLayer).addView(smallClockView)
+ verify(burnInLayer).addView(largeClockView)
+ }
+
+ private fun setupWeatherClock() {
+ setupClock()
+ val clockConfig =
+ ClockConfig(
+ id = "WEATHER_CLOCK",
+ name = "",
+ description = "",
+ useAlternateSmartspaceAODTransition = true
+ )
+ whenever(clock.config).thenReturn(clockConfig)
+ }
+
+ private fun setupNonWeatherClock() {
+ setupClock()
+ val clockConfig = ClockConfig(id = "NON_WEATHER_CLOCK", name = "", description = "")
+ whenever(clock.config).thenReturn(clockConfig)
+ }
+
+ private fun setupClock() {
+ whenever(largeClockFaceLayout.views).thenReturn(listOf(largeClockView))
+ whenever(smallClockFaceLayout.views).thenReturn(listOf(smallClockView))
+ whenever(clock.largeClock).thenReturn(largeClock)
+ whenever(clock.smallClock).thenReturn(smallClock)
+ whenever(largeClock.layout).thenReturn(largeClockFaceLayout)
+ whenever(smallClock.layout).thenReturn(smallClockFaceLayout)
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
index 740fce9..3109e76 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/blueprints/DefaultKeyguardBlueprintTest.kt
@@ -27,9 +27,9 @@
import com.android.systemui.keyguard.shared.model.KeyguardBlueprint
import com.android.systemui.keyguard.shared.model.KeyguardSection
import com.android.systemui.keyguard.ui.view.KeyguardRootView
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodBurnInSection
import com.android.systemui.keyguard.ui.view.layout.sections.AodNotificationIconsSection
+import com.android.systemui.keyguard.ui.view.layout.sections.ClockSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultDeviceEntrySection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultIndicationAreaSection
import com.android.systemui.keyguard.ui.view.layout.sections.DefaultNotificationStackScrollLayoutSection
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
index 6b85cf7..64a07fa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt
@@ -22,9 +22,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.Flags.MIGRATE_CLOCKS_TO_BLUEPRINT
-import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
-import com.android.systemui.keyguard.ui.view.layout.items.ClockSection
import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel
import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel
import com.android.systemui.res.R
@@ -32,7 +30,6 @@
import com.android.systemui.util.Utils
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
-import dagger.Lazy
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -47,7 +44,6 @@
@Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel
@Mock private lateinit var smartspaceViewModel: KeyguardSmartspaceViewModel
@Mock private lateinit var splitShadeStateController: SplitShadeStateController
- @Mock private lateinit var keyguardBlueprintInteractor: Lazy<KeyguardBlueprintInteractor>
private var featureFlags: FakeFeatureFlagsClassic = FakeFeatureFlagsClassic()
private lateinit var underTest: ClockSection
@@ -94,7 +90,6 @@
smartspaceViewModel,
mContext,
splitShadeStateController,
- keyguardBlueprintInteractor,
featureFlags
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt
index fc9f54ec..d959872 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelTest.kt
@@ -21,66 +21,45 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
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.statusbar.phone.StatusBarKeyguardViewManager
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
-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.MockitoAnnotations
@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
@SmallTest
class AlternateBouncerViewModelTest : SysuiTestCase() {
-
- private lateinit var testScope: TestScope
-
- @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager
-
- private lateinit var transitionRepository: FakeKeyguardTransitionRepository
- private lateinit var transitionInteractor: KeyguardTransitionInteractor
- private lateinit var underTest: AlternateBouncerViewModel
-
- @Before
- fun setup() {
- MockitoAnnotations.initMocks(this)
- testScope = TestScope()
-
- val transitionInteractorWithDependencies =
- KeyguardTransitionInteractorFactory.create(testScope.backgroundScope)
- transitionInteractor = transitionInteractorWithDependencies.keyguardTransitionInteractor
- transitionRepository = transitionInteractorWithDependencies.repository
- underTest =
- AlternateBouncerViewModel(
- statusBarKeyguardViewManager,
- transitionInteractor,
- )
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val transitionRepository = kosmos.fakeKeyguardTransitionRepository
+ private val statusBarKeyguardViewManager = kosmos.statusBarKeyguardViewManager
+ private val underTest = kosmos.alternateBouncerViewModel
@Test
fun transitionToAlternateBouncer_scrimAlphaUpdate() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val scrimAlphas by collectValues(underTest.scrimAlpha)
- transitionRepository.sendTransitionStep(
- stepToAlternateBouncer(0f, TransitionState.STARTED)
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepToAlternateBouncer(0f, TransitionState.STARTED),
+ stepToAlternateBouncer(.4f),
+ stepToAlternateBouncer(.6f),
+ stepToAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.4f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(1f))
assertThat(scrimAlphas.size).isEqualTo(4)
scrimAlphas.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
@@ -88,15 +67,18 @@
@Test
fun transitionFromAlternateBouncer_scrimAlphaUpdate() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val scrimAlphas by collectValues(underTest.scrimAlpha)
- transitionRepository.sendTransitionStep(
- stepFromAlternateBouncer(0f, TransitionState.STARTED)
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepToAlternateBouncer(0f, TransitionState.STARTED),
+ stepToAlternateBouncer(.4f),
+ stepToAlternateBouncer(.6f),
+ stepToAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.4f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(1f))
assertThat(scrimAlphas.size).isEqualTo(4)
scrimAlphas.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) }
@@ -104,43 +86,57 @@
@Test
fun forcePluginOpen() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val forcePluginOpen by collectLastValue(underTest.forcePluginOpen)
- transitionRepository.sendTransitionStep(
- stepToAlternateBouncer(0f, TransitionState.STARTED)
+
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepToAlternateBouncer(0f, TransitionState.STARTED),
+ stepToAlternateBouncer(.4f),
+ stepToAlternateBouncer(.6f),
+ stepToAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.3f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(1f))
assertThat(forcePluginOpen).isTrue()
- transitionRepository.sendTransitionStep(
- stepFromAlternateBouncer(0f, TransitionState.STARTED)
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepFromAlternateBouncer(0f, TransitionState.STARTED),
+ stepFromAlternateBouncer(.3f),
+ stepFromAlternateBouncer(.6f),
+ stepFromAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.3f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(1f))
assertThat(forcePluginOpen).isFalse()
}
@Test
fun registerForDismissGestures() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val registerForDismissGestures by collectLastValue(underTest.registerForDismissGestures)
- transitionRepository.sendTransitionStep(
- stepToAlternateBouncer(0f, TransitionState.STARTED)
+
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepToAlternateBouncer(0f, TransitionState.STARTED),
+ stepToAlternateBouncer(.4f),
+ stepToAlternateBouncer(.6f),
+ stepToAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.3f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepToAlternateBouncer(1f))
assertThat(registerForDismissGestures).isTrue()
- transitionRepository.sendTransitionStep(
- stepFromAlternateBouncer(0f, TransitionState.STARTED)
+ transitionRepository.sendTransitionSteps(
+ listOf(
+ stepFromAlternateBouncer(0f, TransitionState.STARTED),
+ stepFromAlternateBouncer(.3f),
+ stepFromAlternateBouncer(.6f),
+ stepFromAlternateBouncer(1f),
+ ),
+ testScope,
)
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.3f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(.6f))
- transitionRepository.sendTransitionStep(stepFromAlternateBouncer(1f))
assertThat(registerForDismissGestures).isFalse()
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelTest.kt
index f282481..4c972e9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelTest.kt
@@ -20,16 +20,15 @@
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.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,34 +36,25 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class AodToGoneTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: AodToGoneTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest = AodToGoneTransitionViewModel(interactor)
- }
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
+ val repository = kosmos.fakeKeyguardTransitionRepository
+ val underTest = kosmos.aodToGoneTransitionViewModel
@Test
- fun deviceEntryParentViewHides() = runTest {
- val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
- deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(0f) }
- }
+ fun deviceEntryParentViewHides() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ repository.sendTransitionStep(step(0.1f))
+ repository.sendTransitionStep(step(0.3f))
+ repository.sendTransitionStep(step(0.4f))
+ repository.sendTransitionStep(step(0.5f))
+ repository.sendTransitionStep(step(0.6f))
+ repository.sendTransitionStep(step(0.8f))
+ repository.sendTransitionStep(step(1f))
+ deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(0f) }
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
index 517149c..af8d8a8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
@@ -19,22 +19,18 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -42,83 +38,67 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class AodToLockscreenTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: AodToLockscreenTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- underTest =
- AodToLockscreenTransitionViewModel(
- interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor,
- deviceEntryUdfpsInteractor =
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = FakeBiometricSettingsRepository(),
- ),
- )
- }
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
+ val repository = kosmos.fakeKeyguardTransitionRepository
+ val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ val underTest = kosmos.aodToLockscreenTransitionViewModel
@Test
- fun deviceEntryParentViewShows() = runTest {
- val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
- deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(1f) }
- }
+ fun deviceEntryParentViewShows() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ repository.sendTransitionStep(step(0.1f))
+ repository.sendTransitionStep(step(0.3f))
+ repository.sendTransitionStep(step(0.5f))
+ repository.sendTransitionStep(step(0.6f))
+ repository.sendTransitionStep(step(1f))
+ deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(1f) }
+ }
@Test
- fun deviceEntryBackgroundView_udfps_alphaFadeIn() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- val deviceEntryBackgroundViewAlpha by
- collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ fun deviceEntryBackgroundView_udfps_alphaFadeIn() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- // fade in
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ // fade in
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(0.1f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(.2f)
+ repository.sendTransitionStep(step(0.1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(.2f)
- repository.sendTransitionStep(step(0.3f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(.6f)
+ repository.sendTransitionStep(step(0.3f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(.6f)
- repository.sendTransitionStep(step(0.6f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
+ repository.sendTransitionStep(step(0.6f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
- }
+ repository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
+ }
@Test
- fun deviceEntryBackgroundView_rearFp_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsRearFps()
- val deviceEntryBackgroundViewAlpha by
- collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- // no updates
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryBackgroundViewAlpha).isNull()
- repository.sendTransitionStep(step(0.1f))
- assertThat(deviceEntryBackgroundViewAlpha).isNull()
- repository.sendTransitionStep(step(0.3f))
- assertThat(deviceEntryBackgroundViewAlpha).isNull()
- repository.sendTransitionStep(step(0.6f))
- assertThat(deviceEntryBackgroundViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryBackgroundViewAlpha).isNull()
- }
+ fun deviceEntryBackgroundView_rearFp_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsRearFps()
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ // no updates
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryBackgroundViewAlpha).isNull()
+ repository.sendTransitionStep(step(0.1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isNull()
+ repository.sendTransitionStep(step(0.3f))
+ assertThat(deviceEntryBackgroundViewAlpha).isNull()
+ repository.sendTransitionStep(step(0.6f))
+ assertThat(deviceEntryBackgroundViewAlpha).isNull()
+ repository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isNull()
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelTest.kt
index 96f69462..db8fbf6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelTest.kt
@@ -20,16 +20,15 @@
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.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,34 +36,25 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class AodToOccludedTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: AodToOccludedTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest = AodToOccludedTransitionViewModel(interactor)
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val underTest = kosmos.aodToOccludedTransitionViewModel
@Test
- fun deviceEntryParentViewHides() = runTest {
- val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
- deviceEntryParentViewAlpha.forEach { Truth.assertThat(it).isEqualTo(0f) }
- }
+ fun deviceEntryParentViewHides() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ repository.sendTransitionStep(step(0.1f))
+ repository.sendTransitionStep(step(0.3f))
+ repository.sendTransitionStep(step(0.4f))
+ repository.sendTransitionStep(step(0.5f))
+ repository.sendTransitionStep(step(0.6f))
+ repository.sendTransitionStep(step(0.8f))
+ repository.sendTransitionStep(step(1f))
+ deviceEntryParentViewAlpha.forEach { Truth.assertThat(it).isEqualTo(0f) }
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
index 1ff46db..c9b14a4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsTest.kt
@@ -19,28 +19,26 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
import com.android.systemui.coroutines.collectValues
-import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
import com.android.systemui.keyguard.shared.model.ScrimAlpha
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.domain.interactor.ShadeInteractor
-import com.android.systemui.statusbar.SysuiStatusBarStateController
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.whenever
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
-import dagger.Lazy
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -51,56 +49,47 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class BouncerToGoneFlowsTest : SysuiTestCase() {
- private lateinit var underTest: BouncerToGoneFlows
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var featureFlags: FakeFeatureFlags
- @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
- @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
- @Mock
- private lateinit var keyguardDismissActionInteractor: Lazy<KeyguardDismissActionInteractor>
@Mock private lateinit var shadeInteractor: ShadeInteractor
private val shadeExpansionStateFlow = MutableStateFlow(0.1f)
+ private val kosmos =
+ testKosmos().apply {
+ featureFlagsClassic.apply {
+ set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false)
+ set(Flags.FULL_SCREEN_USER_SWITCHER, false)
+ }
+ }
+ private val testScope = kosmos.testScope
+ private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ private val shadeRepository = kosmos.shadeRepository
+ private val sysuiStatusBarStateController = kosmos.sysuiStatusBarStateController
+ private val primaryBouncerInteractor = kosmos.primaryBouncerInteractor
+ private val underTest = kosmos.bouncerToGoneFlows
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- whenever(shadeInteractor.shadeExpansion).thenReturn(shadeExpansionStateFlow)
-
- repository = FakeKeyguardTransitionRepository()
- val featureFlags =
- FakeFeatureFlags().apply { set(Flags.REFACTOR_KEYGUARD_DISMISS_INTENT, false) }
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest =
- BouncerToGoneFlows(
- interactor,
- statusBarStateController,
- primaryBouncerInteractor,
- keyguardDismissActionInteractor,
- featureFlags,
- shadeInteractor,
- )
-
whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(false)
- whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(false)
+ sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(false)
}
@Test
fun scrimAlpha_runDimissFromKeyguard_shadeExpanded() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER))
- shadeExpansionStateFlow.value = 1f
+ shadeRepository.setLockscreenShadeExpansion(1f)
whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it.frontAlpha).isEqualTo(0f) }
@@ -110,16 +99,21 @@
@Test
fun scrimAlpha_runDimissFromKeyguard_shadeNotExpanded() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER))
- shadeExpansionStateFlow.value = 0f
+ shadeRepository.setLockscreenShadeExpansion(0f)
whenever(primaryBouncerInteractor.willRunDismissFromKeyguard()).thenReturn(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it).isEqualTo(ScrimAlpha()) }
@@ -127,15 +121,20 @@
@Test
fun scrimBehindAlpha_leaveShadeOpen() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER))
- whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(true)
+ sysuiStatusBarStateController.setLeaveOpenOnKeyguardHide(true)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach {
@@ -145,15 +144,17 @@
@Test
fun scrimBehindAlpha_doNotLeaveShadeOpen() =
- runTest(UnconfinedTestDispatcher()) {
+ testScope.runTest {
val values by collectValues(underTest.scrimAlpha(500.milliseconds, PRIMARY_BOUNCER))
-
- whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(false)
-
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionSteps(
+ listOf(
+ step(0f, TransitionState.STARTED),
+ step(0.3f),
+ step(0.6f),
+ step(1f),
+ ),
+ testScope,
+ )
assertThat(values.size).isEqualTo(4)
values.forEach { assertThat(it.notificationsAlpha).isEqualTo(0f) }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelTest.kt
index 5dccc3b..dd542d4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/DozingToLockscreenTransitionViewModelTest.kt
@@ -25,6 +25,8 @@
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.keyguard.ui.KeyguardTransitionAnimationFlow
+import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
@@ -43,29 +45,36 @@
@Before
fun setUp() {
+ testScope = TestScope()
repository = FakeKeyguardTransitionRepository()
underTest =
DozingToLockscreenTransitionViewModel(
interactor =
KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
+ scope = testScope.backgroundScope,
repository = repository,
)
.keyguardTransitionInteractor,
+ animationFlow =
+ KeyguardTransitionAnimationFlow(
+ scope = testScope.backgroundScope,
+ logger = mock()
+ ),
)
}
@Test
- fun deviceEntryParentViewShows() = runTest {
- val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(1f))
- deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(1f) }
- }
+ fun deviceEntryParentViewShows() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ repository.sendTransitionStep(step(0.1f))
+ repository.sendTransitionStep(step(0.3f))
+ repository.sendTransitionStep(step(0.5f))
+ repository.sendTransitionStep(step(0.6f))
+ repository.sendTransitionStep(step(1f))
+ deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(1f) }
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelTest.kt
index c1444a5..a105008 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelTest.kt
@@ -19,23 +19,19 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -43,37 +39,12 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class GoneToAodTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: GoneToAodTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
- private lateinit var testScope: TestScope
-
- @Before
- fun setUp() {
- val testDispatcher = StandardTestDispatcher()
- testScope = TestScope(testDispatcher)
-
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- biometricSettingsRepository = FakeBiometricSettingsRepository()
-
- underTest =
- GoneToAodTransitionViewModel(
- interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = testScope.backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor,
- deviceEntryUdfpsInteractor =
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = biometricSettingsRepository,
- ),
- )
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val underTest = kosmos.goneToAodTransitionViewModel
+ private val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ private val biometricSettingsRepository = kosmos.biometricSettingsRepository
@Test
fun enterFromTopTranslationY() =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
index 46a7735..f067871 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt
@@ -25,11 +25,16 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.KeyguardClockRepository
+import com.android.systemui.keyguard.data.repository.KeyguardClockRepositoryImpl
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
+import com.android.systemui.plugins.ClockController
+import com.android.systemui.plugins.ClockFaceConfig
+import com.android.systemui.plugins.ClockFaceController
import com.android.systemui.shared.clocks.ClockRegistry
+import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
@@ -50,7 +55,6 @@
private lateinit var scheduler: TestCoroutineScheduler
private lateinit var dispatcher: CoroutineDispatcher
private lateinit var scope: TestScope
-
private lateinit var underTest: KeyguardClockViewModel
private lateinit var keyguardInteractor: KeyguardInteractor
private lateinit var keyguardRepository: KeyguardRepository
@@ -58,6 +62,9 @@
private lateinit var keyguardClockRepository: KeyguardClockRepository
private lateinit var fakeSettings: FakeSettings
@Mock private lateinit var clockRegistry: ClockRegistry
+ @Mock private lateinit var clock: ClockController
+ @Mock private lateinit var largeClock: ClockFaceController
+ @Mock private lateinit var clockFaceConfig: ClockFaceConfig
@Mock private lateinit var eventController: ClockEventController
@Before
fun setup() {
@@ -70,13 +77,21 @@
scheduler = TestCoroutineScheduler()
dispatcher = StandardTestDispatcher(scheduler)
scope = TestScope(dispatcher)
- keyguardClockRepository = KeyguardClockRepository(fakeSettings, clockRegistry, dispatcher)
- keyguardClockInteractor = KeyguardClockInteractor(eventController, keyguardClockRepository)
+ setupMockClock()
+ keyguardClockRepository =
+ KeyguardClockRepositoryImpl(
+ fakeSettings,
+ clockRegistry,
+ eventController,
+ dispatcher,
+ scope.backgroundScope
+ )
+ keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository)
underTest =
KeyguardClockViewModel(
keyguardInteractor,
keyguardClockInteractor,
- scope.backgroundScope
+ scope.backgroundScope,
)
}
@@ -86,7 +101,7 @@
// When use double line clock is disabled,
// should always return small
fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 0)
- keyguardRepository.setClockSize(LARGE)
+ keyguardClockRepository.setClockSize(LARGE)
val value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(SMALL)
}
@@ -95,12 +110,19 @@
fun testClockSize_dynamicClockSize() =
scope.runTest {
fakeSettings.putInt(LOCKSCREEN_USE_DOUBLE_LINE_CLOCK, 1)
- keyguardRepository.setClockSize(SMALL)
+ keyguardClockRepository.setClockSize(SMALL)
var value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(SMALL)
- keyguardRepository.setClockSize(LARGE)
+ keyguardClockRepository.setClockSize(LARGE)
value = collectLastValue(underTest.clockSize)
assertThat(value()).isEqualTo(LARGE)
}
+
+ private fun setupMockClock() {
+ whenever(clock.largeClock).thenReturn(largeClock)
+ whenever(largeClock.config).thenReturn(clockFaceConfig)
+ whenever(clockFaceConfig.hasCustomWeatherDataDisplay).thenReturn(false)
+ whenever(clockRegistry.createCurrentClock()).thenReturn(clock)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
index 88a4aa5..864acfb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardIndicationAreaViewModelTest.kt
@@ -17,7 +17,10 @@
package com.android.systemui.keyguard.ui.viewmodel
import androidx.test.filters.SmallTest
+import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.SysuiTestCase
+import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.doze.util.BurnInHelperWrapper
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
@@ -65,6 +68,9 @@
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
+
+ mSetFlagsRule.disableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
+
whenever(burnInHelperWrapper.burnInOffset(anyInt(), any()))
.thenReturn(RETURNED_BURN_IN_OFFSET)
@@ -83,6 +89,7 @@
keyguardBottomAreaViewModel = bottomAreaViewModel,
burnInHelperWrapper = burnInHelperWrapper,
shortcutsCombinedViewModel = shortcutsCombinedViewModel,
+ configurationInteractor = ConfigurationInteractor(FakeConfigurationRepository()),
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
index a57feda..bc0e416 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt
@@ -21,48 +21,44 @@
import android.view.View
import androidx.test.filters.SmallTest
+import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.Flags as AConfigFlags
import com.android.systemui.Flags.FLAG_NEW_AOD_TRANSITION
-import com.android.systemui.SysUITestComponent
-import com.android.systemui.SysUITestModule
import com.android.systemui.SysuiTestCase
-import com.android.systemui.TestMocksModule
import com.android.systemui.collectLastValue
-import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
-import com.android.systemui.flags.FakeFeatureFlagsClassicModule
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryRepository
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.flags.Flags
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.BurnInInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
-import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.BurnInModel
import com.android.systemui.keyguard.shared.model.KeyguardState
+import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.ClockController
-import com.android.systemui.runCurrent
-import com.android.systemui.runTest
-import com.android.systemui.statusbar.notification.data.repository.FakeNotificationsKeyguardViewStateRepository
-import com.android.systemui.statusbar.phone.DozeParameters
-import com.android.systemui.statusbar.phone.ScreenOffAnimationController
-import com.android.systemui.util.mockito.mock
+import com.android.systemui.statusbar.notification.data.repository.fakeNotificationsKeyguardViewStateRepository
+import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor
+import com.android.systemui.statusbar.phone.dozeParameters
+import com.android.systemui.statusbar.phone.screenOffAnimationController
+import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.ui.isAnimating
import com.android.systemui.util.ui.stopAnimating
import com.android.systemui.util.ui.value
import com.google.common.truth.Truth.assertThat
-import dagger.BindsInstance
-import dagger.Component
import javax.inject.Provider
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.emptyFlow
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
@@ -72,45 +68,48 @@
import org.mockito.Mock
import org.mockito.Mockito.RETURNS_DEEP_STUBS
import org.mockito.Mockito.anyInt
-import org.mockito.Mockito.reset
-import org.mockito.Mockito.withSettings
import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(JUnit4::class)
class KeyguardRootViewModelTest : SysuiTestCase() {
-
+ private val kosmos = testKosmos().apply {
+ featureFlagsClassic.apply { set(Flags.MIGRATE_CLOCKS_TO_BLUEPRINT, false) }
+ }
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardRepository
+ private val configurationRepository = kosmos.fakeConfigurationRepository
+ private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ private val screenOffAnimationController = kosmos.screenOffAnimationController
+ private val deviceEntryRepository = kosmos.fakeDeviceEntryRepository
+ private val notificationsKeyguardInteractor = kosmos.notificationsKeyguardInteractor
+ private val fakeNotificationsKeyguardViewStateRepository =
+ kosmos.fakeNotificationsKeyguardViewStateRepository
+ private val dozeParameters = kosmos.dozeParameters
private lateinit var underTest: KeyguardRootViewModel
- private lateinit var testScope: TestScope
- private lateinit var repository: FakeKeyguardRepository
- private lateinit var keyguardInteractor: KeyguardInteractor
- private lateinit var configurationRepository: FakeConfigurationRepository
+
@Mock private lateinit var burnInInteractor: BurnInInteractor
- @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
+ private val burnInFlow = MutableStateFlow(BurnInModel())
+
@Mock private lateinit var goneToAodTransitionViewModel: GoneToAodTransitionViewModel
+ private val enterFromTopAnimationAlpha = MutableStateFlow(0f)
+
@Mock
private lateinit var aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel
- @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var clockController: ClockController
+ @Mock
+ private lateinit var occludedToLockscreenTransitionViewModel:
+ OccludedToLockscreenTransitionViewModel
+ private val occludedToLockscreenTranslationY = MutableStateFlow(0f)
+ private val occludedToLockscreenAlpha = MutableStateFlow(0f)
- private val burnInFlow = MutableStateFlow(BurnInModel())
- private val goneToAodTransitionViewModelVisibility = MutableStateFlow(0)
- private val enterFromTopAnimationAlpha = MutableStateFlow(0f)
- private val goneToAodTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1)
- private val dozeAmountTransitionStep = MutableSharedFlow<TransitionStep>(replay = 1)
- private val startedKeyguardState = MutableStateFlow(KeyguardState.GONE)
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var clockController: ClockController
@Before
fun setUp() {
- val testDispatcher = StandardTestDispatcher()
- testScope = TestScope(testDispatcher)
MockitoAnnotations.initMocks(this)
mSetFlagsRule.enableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR)
-
- val withDeps = KeyguardInteractorFactory.create()
- keyguardInteractor = withDeps.keyguardInteractor
- repository = withDeps.repository
- configurationRepository = withDeps.configurationRepository
+ mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION)
whenever(goneToAodTransitionViewModel.enterFromTopTranslationY(anyInt()))
.thenReturn(emptyFlow<Float>())
@@ -119,30 +118,29 @@
whenever(burnInInteractor.keyguardBurnIn).thenReturn(burnInFlow)
- whenever(keyguardTransitionInteractor.goneToAodTransition)
- .thenReturn(goneToAodTransitionStep)
- whenever(keyguardTransitionInteractor.dozeAmountTransition)
- .thenReturn(dozeAmountTransitionStep)
- whenever(keyguardTransitionInteractor.startedKeyguardState).thenReturn(startedKeyguardState)
+ whenever(occludedToLockscreenTransitionViewModel.lockscreenTranslationY)
+ .thenReturn(occludedToLockscreenTranslationY)
+ whenever(occludedToLockscreenTransitionViewModel.lockscreenAlpha)
+ .thenReturn(occludedToLockscreenAlpha)
underTest =
KeyguardRootViewModel(
- context,
- deviceEntryInteractor =
- mock { whenever(isBypassEnabled).thenReturn(MutableStateFlow(false)) },
- dozeParameters = mock(),
- keyguardInteractor,
- keyguardTransitionInteractor,
- notificationsKeyguardInteractor =
- mock {
- whenever(areNotificationsFullyHidden).thenReturn(emptyFlow())
- whenever(isPulseExpanding).thenReturn(emptyFlow())
- },
- burnInInteractor,
- goneToAodTransitionViewModel,
- aodToLockscreenTransitionViewModel,
- screenOffAnimationController = mock(),
+ configurationInteractor = kosmos.configurationInteractor,
+ deviceEntryInteractor = kosmos.deviceEntryInteractor,
+ dozeParameters = kosmos.dozeParameters,
+ keyguardInteractor = kosmos.keyguardInteractor,
+ keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
+ notificationsKeyguardInteractor = kosmos.notificationsKeyguardInteractor,
+ burnInInteractor = burnInInteractor,
+ keyguardClockViewModel = kosmos.keyguardClockViewModel,
+ goneToAodTransitionViewModel = goneToAodTransitionViewModel,
+ aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
+ occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
+ screenOffAnimationController = screenOffAnimationController,
+ // TODO(b/310989341): remove after change to aconfig
+ featureFlags = kosmos.featureFlagsClassic
)
+
underTest.clockControllerProvider = Provider { clockController }
}
@@ -150,8 +148,8 @@
fun alpha() =
testScope.runTest {
val value = collectLastValue(underTest.alpha)
+ assertThat(value()).isEqualTo(0f)
- assertThat(value()).isEqualTo(1f)
repository.setKeyguardAlpha(0.1f)
assertThat(value()).isEqualTo(0.1f)
repository.setKeyguardAlpha(0.5f)
@@ -160,6 +158,8 @@
assertThat(value()).isEqualTo(0.2f)
repository.setKeyguardAlpha(0f)
assertThat(value()).isEqualTo(0f)
+ occludedToLockscreenAlpha.value = 0.8f
+ assertThat(value()).isEqualTo(0.8f)
}
@Test
@@ -170,7 +170,15 @@
val scale by collectLastValue(underTest.scale)
// Set to not dozing (on lockscreen)
- dozeAmountTransitionStep.emit(TransitionStep(value = 0f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.AOD,
+ to = KeyguardState.LOCKSCREEN,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ ),
+ validateStep = false,
+ )
// Trigger a change to the burn-in model
burnInFlow.value =
@@ -195,7 +203,15 @@
underTest.statusViewTop = 100
// Set to dozing (on AOD)
- dozeAmountTransitionStep.emit(TransitionStep(value = 1f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.GONE,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ ),
+ validateStep = false,
+ )
// Trigger a change to the burn-in model
burnInFlow.value =
BurnInModel(
@@ -203,12 +219,21 @@
translationY = 30,
scale = 0.5f,
)
+
assertThat(translationX).isEqualTo(20)
assertThat(translationY).isEqualTo(30)
assertThat(scale).isEqualTo(Pair(0.5f, true /* scaleClockOnly */))
// Set to the beginning of GONE->AOD transition
- goneToAodTransitionStep.emit(TransitionStep(value = 0f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.GONE,
+ to = KeyguardState.AOD,
+ value = 0f,
+ transitionState = TransitionState.STARTED
+ ),
+ validateStep = false,
+ )
assertThat(translationX).isEqualTo(0)
assertThat(translationY).isEqualTo(0)
assertThat(scale).isEqualTo(Pair(1f, true /* scaleClockOnly */))
@@ -225,7 +250,16 @@
underTest.topInset = 80
// Set to dozing (on AOD)
- dozeAmountTransitionStep.emit(TransitionStep(value = 1f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.GONE,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ ),
+ validateStep = false,
+ )
+
// Trigger a change to the burn-in model
burnInFlow.value =
BurnInModel(
@@ -239,7 +273,15 @@
assertThat(scale).isEqualTo(Pair(0.5f, true /* scaleClockOnly */))
// Set to the beginning of GONE->AOD transition
- goneToAodTransitionStep.emit(TransitionStep(value = 0f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.GONE,
+ to = KeyguardState.AOD,
+ value = 0f,
+ transitionState = TransitionState.STARTED
+ ),
+ validateStep = false,
+ )
assertThat(translationX).isEqualTo(0)
assertThat(translationY).isEqualTo(0)
assertThat(scale).isEqualTo(Pair(1f, true /* scaleClockOnly */))
@@ -255,7 +297,15 @@
val scale by collectLastValue(underTest.scale)
// Set to dozing (on AOD)
- dozeAmountTransitionStep.emit(TransitionStep(value = 1f))
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.GONE,
+ to = KeyguardState.AOD,
+ value = 1f,
+ transitionState = TransitionState.FINISHED
+ ),
+ validateStep = false,
+ )
// Trigger a change to the burn-in model
burnInFlow.value =
@@ -275,10 +325,15 @@
testScope.runTest {
val burnInLayerVisibility by collectLastValue(underTest.burnInLayerVisibility)
- startedKeyguardState.value = KeyguardState.OCCLUDED
- assertThat(burnInLayerVisibility).isNull()
-
- startedKeyguardState.value = KeyguardState.AOD
+ keyguardTransitionRepository.sendTransitionStep(
+ TransitionStep(
+ from = KeyguardState.LOCKSCREEN,
+ to = KeyguardState.AOD,
+ value = 0f,
+ transitionState = TransitionState.STARTED
+ ),
+ validateStep = false,
+ )
assertThat(burnInLayerVisibility).isEqualTo(View.VISIBLE)
}
@@ -293,165 +348,124 @@
enterFromTopAnimationAlpha.value = 1f
assertThat(burnInLayerAlpha).isEqualTo(1f)
}
-}
-@SmallTest
-class KeyguardRootViewModelTestWithFakes : SysuiTestCase() {
-
- @Component(modules = [SysUITestModule::class])
- @SysUISingleton
- interface TestComponent : SysUITestComponent<KeyguardRootViewModel> {
- val deviceEntryRepository: FakeDeviceEntryRepository
- val notifsKeyguardRepository: FakeNotificationsKeyguardViewStateRepository
- val repository: FakeKeyguardRepository
- val transitionRepository: FakeKeyguardTransitionRepository
-
- @Component.Factory
- interface Factory {
- fun create(
- @BindsInstance test: SysuiTestCase,
- featureFlags: FakeFeatureFlagsClassicModule,
- mocks: TestMocksModule,
- ): TestComponent
- }
- }
-
- private val clockController: ClockController =
- mock(withSettings().defaultAnswer(RETURNS_DEEP_STUBS))
- private val dozeParams: DozeParameters = mock()
- private val screenOffAnimController: ScreenOffAnimationController = mock()
-
- private fun runTest(block: suspend TestComponent.() -> Unit): Unit =
- DaggerKeyguardRootViewModelTestWithFakes_TestComponent.factory()
- .create(
- test = this,
- featureFlags = FakeFeatureFlagsClassicModule(),
- mocks =
- TestMocksModule(
- dozeParameters = dozeParams,
- screenOffAnimationController = screenOffAnimController,
- ),
+ @Test
+ fun iconContainer_isNotVisible_notOnKeyguard_dontShowAodIconsWhenShade() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ keyguardTransitionRepository.sendTransitionSteps(
+ from = KeyguardState.OFF,
+ to = KeyguardState.GONE,
+ testScope,
)
- .runTest {
- reset(clockController)
- underTest.clockControllerProvider = Provider { clockController }
- block()
- }
+ whenever(screenOffAnimationController.shouldShowAodIconsWhenShade()).thenReturn(false)
+ runCurrent()
- @Before
- fun before() {
- mSetFlagsRule.enableFlags(FLAG_NEW_AOD_TRANSITION)
- }
+ assertThat(isVisible?.value).isFalse()
+ assertThat(isVisible?.isAnimating).isFalse()
+ }
@Test
- fun iconContainer_isNotVisible_notOnKeyguard_dontShowAodIconsWhenShade() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- transitionRepository.sendTransitionSteps(
- from = KeyguardState.OFF,
- to = KeyguardState.GONE,
- testScope,
- )
- whenever(screenOffAnimController.shouldShowAodIconsWhenShade()).thenReturn(false)
- runCurrent()
+ fun iconContainer_isVisible_bypassEnabled() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ deviceEntryRepository.setBypassEnabled(true)
+ runCurrent()
- assertThat(isVisible?.value).isFalse()
- assertThat(isVisible?.isAnimating).isFalse()
- }
+ assertThat(isVisible?.value).isTrue()
+ }
@Test
- fun iconContainer_isVisible_bypassEnabled() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- deviceEntryRepository.setBypassEnabled(true)
- runCurrent()
+ fun iconContainer_isNotVisible_pulseExpanding_notBypassing() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(true)
+ deviceEntryRepository.setBypassEnabled(false)
+ runCurrent()
- assertThat(isVisible?.value).isTrue()
- }
+ assertThat(isVisible?.value).isEqualTo(false)
+ }
@Test
- fun iconContainer_isNotVisible_pulseExpanding_notBypassing() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(true)
- deviceEntryRepository.setBypassEnabled(false)
- runCurrent()
+ fun iconContainer_isVisible_notifsFullyHidden_bypassEnabled() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(false)
+ deviceEntryRepository.setBypassEnabled(true)
+ fakeNotificationsKeyguardViewStateRepository.setNotificationsFullyHidden(true)
+ runCurrent()
- assertThat(isVisible?.value).isEqualTo(false)
- }
+ assertThat(isVisible?.value).isTrue()
+ assertThat(isVisible?.isAnimating).isTrue()
+ }
@Test
- fun iconContainer_isVisible_notifsFullyHidden_bypassEnabled() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(false)
- deviceEntryRepository.setBypassEnabled(true)
- notifsKeyguardRepository.setNotificationsFullyHidden(true)
- runCurrent()
+ fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled_aodDisabled() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(false)
+ deviceEntryRepository.setBypassEnabled(false)
+ whenever(dozeParameters.alwaysOn).thenReturn(false)
+ fakeNotificationsKeyguardViewStateRepository.setNotificationsFullyHidden(true)
+ runCurrent()
- assertThat(isVisible?.value).isTrue()
- assertThat(isVisible?.isAnimating).isTrue()
- }
+ assertThat(isVisible?.value).isTrue()
+ assertThat(isVisible?.isAnimating).isFalse()
+ }
@Test
- fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled_aodDisabled() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(false)
- deviceEntryRepository.setBypassEnabled(false)
- whenever(dozeParams.alwaysOn).thenReturn(false)
- notifsKeyguardRepository.setNotificationsFullyHidden(true)
- runCurrent()
+ fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled_displayNeedsBlanking() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(false)
+ deviceEntryRepository.setBypassEnabled(false)
+ whenever(dozeParameters.alwaysOn).thenReturn(true)
+ whenever(dozeParameters.displayNeedsBlanking).thenReturn(true)
+ fakeNotificationsKeyguardViewStateRepository.setNotificationsFullyHidden(true)
+ runCurrent()
- assertThat(isVisible?.value).isTrue()
- assertThat(isVisible?.isAnimating).isFalse()
- }
+ assertThat(isVisible?.value).isTrue()
+ assertThat(isVisible?.isAnimating).isFalse()
+ }
@Test
- fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled_displayNeedsBlanking() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(false)
- deviceEntryRepository.setBypassEnabled(false)
- whenever(dozeParams.alwaysOn).thenReturn(true)
- whenever(dozeParams.displayNeedsBlanking).thenReturn(true)
- notifsKeyguardRepository.setNotificationsFullyHidden(true)
- runCurrent()
+ fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(false)
+ deviceEntryRepository.setBypassEnabled(false)
+ whenever(dozeParameters.alwaysOn).thenReturn(true)
+ whenever(dozeParameters.displayNeedsBlanking).thenReturn(false)
+ fakeNotificationsKeyguardViewStateRepository.setNotificationsFullyHidden(true)
+ runCurrent()
- assertThat(isVisible?.value).isTrue()
- assertThat(isVisible?.isAnimating).isFalse()
- }
+ assertThat(isVisible?.value).isTrue()
+ assertThat(isVisible?.isAnimating).isTrue()
+ }
@Test
- fun iconContainer_isVisible_notifsFullyHidden_bypassDisabled() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(false)
- deviceEntryRepository.setBypassEnabled(false)
- whenever(dozeParams.alwaysOn).thenReturn(true)
- whenever(dozeParams.displayNeedsBlanking).thenReturn(false)
- notifsKeyguardRepository.setNotificationsFullyHidden(true)
- runCurrent()
+ fun isIconContainerVisible_stopAnimation() =
+ testScope.runTest {
+ val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
+ runCurrent()
+ fakeNotificationsKeyguardViewStateRepository.setPulseExpanding(false)
+ deviceEntryRepository.setBypassEnabled(false)
+ whenever(dozeParameters.alwaysOn).thenReturn(true)
+ whenever(dozeParameters.displayNeedsBlanking).thenReturn(false)
+ fakeNotificationsKeyguardViewStateRepository.setNotificationsFullyHidden(true)
+ runCurrent()
- assertThat(isVisible?.value).isTrue()
- assertThat(isVisible?.isAnimating).isTrue()
- }
+ assertThat(isVisible?.isAnimating).isEqualTo(true)
+ isVisible?.stopAnimating()
+ runCurrent()
- @Test
- fun isIconContainerVisible_stopAnimation() = runTest {
- val isVisible by collectLastValue(underTest.isNotifIconContainerVisible)
- runCurrent()
- notifsKeyguardRepository.setPulseExpanding(false)
- deviceEntryRepository.setBypassEnabled(false)
- whenever(dozeParams.alwaysOn).thenReturn(true)
- whenever(dozeParams.displayNeedsBlanking).thenReturn(false)
- notifsKeyguardRepository.setNotificationsFullyHidden(true)
- runCurrent()
-
- assertThat(isVisible?.isAnimating).isEqualTo(true)
- isVisible?.stopAnimating()
- runCurrent()
-
- assertThat(isVisible?.isAnimating).isEqualTo(false)
- }
+ assertThat(isVisible?.isAnimating).isEqualTo(false)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelTest.kt
index 2314c83..c15a2c6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelTest.kt
@@ -18,88 +18,47 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.systemui.SysUITestComponent
-import com.android.systemui.SysUITestModule
import com.android.systemui.SysuiTestCase
-import com.android.systemui.TestMocksModule
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
-import com.android.systemui.collectLastValue
-import com.android.systemui.collectValues
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepository
-import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
+import com.android.systemui.coroutines.collectLastValue
+import com.android.systemui.coroutines.collectValues
import com.android.systemui.flags.Flags.FULL_SCREEN_USER_SWITCHER
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.runCurrent
-import com.android.systemui.runTest
-import com.android.systemui.shade.data.repository.FakeShadeRepository
-import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.shade.data.repository.shadeRepository
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
-import dagger.BindsInstance
-import dagger.Component
import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
@ExperimentalCoroutinesApi
@SmallTest
@RunWith(AndroidJUnit4::class)
class LockscreenToAodTransitionViewModelTest : SysuiTestCase() {
- @SysUISingleton
- @Component(
- modules =
- [
- SysUITestModule::class,
- UserDomainLayerModule::class,
- ]
- )
- interface TestComponent : SysUITestComponent<LockscreenToAodTransitionViewModel> {
- val repository: FakeKeyguardTransitionRepository
- val deviceEntryRepository: FakeDeviceEntryRepository
- val keyguardRepository: FakeKeyguardRepository
- val shadeRepository: FakeShadeRepository
- val fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- val biometricSettingsRepository: FakeBiometricSettingsRepository
-
- @Component.Factory
- interface Factory {
- fun create(
- @BindsInstance test: SysuiTestCase,
- featureFlags: FakeFeatureFlagsClassicModule,
- mocks: TestMocksModule,
- ): TestComponent
- }
- }
-
- private fun TestComponent.shadeExpanded(expanded: Boolean) {
- if (expanded) {
- shadeRepository.setQsExpansion(1f)
- } else {
- keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
- shadeRepository.setQsExpansion(0f)
- shadeRepository.setLockscreenShadeExpansion(0f)
- }
- }
-
- private val testComponent: TestComponent =
- DaggerLockscreenToAodTransitionViewModelTest_TestComponent.factory()
- .create(
- test = this,
- featureFlags =
- FakeFeatureFlagsClassicModule { set(FULL_SCREEN_USER_SWITCHER, true) },
- mocks = TestMocksModule(),
- )
+ private val kosmos =
+ testKosmos().apply { featureFlagsClassic.apply { set(FULL_SCREEN_USER_SWITCHER, false) } }
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val shadeRepository = kosmos.shadeRepository
+ private val keyguardRepository = kosmos.fakeKeyguardRepository
+ private val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ private val biometricSettingsRepository = kosmos.biometricSettingsRepository
+ private val underTest = kosmos.lockscreenToAodTransitionViewModel
@Test
fun backgroundViewAlpha_shadeNotExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
shadeExpanded(false)
runCurrent()
@@ -121,7 +80,7 @@
@Test
fun backgroundViewAlpha_shadeExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
shadeExpanded(true)
runCurrent()
@@ -142,7 +101,7 @@
@Test
fun deviceEntryParentViewAlpha_udfpsEnrolled_shadeNotExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val values by collectValues(underTest.deviceEntryParentViewAlpha)
fingerprintPropertyRepository.supportsUdfps()
biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
@@ -165,7 +124,7 @@
@Test
fun deviceEntryParentViewAlpha_udfpsEnrolled_shadeExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryParentViewAlpha)
fingerprintPropertyRepository.supportsUdfps()
biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
@@ -189,7 +148,7 @@
@Test
fun deviceEntryParentViewAlpha_rearFp_shadeNotExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryParentViewAlpha)
fingerprintPropertyRepository.supportsRearFps()
shadeExpanded(false)
@@ -212,7 +171,7 @@
@Test
fun deviceEntryParentViewAlpha_rearFp_shadeExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val values by collectValues(underTest.deviceEntryParentViewAlpha)
fingerprintPropertyRepository.supportsRearFps()
shadeExpanded(true)
@@ -232,6 +191,16 @@
values.forEach { assertThat(it).isEqualTo(0f) }
}
+ private fun shadeExpanded(expanded: Boolean) {
+ if (expanded) {
+ shadeRepository.setQsExpansion(1f)
+ } else {
+ keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+ shadeRepository.setQsExpansion(0f)
+ shadeRepository.setLockscreenShadeExpansion(0f)
+ }
+ }
+
private fun step(
value: Float,
state: TransitionState = TransitionState.RUNNING
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
index 1494c92..8b05a54 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelTest.kt
@@ -20,16 +20,15 @@
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.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,37 +36,25 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class LockscreenToGoneTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: LockscreenToGoneTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
-
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest =
- LockscreenToGoneTransitionViewModel(
- interactor,
- )
- }
+ private val kosmos = testKosmos()
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val underTest = kosmos.lockscreenToGoneTransitionViewModel
@Test
- fun deviceEntryParentViewHides() = runTest {
- val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.1f))
- repository.sendTransitionStep(step(0.3f))
- repository.sendTransitionStep(step(0.4f))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(0.6f))
- repository.sendTransitionStep(step(0.8f))
- repository.sendTransitionStep(step(1f))
- deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(0f) }
- }
+ fun deviceEntryParentViewHides() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectValues(underTest.deviceEntryParentViewAlpha)
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ repository.sendTransitionStep(step(0.1f))
+ repository.sendTransitionStep(step(0.3f))
+ repository.sendTransitionStep(step(0.4f))
+ repository.sendTransitionStep(step(0.5f))
+ repository.sendTransitionStep(step(0.6f))
+ repository.sendTransitionStep(step(0.8f))
+ repository.sendTransitionStep(step(1f))
+ deviceEntryParentViewAlpha.forEach { assertThat(it).isEqualTo(0f) }
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt
index 049e4e2..b31968c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelTest.kt
@@ -18,81 +18,44 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.systemui.SysUITestComponent
-import com.android.systemui.SysUITestModule
import com.android.systemui.SysuiTestCase
-import com.android.systemui.TestMocksModule
-import com.android.systemui.collectLastValue
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.Flags
-import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
-import com.android.systemui.runCurrent
-import com.android.systemui.runTest
-import com.android.systemui.shade.data.repository.FakeShadeRepository
-import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.shade.data.repository.shadeRepository
+import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth
-import dagger.BindsInstance
-import dagger.Component
import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
@ExperimentalCoroutinesApi
@SmallTest
@RunWith(AndroidJUnit4::class)
class LockscreenToPrimaryBouncerTransitionViewModelTest : SysuiTestCase() {
- @SysUISingleton
- @Component(
- modules =
- [
- SysUITestModule::class,
- UserDomainLayerModule::class,
- ]
- )
- interface TestComponent : SysUITestComponent<LockscreenToPrimaryBouncerTransitionViewModel> {
- val repository: FakeKeyguardTransitionRepository
- val keyguardRepository: FakeKeyguardRepository
- val shadeRepository: FakeShadeRepository
-
- @Component.Factory
- interface Factory {
- fun create(
- @BindsInstance test: SysuiTestCase,
- featureFlags: FakeFeatureFlagsClassicModule,
- mocks: TestMocksModule,
- ): TestComponent
+ private val kosmos =
+ testKosmos().apply {
+ featureFlagsClassic.apply { set(Flags.FULL_SCREEN_USER_SWITCHER, false) }
}
- }
-
- private fun TestComponent.shadeExpanded(expanded: Boolean) {
- if (expanded) {
- shadeRepository.setQsExpansion(1f)
- } else {
- keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
- shadeRepository.setQsExpansion(0f)
- shadeRepository.setLockscreenShadeExpansion(0f)
- }
- }
-
- private val testComponent: TestComponent =
- DaggerLockscreenToPrimaryBouncerTransitionViewModelTest_TestComponent.factory()
- .create(
- test = this,
- featureFlags =
- FakeFeatureFlagsClassicModule { set(Flags.FULL_SCREEN_USER_SWITCHER, true) },
- mocks = TestMocksModule(),
- )
+ private val testScope = kosmos.testScope
+ private val repository = kosmos.fakeKeyguardTransitionRepository
+ private val shadeRepository = kosmos.shadeRepository
+ private val keyguardRepository = kosmos.fakeKeyguardRepository
+ private val underTest = kosmos.lockscreenToPrimaryBouncerTransitionViewModel
@Test
fun deviceEntryParentViewAlpha_shadeExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryParentViewAlpha)
shadeExpanded(true)
runCurrent()
@@ -117,7 +80,7 @@
@Test
fun deviceEntryParentViewAlpha_shadeNotExpanded() =
- testComponent.runTest {
+ testScope.runTest {
val actual by collectLastValue(underTest.deviceEntryParentViewAlpha)
shadeExpanded(false)
runCurrent()
@@ -153,4 +116,14 @@
ownerName = "LockscreenToPrimaryBouncerTransitionViewModelTest"
)
}
+
+ private fun shadeExpanded(expanded: Boolean) {
+ if (expanded) {
+ shadeRepository.setQsExpansion(1f)
+ } else {
+ keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
+ shadeRepository.setQsExpansion(0f)
+ shadeRepository.setLockscreenShadeExpansion(0f)
+ }
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelTest.kt
index 0eb8ff6..5e62317 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelTest.kt
@@ -19,21 +19,18 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,119 +38,105 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class OccludedToAodTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: OccludedToAodTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- biometricSettingsRepository = FakeBiometricSettingsRepository()
-
- underTest =
- OccludedToAodTransitionViewModel(
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor,
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = biometricSettingsRepository,
- ),
- )
- }
+ val biometricSettingsRepository = kosmos.biometricSettingsRepository
+ val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ val underTest = kosmos.occludedToAodTransitionViewModel
@Test
- fun deviceEntryBackgroundViewAlpha() = runTest {
- val deviceEntryBackgroundViewAlpha by
- collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ fun deviceEntryBackgroundViewAlpha() =
+ testScope.runTest {
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- // immediately 0f
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ // immediately 0f
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(0.4f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ keyguardTransitionRepository.sendTransitionStep(step(0.4f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(.85f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ keyguardTransitionRepository.sendTransitionStep(step(.85f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ }
@Test
- fun deviceEntryParentViewAlpha_udfpsEnrolled() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_udfpsEnrolled() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- // immediately 1f
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ // immediately 1f
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(0.5f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(.95f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(.95f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ }
@Test
- fun deviceEntryParentViewAlpha_rearFpEnrolled_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsRearFps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_rearFpEnrolled_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsRearFps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- // no updates
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ // no updates
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(0.5f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(.95f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(.95f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isNull()
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
+ }
@Test
- fun deviceEntryParentViewAlpha_udfpsNotEnrolled_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_udfpsNotEnrolled_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- // no updates
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ // no updates
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(0.5f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(.95f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(.95f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isNull()
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt
index 350b310..9729022 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelTest.kt
@@ -19,21 +19,18 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,113 +38,100 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class PrimaryBouncerToAodTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: PrimaryBouncerToAodTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- biometricSettingsRepository = FakeBiometricSettingsRepository()
- val interactor =
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor
- underTest =
- PrimaryBouncerToAodTransitionViewModel(
- interactor,
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = biometricSettingsRepository,
- ),
- )
- }
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
+
+ val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ val biometricSettingsRepository = kosmos.biometricSettingsRepository
+
+ val underTest = kosmos.primaryBouncerToAodTransitionViewModel
@Test
- fun deviceEntryBackgroundViewAlpha() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- val deviceEntryBackgroundViewAlpha by
- collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ fun deviceEntryBackgroundViewAlpha() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- // immediately 0f
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ // immediately 0f
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(0.4f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ keyguardTransitionRepository.sendTransitionStep(step(0.4f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(.85f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ keyguardTransitionRepository.sendTransitionStep(step(.85f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+ }
@Test
- fun deviceEntryParentViewAlpha_udfpsEnrolled_fadeIn() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_udfpsEnrolled_fadeIn() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
- repository.sendTransitionStep(step(0.5f))
- repository.sendTransitionStep(step(.75f))
- repository.sendTransitionStep(step(1f))
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ keyguardTransitionRepository.sendTransitionStep(step(.75f))
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ }
@Test
- fun deviceEntryParentViewAlpha_rearFpEnrolled_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsRearFps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_rearFpEnrolled_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsRearFps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- // animation doesn't start until the end
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ // animation doesn't start until the end
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(0.5f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(.95f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(.95f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isNull()
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
+ }
@Test
- fun deviceEntryParentViewAlpha_udfpsNotEnrolled_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha_udfpsNotEnrolled_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(0.5f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(.75f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(.75f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isNull()
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(deviceEntryParentViewAlpha).isNull()
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(deviceEntryParentViewAlpha).isNull()
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt
index 24e4920..2c6436e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelTest.kt
@@ -19,21 +19,18 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepository
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
-import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor
-import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
-import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
-import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
+import com.android.systemui.kosmos.testScope
+import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,91 +38,77 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class PrimaryBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() {
- private lateinit var underTest: PrimaryBouncerToLockscreenTransitionViewModel
- private lateinit var repository: FakeKeyguardTransitionRepository
- private lateinit var fingerprintPropertyRepository: FakeFingerprintPropertyRepository
- private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository
+ val kosmos = testKosmos()
+ val testScope = kosmos.testScope
- @Before
- fun setUp() {
- repository = FakeKeyguardTransitionRepository()
- fingerprintPropertyRepository = FakeFingerprintPropertyRepository()
- biometricSettingsRepository = FakeBiometricSettingsRepository()
+ val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
+ val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
+ val biometricSettingsRepository = kosmos.biometricSettingsRepository
- underTest =
- PrimaryBouncerToLockscreenTransitionViewModel(
- KeyguardTransitionInteractorFactory.create(
- scope = TestScope().backgroundScope,
- repository = repository,
- )
- .keyguardTransitionInteractor,
- DeviceEntryUdfpsInteractor(
- fingerprintPropertyRepository = fingerprintPropertyRepository,
- fingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository(),
- biometricSettingsRepository = biometricSettingsRepository,
- ),
- )
- }
+ val underTest = kosmos.primaryBouncerToLockscreenTransitionViewModel
@Test
- fun deviceEntryParentViewAlpha() = runTest {
- val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ fun deviceEntryParentViewAlpha() =
+ testScope.runTest {
+ val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)
- // immediately 1f
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ // immediately 1f
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(0.4f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(0.4f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(.85f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(.85f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(1f))
- assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
+ }
@Test
- fun deviceEntryBackgroundViewAlpha_udfpsEnrolled_show() = runTest {
- fingerprintPropertyRepository.supportsUdfps()
- val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ fun deviceEntryBackgroundViewAlpha_udfpsEnrolled_show() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- // immediately 1f
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(bgViewAlpha).isEqualTo(1f)
+ // immediately 1f
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(bgViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(0.1f))
- assertThat(bgViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(0.1f))
+ assertThat(bgViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(.3f))
- assertThat(bgViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(.3f))
+ assertThat(bgViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(.5f))
- assertThat(bgViewAlpha).isEqualTo(1f)
+ keyguardTransitionRepository.sendTransitionStep(step(.5f))
+ assertThat(bgViewAlpha).isEqualTo(1f)
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(bgViewAlpha).isEqualTo(1f)
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(bgViewAlpha).isEqualTo(1f)
+ }
@Test
- fun deviceEntryBackgroundViewAlpha_rearFpEnrolled_noUpdates() = runTest {
- fingerprintPropertyRepository.supportsRearFps()
- val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
- repository.sendTransitionStep(step(0f, TransitionState.STARTED))
- assertThat(bgViewAlpha).isNull()
+ fun deviceEntryBackgroundViewAlpha_rearFpEnrolled_noUpdates() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsRearFps()
+ val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(bgViewAlpha).isNull()
- repository.sendTransitionStep(step(0.5f))
- assertThat(bgViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(0.5f))
+ assertThat(bgViewAlpha).isNull()
- repository.sendTransitionStep(step(.75f))
- assertThat(bgViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(.75f))
+ assertThat(bgViewAlpha).isNull()
- repository.sendTransitionStep(step(1f))
- assertThat(bgViewAlpha).isNull()
+ keyguardTransitionRepository.sendTransitionStep(step(1f))
+ assertThat(bgViewAlpha).isNull()
- repository.sendTransitionStep(step(1f, TransitionState.FINISHED))
- assertThat(bgViewAlpha).isNull()
- }
+ keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
+ assertThat(bgViewAlpha).isNull()
+ }
private fun step(
value: Float,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
index d6e2e97..2f35380 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt
@@ -61,7 +61,6 @@
import com.android.internal.logging.InstanceId
import com.android.internal.widget.CachingIconView
import com.android.systemui.ActivityIntentHelper
-import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.bluetooth.BroadcastDialogController
import com.android.systemui.broadcast.BroadcastSender
@@ -81,12 +80,14 @@
import com.android.systemui.media.controls.models.recommendation.SmartspaceMediaData
import com.android.systemui.media.controls.pipeline.EMPTY_SMARTSPACE_MEDIA_DATA
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.controls.util.MediaUiEventLogger
import com.android.systemui.media.dialog.MediaOutputDialogFactory
import com.android.systemui.monet.ColorScheme
import com.android.systemui.monet.Style
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager
+import com.android.systemui.res.R
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.surfaceeffects.ripple.MultiRippleView
@@ -232,6 +233,7 @@
this.set(Flags.UMO_TURBULENCE_NOISE, false)
}
@Mock private lateinit var globalSettings: GlobalSettings
+ @Mock private lateinit var mediaFlags: MediaFlags
@JvmField @Rule val mockito = MockitoJUnit.rule()
@@ -251,6 +253,7 @@
.thenReturn(applicationInfo)
whenever(packageManager.getApplicationLabel(any())).thenReturn(PACKAGE)
context.setMockPackageManager(packageManager)
+ whenever(mediaFlags.isSceneContainerEnabled()).thenReturn(false)
player =
object :
@@ -273,7 +276,8 @@
lockscreenUserManager,
broadcastDialogController,
fakeFeatureFlag,
- globalSettings
+ globalSettings,
+ mediaFlags,
) {
override fun loadAnimator(
animId: Int,
@@ -1884,7 +1888,8 @@
@Test
fun bindRecommendation_listHasTooFewRecs_notDisplayed() {
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -1911,7 +1916,8 @@
@Test
fun bindRecommendation_listHasTooFewRecsWithIcons_notDisplayed() {
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -1955,7 +1961,8 @@
val subtitle1 = "Subtitle1"
val subtitle2 = "Subtitle2"
val subtitle3 = "Subtitle3"
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
@@ -1998,7 +2005,12 @@
listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("fake subtitle")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
@@ -2013,7 +2025,8 @@
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -2047,7 +2060,8 @@
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
- val icon = Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
+ val icon =
+ Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata)
val data =
smartspaceData.copy(
recommendations =
@@ -2086,7 +2100,12 @@
listOf(
SmartspaceAction.Builder("id1", "title1")
.setSubtitle("")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "title2")
@@ -2096,7 +2115,12 @@
.build(),
SmartspaceAction.Builder("id3", "title3")
.setSubtitle("")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_3g_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_3g_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
@@ -2119,7 +2143,12 @@
listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("subtitle1")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_1x_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_1x_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "")
@@ -2129,7 +2158,12 @@
.build(),
SmartspaceAction.Builder("id3", "")
.setSubtitle("subtitle3")
- .setIcon(Icon.createWithResource(context, com.android.settingslib.R.drawable.ic_3g_mobiledata))
+ .setIcon(
+ Icon.createWithResource(
+ context,
+ com.android.settingslib.R.drawable.ic_3g_mobiledata
+ )
+ )
.setExtras(Bundle.EMPTY)
.build()
)
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 db7c987..73885f4 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
@@ -32,6 +32,7 @@
import com.android.systemui.dreams.DreamOverlayStateController
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.media.controls.pipeline.MediaDataManager
+import com.android.systemui.media.controls.util.MediaFlags
import com.android.systemui.media.dream.MediaDreamComplication
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.res.R
@@ -94,6 +95,7 @@
@Mock private lateinit var dreamOverlayStateController: DreamOverlayStateController
@Mock private lateinit var shadeInteractor: ShadeInteractor
@Mock lateinit var logger: MediaViewLogger
+ @Mock private lateinit var mediaFlags: MediaFlags
@Captor
private lateinit var wakefullnessObserver: ArgumentCaptor<(WakefulnessLifecycle.Observer)>
@Captor
@@ -126,6 +128,7 @@
whenever(mediaCarouselController.mediaFrame).thenReturn(mediaFrame)
isQsBypassingShade = MutableStateFlow(false)
whenever(shadeInteractor.isQsBypassingShade).thenReturn(isQsBypassingShade)
+ whenever(mediaFlags.isSceneContainerEnabled()).thenReturn(false)
mediaHierarchyManager =
MediaHierarchyManager(
context,
@@ -145,6 +148,7 @@
testScope.backgroundScope,
ResourcesSplitShadeStateController(),
logger,
+ mediaFlags,
)
verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture())
verify(statusBarStateController).addCallback(statusBarCallback.capture())
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
new file mode 100644
index 0000000..02d40da
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImplTest.kt
@@ -0,0 +1,130 @@
+/*
+ * 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.qs.tiles.base.viewmodel
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.classifier.FalsingManagerFake
+import com.android.systemui.common.shared.model.ContentDescription
+import com.android.systemui.common.shared.model.Icon
+import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics
+import com.android.systemui.qs.tiles.base.interactor.FakeDisabledByPolicyInteractor
+import com.android.systemui.qs.tiles.base.interactor.FakeQSTileDataInteractor
+import com.android.systemui.qs.tiles.base.interactor.FakeQSTileUserActionInteractor
+import com.android.systemui.qs.tiles.base.interactor.QSTileDataToStateMapper
+import com.android.systemui.qs.tiles.base.logging.QSTileLogger
+import com.android.systemui.qs.tiles.viewmodel.QSTileConfig
+import com.android.systemui.qs.tiles.viewmodel.QSTileConfigTestBuilder
+import com.android.systemui.qs.tiles.viewmodel.QSTilePolicy
+import com.android.systemui.qs.tiles.viewmodel.QSTileState
+import com.android.systemui.user.data.repository.FakeUserRepository
+import com.android.systemui.util.time.FakeSystemClock
+import com.google.common.truth.Truth.assertThat
+import java.io.PrintWriter
+import java.io.StringWriter
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.test.StandardTestDispatcher
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.runCurrent
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class QSTileViewModelImplTest : SysuiTestCase() {
+
+ @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule()
+
+ @Mock private lateinit var qsTileLogger: QSTileLogger
+ @Mock private lateinit var qsTileAnalytics: QSTileAnalytics
+
+ private val userRepository = FakeUserRepository()
+ private val tileDataInteractor = FakeQSTileDataInteractor<Any>()
+ private val tileUserActionInteractor = FakeQSTileUserActionInteractor<Any>()
+ private val disabledByPolicyInteractor = FakeDisabledByPolicyInteractor()
+ private val falsingManager = FalsingManagerFake()
+
+ private val testCoroutineDispatcher = StandardTestDispatcher()
+ private val testScope = TestScope(testCoroutineDispatcher)
+
+ private lateinit var underTest: QSTileViewModelImpl<Any>
+
+ @Before
+ fun setup() {
+ underTest =
+ QSTileViewModelImpl(
+ QSTileConfigTestBuilder.build {
+ policy = QSTilePolicy.Restricted("test_restriction")
+ },
+ { tileUserActionInteractor },
+ { tileDataInteractor },
+ {
+ object : QSTileDataToStateMapper<Any> {
+ override fun map(config: QSTileConfig, data: Any): QSTileState =
+ QSTileState.build(
+ { Icon.Resource(0, ContentDescription.Resource(0)) },
+ data.toString()
+ ) {}
+ }
+ },
+ disabledByPolicyInteractor,
+ userRepository,
+ falsingManager,
+ qsTileAnalytics,
+ qsTileLogger,
+ FakeSystemClock(),
+ testCoroutineDispatcher,
+ testScope.backgroundScope,
+ )
+ }
+
+ @Test
+ fun dumpWritesState() =
+ testScope.runTest {
+ tileDataInteractor.emitData("test_data")
+ underTest.state.launchIn(backgroundScope)
+ runCurrent()
+
+ val sw = StringWriter()
+ PrintWriter(sw).use { underTest.dump(it, emptyArray()) }
+
+ assertThat(sw.buffer.toString())
+ .isEqualTo(
+ "test_spec:\n" +
+ " QSTileState(" +
+ "icon=() -> com.android.systemui.common.shared.model.Icon, " +
+ "label=test_data, " +
+ "activationState=INACTIVE, " +
+ "secondaryLabel=null, " +
+ "supportedActions=[CLICK], " +
+ "contentDescription=null, " +
+ "stateDescription=null, " +
+ "sideViewIcon=None, " +
+ "enabledState=ENABLED, " +
+ "expandedAccessibilityClassName=android.widget.Switch)\n"
+ )
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
index 1b4ba64..cb90cc5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingControllerTest.java
@@ -328,7 +328,7 @@
}
@Override
- public SystemUIDialog create(DialogDelegate<SystemUIDialog> delegate) {
+ public SystemUIDialog create(SystemUIDialog.Delegate delegate) {
SystemUIDialog dialog = super.create(delegate);
mLastDelegate = delegate;
mLastCreatedDialog = dialog;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
index c848287..8f696e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegateTest.kt
@@ -89,8 +89,9 @@
userContextProvider,
onStartRecordingClicked,
mediaProjectionMetricsLogger,
+ systemUIDialogFactory
)
- dialog = systemUIDialogFactory.create(delegate)
+ dialog = delegate.createDialog()
delegate.onCreate(dialog, savedInstanceState = null)
whenever(flags.isEnabled(Flags.WM_ENABLE_PARTIAL_SCREEN_SHARING)).thenReturn(true)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index 03878b7..b0b29e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -96,6 +96,7 @@
import com.android.systemui.keyguard.KeyguardViewConfigurator;
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardBottomAreaInteractor;
+import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardFaceAuthInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
@@ -343,6 +344,7 @@
protected final int mMaxUdfpsBurnInOffsetY = 5;
protected FakeFeatureFlagsClassic mFeatureFlags = new FakeFeatureFlagsClassic();
protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor;
+ protected KeyguardClockInteractor mKeyguardClockInteractor;
protected FakeKeyguardRepository mFakeKeyguardRepository;
protected KeyguardInteractor mKeyguardInteractor;
protected SceneTestUtils mUtils = new SceneTestUtils(this);
@@ -527,7 +529,7 @@
.thenReturn(emptyFlow());
when(mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha())
.thenReturn(emptyFlow());
- when(mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(anyInt()))
+ when(mOccludedToLockscreenTransitionViewModel.getLockscreenTranslationY())
.thenReturn(emptyFlow());
// Lockscreen->Dreaming
@@ -565,7 +567,7 @@
.thenReturn(emptyFlow());
when(mLockscreenToOccludedTransitionViewModel.getLockscreenAlpha())
.thenReturn(emptyFlow());
- when(mLockscreenToOccludedTransitionViewModel.lockscreenTranslationY(anyInt()))
+ when(mLockscreenToOccludedTransitionViewModel.getLockscreenTranslationY())
.thenReturn(emptyFlow());
// Primary Bouncer->Gone
@@ -696,6 +698,7 @@
systemClock,
mKeyguardBottomAreaViewModel,
mKeyguardBottomAreaInteractor,
+ mKeyguardClockInteractor,
mAlternateBouncerInteractor,
mDreamingToLockscreenTransitionViewModel,
mOccludedToLockscreenTransitionViewModel,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index 36b4435..28fe8e4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -362,6 +362,28 @@
}
@Test
+ public void onInterceptTouchEvent_nsslMigrationOff_userActivity() {
+ mSetFlagsRule.disableFlags(com.android.systemui.Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL);
+
+ mTouchHandler.onInterceptTouchEvent(MotionEvent.obtain(0L /* downTime */,
+ 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
+ 0 /* metaState */));
+
+ verify(mCentralSurfaces).userActivity();
+ }
+
+ @Test
+ public void onInterceptTouchEvent_nsslMigrationOn_userActivity_not_called() {
+ mSetFlagsRule.enableFlags(com.android.systemui.Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL);
+
+ mTouchHandler.onInterceptTouchEvent(MotionEvent.obtain(0L /* downTime */,
+ 0L /* eventTime */, MotionEvent.ACTION_DOWN, 0f /* x */, 0f /* y */,
+ 0 /* metaState */));
+
+ verify(mCentralSurfaces, times(0)).userActivity();
+ }
+
+ @Test
public void testOnTouchEvent_expansionResumesAfterBriefTouch() {
mFalsingManager.setIsClassifierEnabled(true);
mFalsingManager.setIsFalseTouch(false);
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 39b306b..39739e7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
@@ -53,6 +53,7 @@
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository;
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlagsClassic;
import com.android.systemui.keyguard.KeyguardViewMediator;
@@ -190,7 +191,7 @@
powerInteractor,
sceneContainerFlags,
new FakeKeyguardBouncerRepository(),
- configurationRepository,
+ new ConfigurationInteractor(configurationRepository),
shadeRepository,
() -> sceneInteractor);
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 0587633..6ff7966 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt
@@ -98,7 +98,6 @@
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
-import java.util.Optional
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.test.TestScope
@@ -113,8 +112,9 @@
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
-import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
+import java.util.Optional
+import org.mockito.Mockito.`when` as whenever
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@@ -446,6 +446,26 @@
}
@Test
+ fun handleDispatchTouchEvent_nsslMigrationOff_userActivity_not_called() {
+ mSetFlagsRule.disableFlags(Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL)
+ underTest.setStatusBarViewController(phoneStatusBarViewController)
+
+ interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
+
+ verify(centralSurfaces, times(0)).userActivity()
+ }
+
+ @Test
+ fun handleDispatchTouchEvent_nsslMigrationOn_userActivity() {
+ mSetFlagsRule.enableFlags(Flags.FLAG_KEYGUARD_SHADE_MIGRATION_NSSL)
+ underTest.setStatusBarViewController(phoneStatusBarViewController)
+
+ interactionEventHandler.handleDispatchTouchEvent(DOWN_EVENT)
+
+ verify(centralSurfaces).userActivity()
+ }
+
+ @Test
fun shouldInterceptTouchEvent_statusBarKeyguardViewManagerShouldIntercept() {
// down event should be intercepted by keyguardViewManager
whenever(statusBarKeyguardViewManager.shouldInterceptTouchEvent(DOWN_EVENT))
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
index 62c0ebe..e723d7d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java
@@ -40,6 +40,7 @@
import com.android.systemui.SysuiTestCase;
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository;
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository;
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlagsClassic;
import com.android.systemui.flags.FeatureFlags;
@@ -228,7 +229,7 @@
powerInteractor,
sceneContainerFlags,
new FakeKeyguardBouncerRepository(),
- configurationRepository,
+ new ConfigurationInteractor(configurationRepository),
mShadeRepository,
() -> sceneInteractor);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
index 5f8777d..f8aa359 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt
@@ -225,4 +225,13 @@
underTest.setLegacyQsFullscreen(true)
assertThat(underTest.legacyQsFullscreen.value).isEqualTo(true)
}
+
+ @Test
+ fun updateLegacyIsClosing() =
+ testScope.runTest {
+ assertThat(underTest.legacyIsClosing.value).isEqualTo(false)
+
+ underTest.setLegacyIsClosing(true)
+ assertThat(underTest.legacyIsClosing.value).isEqualTo(true)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt
new file mode 100644
index 0000000..40006ba
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeAnimationInteractorSceneContainerImplTest.kt
@@ -0,0 +1,149 @@
+/*
+ * 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.shade.domain.interactor
+
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysUITestComponent
+import com.android.systemui.SysUITestModule
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.TestMocksModule
+import com.android.systemui.collectLastValue
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.flags.FakeFeatureFlagsClassicModule
+import com.android.systemui.flags.Flags
+import com.android.systemui.runCurrent
+import com.android.systemui.runTest
+import com.android.systemui.scene.domain.interactor.SceneInteractor
+import com.android.systemui.scene.shared.model.ObservableTransitionState
+import com.android.systemui.scene.shared.model.SceneKey
+import com.android.systemui.statusbar.phone.DozeParameters
+import com.android.systemui.user.domain.UserDomainLayerModule
+import com.android.systemui.util.mockito.mock
+import com.google.common.truth.Truth
+import dagger.BindsInstance
+import dagger.Component
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import org.junit.Test
+
+@SmallTest
+class ShadeAnimationInteractorSceneContainerImplTest : SysuiTestCase() {
+
+ @SysUISingleton
+ @Component(
+ modules =
+ [
+ SysUITestModule::class,
+ UserDomainLayerModule::class,
+ ]
+ )
+ interface TestComponent : SysUITestComponent<ShadeAnimationInteractorSceneContainerImpl> {
+ val sceneInteractor: SceneInteractor
+
+ @Component.Factory
+ interface Factory {
+ fun create(
+ @BindsInstance test: SysuiTestCase,
+ featureFlags: FakeFeatureFlagsClassicModule,
+ mocks: TestMocksModule,
+ ): TestComponent
+ }
+ }
+
+ private val dozeParameters: DozeParameters = mock()
+
+ private val testComponent: TestComponent =
+ DaggerShadeAnimationInteractorSceneContainerImplTest_TestComponent.factory()
+ .create(
+ test = this,
+ featureFlags =
+ FakeFeatureFlagsClassicModule { set(Flags.FULL_SCREEN_USER_SWITCHER, true) },
+ mocks =
+ TestMocksModule(
+ dozeParameters = dozeParameters,
+ ),
+ )
+
+ @Test
+ fun isAnyCloseAnimationRunning_qsToShade() =
+ testComponent.runTest() {
+ val actual by collectLastValue(underTest.isAnyCloseAnimationRunning)
+
+ // WHEN transitioning from QS to Shade
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Transition(
+ fromScene = SceneKey.QuickSettings,
+ toScene = SceneKey.Shade,
+ progress = MutableStateFlow(.1f),
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(false),
+ )
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ runCurrent()
+
+ // THEN qs is animating closed
+ Truth.assertThat(actual).isFalse()
+ }
+
+ @Test
+ fun isAnyCloseAnimationRunning_qsToGone_userInputNotOngoing() =
+ testComponent.runTest() {
+ val actual by collectLastValue(underTest.isAnyCloseAnimationRunning)
+
+ // WHEN transitioning from QS to Gone with no ongoing user input
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Transition(
+ fromScene = SceneKey.QuickSettings,
+ toScene = SceneKey.Gone,
+ progress = MutableStateFlow(.1f),
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(false),
+ )
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ runCurrent()
+
+ // THEN qs is animating closed
+ Truth.assertThat(actual).isTrue()
+ }
+
+ @Test
+ fun isAnyCloseAnimationRunning_qsToGone_userInputOngoing() =
+ testComponent.runTest() {
+ val actual by collectLastValue(underTest.isAnyCloseAnimationRunning)
+
+ // WHEN transitioning from QS to Gone with user input ongoing
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Transition(
+ fromScene = SceneKey.QuickSettings,
+ toScene = SceneKey.Gone,
+ progress = MutableStateFlow(.1f),
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(true),
+ )
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ runCurrent()
+
+ // THEN qs is not animating closed
+ Truth.assertThat(actual).isFalse()
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
index 565e20a..310b86f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorSceneContainerImplTest.kt
@@ -127,22 +127,22 @@
val actual by collectLastValue(underTest.qsExpansion)
// WHEN split shade is enabled and QS is expanded
- keyguardRepository.setStatusBarState(StatusBarState.SHADE)
overrideResource(R.bool.config_use_split_notification_shade, true)
configurationRepository.onAnyConfigurationChange()
- val progress = MutableStateFlow(.3f)
+ runCurrent()
val transitionState =
MutableStateFlow<ObservableTransitionState>(
ObservableTransitionState.Transition(
fromScene = SceneKey.QuickSettings,
toScene = SceneKey.Shade,
- progress = progress,
+ progress = MutableStateFlow(.3f),
isInitiatedByUserInput = false,
isUserInputOngoing = flowOf(false),
)
)
sceneInteractor.setTransitionState(transitionState)
runCurrent()
+ keyguardRepository.setStatusBarState(StatusBarState.SHADE)
// THEN legacy shade expansion is passed through
Truth.assertThat(actual).isEqualTo(.3f)
@@ -157,6 +157,8 @@
// WHEN split shade is not enabled and QS is expanded
keyguardRepository.setStatusBarState(StatusBarState.SHADE)
overrideResource(R.bool.config_use_split_notification_shade, false)
+ configurationRepository.onAnyConfigurationChange()
+ runCurrent()
val progress = MutableStateFlow(.3f)
val transitionState =
MutableStateFlow<ObservableTransitionState>(
@@ -182,13 +184,12 @@
// WHEN scene transition active
keyguardRepository.setStatusBarState(StatusBarState.SHADE)
- val progress = MutableStateFlow(.3f)
val transitionState =
MutableStateFlow<ObservableTransitionState>(
ObservableTransitionState.Transition(
fromScene = SceneKey.QuickSettings,
toScene = SceneKey.Shade,
- progress = progress,
+ progress = MutableStateFlow(.3f),
isInitiatedByUserInput = false,
isUserInputOngoing = flowOf(false),
)
@@ -347,6 +348,52 @@
Truth.assertThat(expansionAmount).isEqualTo(0f)
}
+ fun isQsBypassingShade_goneToQs() =
+ testComponent.runTest() {
+ val actual by collectLastValue(underTest.isQsBypassingShade)
+
+ // WHEN transitioning from QS directly to Gone
+ configurationRepository.onAnyConfigurationChange()
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Transition(
+ fromScene = SceneKey.Gone,
+ toScene = SceneKey.QuickSettings,
+ progress = MutableStateFlow(.1f),
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(false),
+ )
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ runCurrent()
+
+ // THEN qs is bypassing shade
+ Truth.assertThat(actual).isTrue()
+ }
+
+ fun isQsBypassingShade_shadeToQs() =
+ testComponent.runTest() {
+ val actual by collectLastValue(underTest.isQsBypassingShade)
+
+ // WHEN transitioning from QS to Shade
+ configurationRepository.onAnyConfigurationChange()
+ val transitionState =
+ MutableStateFlow<ObservableTransitionState>(
+ ObservableTransitionState.Transition(
+ fromScene = SceneKey.Shade,
+ toScene = SceneKey.QuickSettings,
+ progress = MutableStateFlow(.1f),
+ isInitiatedByUserInput = false,
+ isUserInputOngoing = flowOf(false),
+ )
+ )
+ sceneInteractor.setTransitionState(transitionState)
+ runCurrent()
+
+ // THEN qs is not bypassing shade
+ Truth.assertThat(actual).isFalse()
+ }
+
@Test
fun lockscreenShadeExpansion_transitioning_toAndFromDifferentScenes() =
testComponent.runTest() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
index 7546dfa..dff91dd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt
@@ -26,6 +26,7 @@
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.classifier.FalsingCollectorFake
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
@@ -121,7 +122,7 @@
powerInteractor,
sceneContainerFlags,
FakeKeyguardBouncerRepository(),
- configurationRepository,
+ ConfigurationInteractor(configurationRepository),
shadeRepository,
utils::sceneInteractor
)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
index e488f39..bd46474 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java
@@ -34,12 +34,14 @@
import androidx.test.filters.SmallTest;
+import com.android.keyguard.TestScopeProvider;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shade.ShadeStateEvents;
import com.android.systemui.shade.ShadeStateEvents.ShadeStateEventsListener;
+import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder;
@@ -51,6 +53,7 @@
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
@@ -62,6 +65,10 @@
import org.mockito.MockitoAnnotations;
import org.mockito.verification.VerificationMode;
+import kotlinx.coroutines.flow.MutableStateFlow;
+import kotlinx.coroutines.flow.StateFlowKt;
+import kotlinx.coroutines.test.TestScope;
+
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -78,6 +85,7 @@
@Mock private ShadeStateEvents mShadeStateEvents;
@Mock private VisibilityLocationProvider mVisibilityLocationProvider;
@Mock private VisualStabilityProvider mVisualStabilityProvider;
+ @Mock private ShadeAnimationInteractor mShadeAnimationInteractor;
@Captor private ArgumentCaptor<WakefulnessLifecycle.Observer> mWakefulnessObserverCaptor;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mSBStateListenerCaptor;
@@ -86,6 +94,9 @@
private FakeSystemClock mFakeSystemClock = new FakeSystemClock();
private FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock);
+ private final TestScope mTestScope = TestScopeProvider.getTestScope();
+ private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope());
+ private final MutableStateFlow<Boolean> mShadeClosing = StateFlowKt.MutableStateFlow(false);
private WakefulnessLifecycle.Observer mWakefulnessObserver;
private StatusBarStateController.StateListener mStatusBarStateListener;
@@ -103,11 +114,13 @@
mDumpManager,
mHeadsUpManager,
mShadeStateEvents,
+ mShadeAnimationInteractor,
+ mJavaAdapter,
mStatusBarStateController,
mVisibilityLocationProvider,
mVisualStabilityProvider,
mWakefulnessLifecycle);
-
+ when(mShadeAnimationInteractor.isAnyCloseAnimationRunning()).thenReturn(mShadeClosing);
mCoordinator.attach(mNotifPipeline);
// capture arguments:
@@ -549,7 +562,8 @@
}
private void setPanelCollapsing(boolean collapsing) {
- mNotifPanelEventsCallback.onPanelCollapsingChanged(collapsing);
+ mShadeClosing.setValue(collapsing);
+ mTestScope.getTestScheduler().runCurrent();
}
private void setPulsing(boolean pulsing) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
index 7415645..349a35eb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/icon/ui/viewmodel/NotificationIconContainerStatusBarViewModelTest.kt
@@ -285,28 +285,13 @@
assertThat(iconColors.tint).isEqualTo(0xAABBCC)
- val staticDrawableColor = iconColors.staticDrawableColor(Rect(), isColorized = true)
+ val staticDrawableColor = iconColors.staticDrawableColor(Rect())
assertThat(staticDrawableColor).isEqualTo(0xAABBCC)
}
@Test
- fun iconColors_staticDrawableColor_nonColorized() =
- testComponent.runTest {
- darkIconRepository.darkState.value =
- SysuiDarkIconDispatcher.DarkChange(
- emptyList(),
- 0f,
- 0xAABBCC,
- )
- val iconColorsLookup by collectLastValue(underTest.iconColors)
- val iconColors = iconColorsLookup?.iconColors(Rect())
- val staticDrawableColor = iconColors?.staticDrawableColor(Rect(), isColorized = false)
- assertThat(staticDrawableColor).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
- }
-
- @Test
- fun iconColors_staticDrawableColor_isColorized_notInDarkTintArea() =
+ fun iconColors_staticDrawableColor_notInDarkTintArea() =
testComponent.runTest {
darkIconRepository.darkState.value =
SysuiDarkIconDispatcher.DarkChange(
@@ -316,8 +301,7 @@
)
val iconColorsLookup by collectLastValue(underTest.iconColors)
val iconColors = iconColorsLookup?.iconColors(Rect(1, 1, 4, 4))
- val staticDrawableColor =
- iconColors?.staticDrawableColor(Rect(6, 6, 7, 7), isColorized = true)
+ val staticDrawableColor = iconColors?.staticDrawableColor(Rect(6, 6, 7, 7))
assertThat(staticDrawableColor).isEqualTo(DarkIconDispatcher.DEFAULT_ICON_TINT)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
index 62a2bc5..5102b4f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java
@@ -55,6 +55,7 @@
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository;
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository;
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.flags.FakeFeatureFlagsClassic;
import com.android.systemui.flags.Flags;
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
@@ -167,7 +168,7 @@
PowerInteractorFactory.create().getPowerInteractor(),
mSceneTestUtils.getSceneContainerFlags(),
new FakeKeyguardBouncerRepository(),
- new FakeConfigurationRepository(),
+ new ConfigurationInteractor(new FakeConfigurationRepository()),
new FakeShadeRepository(),
() -> mSceneTestUtils.sceneInteractor());
mViewModel =
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
index 59bf9f3..9419d63 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt
@@ -20,6 +20,7 @@
import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
@@ -56,7 +57,7 @@
PowerInteractorFactory.create().powerInteractor,
sceneTestUtils.sceneContainerFlags,
FakeKeyguardBouncerRepository(),
- FakeConfigurationRepository(),
+ ConfigurationInteractor(FakeConfigurationRepository()),
FakeShadeRepository(),
) {
sceneTestUtils.sceneInteractor()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 52c25f7..8585d46 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -96,6 +96,7 @@
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository;
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.flags.FakeFeatureFlagsClassic;
@@ -415,7 +416,7 @@
powerInteractor,
sceneContainerFlags,
new FakeKeyguardBouncerRepository(),
- configurationRepository,
+ new ConfigurationInteractor(configurationRepository),
shadeRepository,
() -> sceneInteractor);
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/keyguard/logging/BiometricUnlockLoggerKosmos.kt
similarity index 74%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/keyguard/logging/BiometricUnlockLoggerKosmos.kt
index f4feee1..f55ae2f 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/keyguard/logging/BiometricUnlockLoggerKosmos.kt
@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.keyguard.logging
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.biometricUnlockLogger by Kosmos.Fixture { mock<BiometricUnlockLogger>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/keyguard/logging/KeyguardTransitionAnimationLoggerKosmos.kt
similarity index 71%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/keyguard/logging/KeyguardTransitionAnimationLoggerKosmos.kt
index f4feee1..db2a87e 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/keyguard/logging/KeyguardTransitionAnimationLoggerKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.keyguard.logging
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.keyguardTransitionAnimationLogger by
+ Kosmos.Fixture { mock<KeyguardTransitionAnimationLogger>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
index f57ace9..b28af46 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/TestMocksModule.kt
@@ -29,7 +29,9 @@
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.ScreenLifecycle
import com.android.systemui.keyguard.WakefulnessLifecycle
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.log.LogBuffer
+import com.android.systemui.log.dagger.BiometricLog
import com.android.systemui.log.dagger.BroadcastDispatcherLog
import com.android.systemui.log.dagger.SceneFrameworkLog
import com.android.systemui.media.controls.ui.MediaHierarchyManager
@@ -54,6 +56,7 @@
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
import com.android.systemui.statusbar.phone.ScrimController
+import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.ZenModeController
import com.android.systemui.statusbar.window.StatusBarWindowController
@@ -106,12 +109,16 @@
val unfoldTransitionProgressProvider: Optional<UnfoldTransitionProgressProvider> =
Optional.empty(),
@get:Provides val zenModeController: ZenModeController = mock(),
+ @get:Provides val systemUIDialogManager: SystemUIDialogManager = mock(),
+ @get:Provides val deviceEntryIconTransitions: Set<DeviceEntryIconTransition> = emptySet(),
// log buffers
@get:[Provides BroadcastDispatcherLog]
val broadcastDispatcherLogger: LogBuffer = mock(),
@get:[Provides SceneFrameworkLog]
val sceneLogger: LogBuffer = mock(),
+ @get:[Provides BiometricLog]
+ val biometricLogger: LogBuffer = mock(),
@get:Provides val lsShadeTransitionLogger: LSShadeTransitionLogger = mock(),
// framework mocks
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt
new file mode 100644
index 0000000..5475659
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/biometrics/ui/viewmodel/DeviceEntryUdfpsTouchOverlayViewModelKosmos.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.biometrics.ui.viewmodel
+
+import com.android.systemui.keyguard.ui.viewmodel.deviceEntryIconViewModel
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.phone.systemUIDialogManager
+
+val Kosmos.deviceEntryUdfpsTouchOverlayViewModel by Fixture {
+ DeviceEntryUdfpsTouchOverlayViewModel(
+ deviceEntryIconViewModel = deviceEntryIconViewModel,
+ systemUIDialogManager = systemUIDialogManager,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorKosmos.kt
similarity index 72%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorKosmos.kt
index f4feee1..06b6cda6 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractorKosmos.kt
@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.bouncer.domain.interactor
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.primaryBouncerInteractor by Kosmos.Fixture { mock<PrimaryBouncerInteractor>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorKosmos.kt
similarity index 66%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorKosmos.kt
index f4feee1..7e0e5f3 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/common/ui/domain/interactor/ConfigurationInteractorKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.common.ui.domain.interactor
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.common.ui.data.repository.configurationRepository
+import com.android.systemui.kosmos.Kosmos
+
+var Kosmos.configurationInteractor: ConfigurationInteractor by
+ Kosmos.Fixture { ConfigurationInteractor(configurationRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
index 8c653a5..ce52f4b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/data/FakeSystemUiDataLayerModule.kt
@@ -20,6 +20,7 @@
import com.android.systemui.bouncer.data.repository.FakeBouncerDataLayerModule
import com.android.systemui.common.ui.data.FakeCommonDataLayerModule
import com.android.systemui.deviceentry.data.FakeDeviceEntryDataLayerModule
+import com.android.systemui.keyevent.data.repository.FakeKeyEventDataLayerModule
import com.android.systemui.keyguard.data.FakeKeyguardDataLayerModule
import com.android.systemui.power.data.FakePowerDataLayerModule
import com.android.systemui.shade.data.repository.FakeShadeDataLayerModule
@@ -44,6 +45,7 @@
FakeStatusBarDataLayerModule::class,
FakeTelephonyDataLayerModule::class,
FakeUserDataLayerModule::class,
+ FakeKeyEventDataLayerModule::class,
]
)
object FakeSystemUiDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
index 8ff04a63..d97cb56 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/FakeDeviceEntryDataLayerModule.kt
@@ -16,6 +16,7 @@
package com.android.systemui.deviceentry.data
import com.android.systemui.biometrics.data.repository.FakeFingerprintPropertyRepositoryModule
+import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryHapticsRepositoryModule
import com.android.systemui.deviceentry.data.repository.FakeDeviceEntryRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepositoryModule
@@ -28,6 +29,7 @@
[
FakeBiometricSettingsRepositoryModule::class,
FakeDeviceEntryRepositoryModule::class,
+ FakeDeviceEntryHapticsRepositoryModule::class,
FakeDeviceEntryFaceAuthRepositoryModule::class,
FakeDeviceEntryFingerprintAuthRepositoryModule::class,
FakeFingerprintPropertyRepositoryModule::class,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/DeviceEntryHapticsRepositoryKosmos.kt
similarity index 71%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/DeviceEntryHapticsRepositoryKosmos.kt
index f4feee1..8bb07d9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/DeviceEntryHapticsRepositoryKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+import com.android.systemui.kosmos.Kosmos
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+var Kosmos.deviceEntryHapticsRepository: DeviceEntryHapticsRepository by
+ Kosmos.Fixture { fakeDeviceEntryHapticsRepository }
+val Kosmos.fakeDeviceEntryHapticsRepository by Kosmos.Fixture { FakeDeviceEntryHapticsRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt
new file mode 100644
index 0000000..b29b67d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryHapticsRepository.kt
@@ -0,0 +1,55 @@
+/*
+ * 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.deviceentry.data.repository
+
+import com.android.systemui.dagger.SysUISingleton
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+
+/** Fake implementation of [DeviceEntryHapticsRepository] */
+@SysUISingleton
+class FakeDeviceEntryHapticsRepository @Inject constructor() : DeviceEntryHapticsRepository {
+ private var _successHapticRequest: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val successHapticRequest: Flow<Boolean> = _successHapticRequest.asStateFlow()
+
+ private var _errorHapticRequest: MutableStateFlow<Boolean> = MutableStateFlow(false)
+ override val errorHapticRequest: Flow<Boolean> = _errorHapticRequest.asStateFlow()
+
+ override fun requestSuccessHaptic() {
+ _successHapticRequest.value = true
+ }
+
+ override fun handleSuccessHaptic() {
+ _successHapticRequest.value = false
+ }
+
+ override fun requestErrorHaptic() {
+ _errorHapticRequest.value = true
+ }
+
+ override fun handleErrorHaptic() {
+ _errorHapticRequest.value = false
+ }
+}
+
+@Module
+interface FakeDeviceEntryHapticsRepositoryModule {
+ @Binds fun bindFake(fake: FakeDeviceEntryHapticsRepository): DeviceEntryHapticsRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.kt
new file mode 100644
index 0000000..de6cacb
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryHapticsInteractorKosmos.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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.deviceentry.domain.interactor
+
+import com.android.keyguard.logging.biometricUnlockLogger
+import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
+import com.android.systemui.deviceentry.data.repository.fakeDeviceEntryHapticsRepository
+import com.android.systemui.keyevent.domain.interactor.keyEventInteractor
+import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.power.domain.interactor.powerInteractor
+import com.android.systemui.util.time.fakeSystemClock
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.deviceEntryHapticsInteractor by
+ Kosmos.Fixture {
+ DeviceEntryHapticsInteractor(
+ repository = fakeDeviceEntryHapticsRepository,
+ fingerprintPropertyRepository = fingerprintPropertyRepository,
+ biometricSettingsRepository = biometricSettingsRepository,
+ keyEventInteractor = keyEventInteractor,
+ powerInteractor = powerInteractor,
+ systemClock = fakeSystemClock,
+ logger = biometricUnlockLogger,
+ )
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt
similarity index 80%
rename from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
rename to packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt
index f4feee1..191bccc 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventDataLayerModule.kt
@@ -13,8 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
+
+package com.android.systemui.keyevent.data.repository
import dagger.Module
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+@Module(includes = [FakeKeyEventRepositoryModule::class]) object FakeKeyEventDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
index 95b5316..97dab49 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/FakeKeyEventRepository.kt
@@ -16,11 +16,14 @@
package com.android.systemui.keyevent.data.repository
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
-class FakeKeyEventRepository() : KeyEventRepository {
+class FakeKeyEventRepository @Inject constructor() : KeyEventRepository {
private val _isPowerButtonDown = MutableStateFlow(false)
override val isPowerButtonDown: Flow<Boolean> = _isPowerButtonDown.asStateFlow()
@@ -28,3 +31,8 @@
_isPowerButtonDown.value = isDown
}
}
+
+@Module
+interface FakeKeyEventRepositoryModule {
+ @Binds fun bindFake(fake: FakeKeyEventRepository): KeyEventRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/KeyEventRepositoryKosmos.kt
similarity index 69%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/KeyEventRepositoryKosmos.kt
index f4feee1..1238a7a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/data/repository/KeyEventRepositoryKosmos.kt
@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.keyevent.data.repository
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+
+var Kosmos.keyEventRepository: KeyEventRepository by Kosmos.Fixture { fakeKeyEventRepository }
+val Kosmos.fakeKeyEventRepository by Kosmos.Fixture { FakeKeyEventRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/domain/interactor/KeyEventInteractorKosmos.kt
similarity index 68%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/domain/interactor/KeyEventInteractorKosmos.kt
index f4feee1..53a1b03 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyevent/domain/interactor/KeyEventInteractorKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.keyevent.domain.interactor
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.keyevent.data.repository.keyEventRepository
+import com.android.systemui.kosmos.Kosmos
+
+var Kosmos.keyEventInteractor by
+ Kosmos.Fixture { KeyEventInteractor(repository = keyEventRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
index 6838e76..abbd9be 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/FakeKeyguardDataLayerModule.kt
@@ -16,6 +16,7 @@
package com.android.systemui.keyguard.data
import com.android.systemui.keyguard.data.repository.FakeCommandQueueModule
+import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardSurfaceBehindRepositoryModule
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepositoryModule
@@ -28,6 +29,7 @@
FakeKeyguardRepositoryModule::class,
FakeKeyguardTransitionRepositoryModule::class,
FakeKeyguardSurfaceBehindRepositoryModule::class,
+ FakeKeyguardClockRepositoryModule::class,
]
)
object FakeKeyguardDataLayerModule
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt
new file mode 100644
index 0000000..21936c3
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.keyguard.data.repository
+
+import com.android.keyguard.ClockEventController
+import com.android.keyguard.KeyguardClockSwitch.ClockSize
+import com.android.keyguard.KeyguardClockSwitch.LARGE
+import com.android.systemui.keyguard.shared.model.SettingsClockSize
+import com.android.systemui.plugins.ClockId
+import com.android.systemui.shared.clocks.DEFAULT_CLOCK_ID
+import com.android.systemui.util.mockito.mock
+import dagger.Binds
+import dagger.Module
+import javax.inject.Inject
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+
+class FakeKeyguardClockRepository @Inject constructor() : KeyguardClockRepository {
+ private val _clockSize = MutableStateFlow(LARGE)
+ override val clockSize: StateFlow<Int> = _clockSize
+
+ private val _selectedClockSize = MutableStateFlow(SettingsClockSize.DYNAMIC)
+ override val selectedClockSize = _selectedClockSize
+
+ private val _currentClockId = MutableStateFlow(DEFAULT_CLOCK_ID)
+ override val currentClockId: Flow<ClockId> = _currentClockId
+
+ private val _currentClock = MutableStateFlow(null)
+ override val currentClock = _currentClock
+ override val clockEventController: ClockEventController
+ get() = mock()
+
+ override fun setClockSize(@ClockSize size: Int) {
+ _clockSize.value = size
+ }
+}
+
+@Module
+interface FakeKeyguardClockRepositoryModule {
+ @Binds fun bindFake(fake: FakeKeyguardClockRepository): KeyguardClockRepository
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
index 4068e40..81a7bec 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt
@@ -18,7 +18,6 @@
package com.android.systemui.keyguard.data.repository
import android.graphics.Point
-import com.android.keyguard.KeyguardClockSwitch.LARGE
import com.android.systemui.common.shared.model.Position
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
@@ -26,7 +25,6 @@
import com.android.systemui.keyguard.shared.model.DismissAction
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
import com.android.systemui.keyguard.shared.model.KeyguardDone
-import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.StatusBarState
import dagger.Binds
import dagger.Module
@@ -42,8 +40,6 @@
class FakeKeyguardRepository @Inject constructor() : KeyguardRepository {
private val _deferKeyguardDone: MutableSharedFlow<KeyguardDone> = MutableSharedFlow()
override val keyguardDone: Flow<KeyguardDone> = _deferKeyguardDone
- private val _clockSize = MutableStateFlow<Int>(LARGE)
- override val clockSize: Flow<Int> = _clockSize
private val _clockShouldBeCentered = MutableStateFlow<Boolean>(true)
override val clockShouldBeCentered: Flow<Boolean> = _clockShouldBeCentered
@@ -123,17 +119,6 @@
private val _keyguardAlpha = MutableStateFlow(1f)
override val keyguardAlpha: StateFlow<Float> = _keyguardAlpha
- private val _keyguardRootViewVisibility =
- MutableStateFlow(
- KeyguardRootViewVisibilityState(
- 0,
- goingToFullShade = false,
- occlusionTransitionRunning = false
- )
- )
- override val keyguardRootViewVisibility: Flow<KeyguardRootViewVisibilityState> =
- _keyguardRootViewVisibility.asStateFlow()
-
override fun setQuickSettingsVisible(isVisible: Boolean) {
_isQuickSettingsVisible.value = isVisible
}
@@ -187,10 +172,6 @@
_deferKeyguardDone.emit(timing)
}
- override fun setClockSize(size: Int) {
- _clockSize.value = size
- }
-
override fun setClockShouldBeCentered(shouldBeCentered: Boolean) {
_clockShouldBeCentered.value = shouldBeCentered
}
@@ -254,19 +235,6 @@
override fun setKeyguardAlpha(alpha: Float) {
_keyguardAlpha.value = alpha
}
-
- override fun setKeyguardVisibility(
- statusBarState: Int,
- goingToFullShade: Boolean,
- occlusionTransitionRunning: Boolean
- ) {
- _keyguardRootViewVisibility.value =
- KeyguardRootViewVisibilityState(
- statusBarState,
- goingToFullShade,
- occlusionTransitionRunning
- )
- }
}
@Module
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt
similarity index 66%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt
index f4feee1..e6716ba3 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepositoryKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.keyguard.data.repository
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.keyguardClockRepository: KeyguardClockRepository by
+ Kosmos.Fixture { fakeKeyguardClockRepository }
+val Kosmos.fakeKeyguardClockRepository by Kosmos.Fixture { FakeKeyguardClockRepository() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
similarity index 66%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
index f4feee1..d791e94 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt
@@ -13,8 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.keyguard.domain.interactor
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.keyguard.data.repository.keyguardClockRepository
+import com.android.systemui.kosmos.Kosmos
+
+val Kosmos.keyguardClockInteractor by
+ Kosmos.Fixture { KeyguardClockInteractor(keyguardClockRepository = keyguardClockRepository) }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
index c575bb3..0bba36b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt
@@ -19,6 +19,7 @@
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
@@ -63,7 +64,7 @@
commandQueue = commandQueue,
sceneContainerFlags = sceneContainerFlags,
bouncerRepository = bouncerRepository,
- configurationRepository = configurationRepository,
+ configurationInteractor = ConfigurationInteractor(configurationRepository),
shadeRepository = shadeRepository,
sceneInteractorProvider = { sceneInteractor },
powerInteractor = powerInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
index bb84036..58d99b5 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt
@@ -17,7 +17,7 @@
package com.android.systemui.keyguard.domain.interactor
import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
-import com.android.systemui.common.ui.data.repository.configurationRepository
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.keyguard.data.repository.keyguardRepository
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.power.domain.interactor.powerInteractor
@@ -34,7 +34,7 @@
powerInteractor = powerInteractor,
sceneContainerFlags = sceneContainerFlags,
bouncerRepository = keyguardBouncerRepository,
- configurationRepository = configurationRepository,
+ configurationInteractor = configurationInteractor,
shadeRepository = shadeRepository,
sceneInteractorProvider = { sceneInteractor },
)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt
new file mode 100644
index 0000000..8d6529a
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui
+
+import com.android.keyguard.logging.keyguardTransitionAnimationLogger
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.kosmos.applicationCoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.keyguardTransitionAnimationFlow by Fixture {
+ KeyguardTransitionAnimationFlow(
+ scope = applicationCoroutineScope,
+ logger = keyguardTransitionAnimationLogger,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt
new file mode 100644
index 0000000..9f0466d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.alternateBouncerViewModel by Fixture {
+ AlternateBouncerViewModel(
+ statusBarKeyguardViewManager = statusBarKeyguardViewManager,
+ transitionInteractor = keyguardTransitionInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..44e5426
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToGoneTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.aodToGoneTransitionViewModel by Fixture {
+ AodToGoneTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt
index a31ab3e..b5a5f03 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelKosmos.kt
@@ -20,6 +20,7 @@
import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -28,5 +29,6 @@
AodToLockscreenTransitionViewModel(
interactor = keyguardTransitionInteractor,
deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..27ad0f0
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/AodToOccludedTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.aodToOccludedTransitionViewModel by Fixture {
+ AodToOccludedTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.kt
new file mode 100644
index 0000000..6ffcc9a
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/BouncerToGoneFlowsKosmos.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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.android.systemui.util.mockito.mock
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.bouncerToGoneFlows by Fixture {
+ BouncerToGoneFlows(
+ interactor = keyguardTransitionInteractor,
+ statusBarStateController = sysuiStatusBarStateController,
+ primaryBouncerInteractor = primaryBouncerInteractor,
+ keyguardDismissActionInteractor = mock(),
+ featureFlags = featureFlagsClassic,
+ shadeInteractor = shadeInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt
new file mode 100644
index 0000000..299262b
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModelKosmos.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryHapticsInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.burnInInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.scene.shared.flag.sceneContainerFlags
+import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.phone.statusBarKeyguardViewManager
+
+val Kosmos.deviceEntryIconViewModelTransitionsMock by Fixture {
+ mutableSetOf<DeviceEntryIconTransition>()
+}
+
+val Kosmos.deviceEntryIconViewModel by Fixture {
+ DeviceEntryIconViewModel(
+ transitions = deviceEntryIconViewModelTransitionsMock,
+ burnInInteractor = burnInInteractor,
+ shadeInteractor = shadeInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ transitionInteractor = keyguardTransitionInteractor,
+ keyguardInteractor = keyguardInteractor,
+ viewModel = aodToLockscreenTransitionViewModel,
+ shadeDependentFlows = shadeDependentFlows,
+ sceneContainerFlags = sceneContainerFlags,
+ keyguardViewController = { statusBarKeyguardViewManager },
+ deviceEntryHapticsInteractor = deviceEntryHapticsInteractor,
+ deviceEntryInteractor = deviceEntryInteractor,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..8b5407c
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModelKosmos.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.util.mockito.mock
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.dreamingToLockscreenTransitionViewModel by Fixture {
+ DreamingToLockscreenTransitionViewModel(
+ keyguardTransitionInteractor = keyguardTransitionInteractor,
+ fromDreamingTransitionInteractor = mock(),
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt
index 5db95cf..14e2cff 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModelKosmos.kt
@@ -20,6 +20,7 @@
import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -27,6 +28,7 @@
val Kosmos.goneToAodTransitionViewModel by Fixture {
GoneToAodTransitionViewModel(
interactor = keyguardTransitionInteractor,
- deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..073b34b
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.goneToDreamingTransitionViewModel by Fixture {
+ GoneToDreamingTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
new file mode 100644
index 0000000..d878683
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.applicationCoroutineScope
+
+val Kosmos.keyguardClockViewModel by
+ Kosmos.Fixture {
+ KeyguardClockViewModel(
+ keyguardInteractor = keyguardInteractor,
+ keyguardClockInteractor = keyguardClockInteractor,
+ applicationScope = applicationCoroutineScope,
+ )
+ }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
index 663b845..13ee747 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt
@@ -18,8 +18,9 @@
package com.android.systemui.keyguard.ui.viewmodel
-import android.content.applicationContext
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
+import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.keyguard.domain.interactor.burnInInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
@@ -32,7 +33,7 @@
val Kosmos.keyguardRootViewModel by Fixture {
KeyguardRootViewModel(
- context = applicationContext,
+ configurationInteractor = configurationInteractor,
deviceEntryInteractor = deviceEntryInteractor,
dozeParameters = dozeParameters,
keyguardInteractor = keyguardInteractor,
@@ -41,6 +42,9 @@
burnInInteractor = burnInInteractor,
goneToAodTransitionViewModel = goneToAodTransitionViewModel,
aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel,
+ occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
screenOffAnimationController = screenOffAnimationController,
+ keyguardClockViewModel = keyguardClockViewModel,
+ featureFlags = FakeFeatureFlagsClassic(),
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..7865f71
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModelKosmos.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.lockscreenToAodTransitionViewModel by Fixture {
+ LockscreenToAodTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ shadeDependentFlows = shadeDependentFlows,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..b9f4b71
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModelKosmos.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.lockscreenToDreamingTransitionViewModel by Fixture {
+ LockscreenToDreamingTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ shadeDependentFlows = shadeDependentFlows,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..475aa2d
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGoneTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.lockscreenToGoneTransitionViewModel by Fixture {
+ LockscreenToGoneTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..8541a4f
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelKosmos.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.lockscreenToOccludedTransitionViewModel by Fixture {
+ LockscreenToOccludedTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ shadeDependentFlows = shadeDependentFlows,
+ configurationInteractor = configurationInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..65c47fc
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModelKosmos.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.lockscreenToPrimaryBouncerTransitionViewModel by Fixture {
+ LockscreenToPrimaryBouncerTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ shadeDependentFlows = shadeDependentFlows,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..ddde549
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToAodTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.occludedToAodTransitionViewModel by Fixture {
+ OccludedToAodTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..5bbde2b
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModelKosmos.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.common.ui.domain.interactor.configurationInteractor
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.occludedToLockscreenTransitionViewModel by Fixture {
+ OccludedToLockscreenTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ configurationInteractor = configurationInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..a7f29d6
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.primaryBouncerToAodTransitionViewModel by Fixture {
+ PrimaryBouncerToAodTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..ace6ae3
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModelKosmos.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.bouncer.domain.interactor.primaryBouncerInteractor
+import com.android.systemui.flags.featureFlagsClassic
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import com.android.systemui.statusbar.sysuiStatusBarStateController
+import com.android.systemui.util.mockito.mock
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.primaryBouncerToGoneTransitionViewModel by Fixture {
+ PrimaryBouncerToGoneTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ statusBarStateController = sysuiStatusBarStateController,
+ primaryBouncerInteractor = primaryBouncerInteractor,
+ keyguardDismissActionInteractor = mock(),
+ featureFlags = featureFlagsClassic,
+ bouncerToGoneFlows = bouncerToGoneFlows,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt
new file mode 100644
index 0000000..3bbabf7
--- /dev/null
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToLockscreenTransitionViewModelKosmos.kt
@@ -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.
+ */
+
+@file:OptIn(ExperimentalCoroutinesApi::class)
+
+package com.android.systemui.keyguard.ui.viewmodel
+
+import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor
+import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.Kosmos.Fixture
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+
+val Kosmos.primaryBouncerToLockscreenTransitionViewModel by Fixture {
+ PrimaryBouncerToLockscreenTransitionViewModel(
+ interactor = keyguardTransitionInteractor,
+ deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor,
+ animationFlow = keyguardTransitionAnimationFlow,
+ )
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
index 2902c3f..e67df9d 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
@@ -18,8 +18,6 @@
import android.content.Context
import android.view.View
-import android.view.ViewGroup
-import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -27,7 +25,7 @@
import kotlinx.coroutines.flow.filterNotNull
class FakeQSSceneAdapter(
- private val inflateDelegate: suspend (Context, ViewGroup?) -> View,
+ private val inflateDelegate: suspend (Context) -> View,
) : QSSceneAdapter {
private val _customizing = MutableStateFlow(false)
override val isCustomizing: StateFlow<Boolean> = _customizing.asStateFlow()
@@ -38,8 +36,8 @@
private val _state = MutableStateFlow<QSSceneAdapter.State?>(null)
val state = _state.filterNotNull()
- override suspend fun inflate(context: Context, parent: ViewGroup?) {
- _view.value = inflateDelegate(context, parent)
+ override suspend fun inflate(context: Context) {
+ _view.value = inflateDelegate(context)
}
override fun setState(state: QSSceneAdapter.State) {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
index 3c96051..d78bcb9 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt
@@ -47,6 +47,7 @@
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.common.shared.model.Text
import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository
+import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.communal.data.repository.FakeCommunalRepository
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.CommunalInteractorFactory
@@ -133,6 +134,9 @@
val configurationRepository: FakeConfigurationRepository by lazy {
FakeConfigurationRepository()
}
+ val configurationInteractor: ConfigurationInteractor by lazy {
+ ConfigurationInteractor(configurationRepository)
+ }
private val emergencyServicesRepository: EmergencyServicesRepository by lazy {
EmergencyServicesRepository(
applicationScope = applicationScope(),
@@ -246,7 +250,7 @@
commandQueue = FakeCommandQueue(),
sceneContainerFlags = sceneContainerFlags,
bouncerRepository = FakeKeyguardBouncerRepository(),
- configurationRepository = configurationRepository,
+ configurationInteractor = configurationInteractor,
shadeRepository = FakeShadeRepository(),
sceneInteractorProvider = { sceneInteractor() },
powerInteractor = PowerInteractorFactory.create().powerInteractor,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
index 92ec4f2..9c10848 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/data/repository/FakeShadeRepository.kt
@@ -24,6 +24,7 @@
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
/** Fake implementation of [ShadeRepository] */
@SysUISingleton
@@ -105,6 +106,14 @@
_legacyQsFullscreen.value = legacyQsFullscreen
}
+ private val _legacyIsClosing = MutableStateFlow(false)
+ @Deprecated("Use ShadeInteractor instead") override val legacyIsClosing = _legacyIsClosing
+
+ @Deprecated("Use ShadeInteractor instead")
+ override fun setLegacyIsClosing(isClosing: Boolean) {
+ _legacyIsClosing.value = isClosing
+ }
+
fun setShadeModel(model: ShadeModel) {
_shadeModel.value = model
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SysuiStatusBarStateControllerKosmos.kt
similarity index 77%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SysuiStatusBarStateControllerKosmos.kt
index f4feee1..fead581 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/SysuiStatusBarStateControllerKosmos.kt
@@ -13,8 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.statusbar
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+
+var Kosmos.sysuiStatusBarStateController by Kosmos.Fixture { FakeStatusBarStateController() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
index c17083c..e2479fe 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelKosmos.kt
@@ -18,6 +18,7 @@
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
+import com.android.systemui.keyguard.ui.viewmodel.occludedToLockscreenTransitionViewModel
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -31,5 +32,6 @@
keyguardInteractor = keyguardInteractor,
keyguardTransitionInteractor = keyguardTransitionInteractor,
shadeInteractor = shadeInteractor,
+ occludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt
similarity index 72%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt
index f4feee1..4e15ea2 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerKosmos.kt
@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.statusbar.phone
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.statusBarKeyguardViewManager by Kosmos.Fixture { mock<StatusBarKeyguardViewManager>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/SystemUIDialogManagerKosmos.kt
similarity index 73%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/SystemUIDialogManagerKosmos.kt
index f4feee1..7dfbf2a 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/SystemUIDialogManagerKosmos.kt
@@ -13,8 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package com.android.systemui.statusbar.phone
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.util.mockito.mock
+
+var Kosmos.systemUIDialogManager by Kosmos.Fixture { mock<SystemUIDialogManager>() }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/data/repository/FakeDarkIconRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/data/repository/FakeDarkIconRepository.kt
index 50d3f0a..282e2e8 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/data/repository/FakeDarkIconRepository.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/data/repository/FakeDarkIconRepository.kt
@@ -24,7 +24,7 @@
@SysUISingleton
class FakeDarkIconRepository @Inject constructor() : DarkIconRepository {
- override val darkState = MutableStateFlow(DarkChange(emptyList(), 0f, 0))
+ override val darkState = MutableStateFlow(DarkChange.EMPTY)
}
@Module
diff --git a/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.xml
new file mode 100644
index 0000000..be1f081
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlay/res/values-sw600dp/config.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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.xml
new file mode 100644
index 0000000..be1f081
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayExtraWideBack/res/values-sw600dp/config.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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.xml
new file mode 100644
index 0000000..be1f081
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayNarrowBack/res/values-sw600dp/config.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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.xml
new file mode 100644
index 0000000..be1f081
--- /dev/null
+++ b/packages/overlays/NavigationBarModeGesturalOverlayWideBack/res/values-sw600dp/config.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.
+ */
+-->
+<resources>
+ <!-- If true, attach the navigation bar to the app during app transition -->
+ <bool name="config_attachNavBarToAppDuringTransition">false</bool>
+</resources>
diff --git a/ravenwood/OWNERS b/ravenwood/OWNERS
index c06b3b9..41fd68e 100644
--- a/ravenwood/OWNERS
+++ b/ravenwood/OWNERS
@@ -1,3 +1,5 @@
+set noparent
+
jsharkey@google.com
omakoto@google.com
jaggies@google.com
diff --git a/ravenwood/TEST_MAPPING b/ravenwood/TEST_MAPPING
index 72eb665..0319848 100644
--- a/ravenwood/TEST_MAPPING
+++ b/ravenwood/TEST_MAPPING
@@ -1,7 +1,21 @@
{
- "presubmit": [
- // Let's only run this one as a smoke test.
- // TODO: Enable it once the infra knows how to run it.
- // { "name": "CtsUtilTestCasesRavenwood" }
- ]
+ "presubmit": [
+ {
+ "name": "RavenwoodMockitoTest_device"
+ }
+ ],
+ "ravenwood-presubmit": [
+ {
+ "name": "RavenwoodMinimumTest",
+ "host": true
+ },
+ {
+ "name": "RavenwoodMockitoTest",
+ "host": true
+ },
+ {
+ "name": "CtsUtilTestCasesRavenwood",
+ "host": true
+ }
+ ]
}
diff --git a/ravenwood/framework-minus-apex-ravenwood-policies.txt b/ravenwood/framework-minus-apex-ravenwood-policies.txt
index 79bfa44..a75bba6 100644
--- a/ravenwood/framework-minus-apex-ravenwood-policies.txt
+++ b/ravenwood/framework-minus-apex-ravenwood-policies.txt
@@ -85,6 +85,7 @@
class com.android.internal.util.FastPrintWriter stubclass
class com.android.internal.util.GrowingArrayUtils stubclass
class com.android.internal.util.LineBreakBufferedWriter stubclass
+class com.android.internal.util.Parcelling stubclass
class com.android.internal.util.Preconditions stubclass
class com.android.internal.util.StringPool stubclass
@@ -134,6 +135,8 @@
class android.net.Uri stubclass
class android.net.UriCodec stubclass
-# Context: just enough to support wrapper, no further functionality
+# Just enough to support mocking, no further functionality
class android.content.Context stub
method <init> ()V stub
+class android.content.pm.PackageManager stub
+ method <init> ()V stub
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
index be0c09e..eacdc2f 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuleImpl.java
@@ -32,6 +32,8 @@
android.os.Process.init$ravenwood(rule.mUid, rule.mPid);
android.os.Binder.init$ravenwood();
+ com.android.server.LocalServices.removeAllServicesForTest();
+
if (rule.mProvideMainThread) {
final HandlerThread main = new HandlerThread(MAIN_THREAD_NAME);
main.start();
@@ -45,6 +47,8 @@
Looper.clearMainLooperForTest();
}
+ com.android.server.LocalServices.removeAllServicesForTest();
+
android.os.Process.reset$ravenwood();
android.os.Binder.reset$ravenwood();
}
diff --git a/ravenwood/minimum-test/Android.bp b/ravenwood/minimum-test/Android.bp
new file mode 100644
index 0000000..bf3583c
--- /dev/null
+++ b/ravenwood/minimum-test/Android.bp
@@ -0,0 +1,24 @@
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "frameworks_base_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["frameworks_base_license"],
+}
+
+// Minimum ravenwood test according to test-authors.md.
+android_ravenwood_test {
+ name: "RavenwoodMinimumTest",
+
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+
+ srcs: [
+ "test/**/*.java",
+ ],
+ sdk_version: "test_current",
+ auto_gen_config: true,
+}
diff --git a/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java b/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java
new file mode 100644
index 0000000..085c186
--- /dev/null
+++ b/ravenwood/minimum-test/test/com/android/ravenwood/RavenwoodMinimumTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.ravenwood;
+
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class RavenwoodMinimumTest {
+ @Rule
+ public RavenwoodRule mRavenwood = new RavenwoodRule.Builder()
+ .setProcessApp()
+ .build();
+
+ @Test
+ public void testSimple() {
+ Assert.assertTrue(android.os.Process.isApplicationUid(android.os.Process.myUid()));
+ }
+
+ @Test
+ @IgnoreUnderRavenwood
+ public void testIgnored() {
+ throw new RuntimeException("Shouldn't be executed under ravenwood");
+ }
+}
diff --git a/ravenwood/ravenwood-annotation-allowed-classes.txt b/ravenwood/ravenwood-annotation-allowed-classes.txt
index 07c2cd7c..72e9ba3 100644
--- a/ravenwood/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/ravenwood-annotation-allowed-classes.txt
@@ -2,16 +2,20 @@
com.android.internal.util.ArrayUtils
+android.util.AtomicFile
android.util.DataUnit
android.util.EventLog
android.util.IntArray
android.util.LongArray
+android.util.LruCache
android.util.Slog
android.util.TimeUtils
android.util.Xml
android.os.Binder
android.os.Binder$IdentitySupplier
+android.os.FileUtils
+android.os.FileUtils$MemoryPipe
android.os.Handler
android.os.HandlerExecutor
android.os.HandlerThread
@@ -30,6 +34,7 @@
android.content.ComponentName
android.content.ContentUris
android.content.ContentValues
+android.content.ContextWrapper
android.content.Intent
android.content.IntentFilter
android.content.UriMatcher
@@ -59,3 +64,5 @@
android.graphics.PointF
android.graphics.Rect
android.graphics.RectF
+
+com.android.server.LocalServices
diff --git a/ravenwood/ravenwood-standard-options.txt b/ravenwood/ravenwood-standard-options.txt
index 8ad21fa..f64f26d 100644
--- a/ravenwood/ravenwood-standard-options.txt
+++ b/ravenwood/ravenwood-standard-options.txt
@@ -1,6 +1,6 @@
# File containing standard options to HostStubGen for Ravenwood
---debug
+# --debug # To enable debug log on consone
# Keep all classes / methods / fields, but make the methods throw.
--default-throw
diff --git a/ravenwood/test-authors.md b/ravenwood/test-authors.md
index 2b5bd908..5adef53 100644
--- a/ravenwood/test-authors.md
+++ b/ravenwood/test-authors.md
@@ -31,6 +31,14 @@
* Write your unit test just like you would for an Android device:
```
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@RunWith(AndroidJUnit4.class)
public class MyCodeTest {
@Test
@@ -43,6 +51,14 @@
* APIs available under Ravenwood are stateless by default. If your test requires explicit states (such as defining the UID you’re running under, or requiring a main `Looper` thread), add a `RavenwoodRule` to declare that:
```
+import android.platform.test.annotations.IgnoreUnderRavenwood;
+import android.platform.test.ravenwood.RavenwoodRule;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
@RunWith(AndroidJUnit4.class)
public class MyCodeTest {
@Rule
diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
index 2032a50..b4deeb0 100644
--- a/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/ProxyManager.java
@@ -29,12 +29,14 @@
import android.content.ComponentName;
import android.content.Context;
import android.hardware.display.DisplayManager;
+import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.ArraySet;
import android.util.IntArray;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -66,8 +68,8 @@
* TODO(241117292): Remove or cut down during simultaneous user refactoring.
*/
public class ProxyManager {
- private static final boolean DEBUG = false;
private static final String LOG_TAG = "ProxyManager";
+ private static final boolean DEBUG = Log.isLoggable(LOG_TAG, Log.DEBUG) && Build.IS_DEBUGGABLE;
// Names used to populate ComponentName and ResolveInfo in connection.mA11yServiceInfo and in
// the infos of connection.setInstalledAndEnabledServices
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
index e3797c9..f55ecb0 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -916,18 +916,27 @@
&& event.getPointerCount() == 2;
mHandler.removeMessages(MESSAGE_TRANSITION_TO_DELEGATING_STATE);
- if (isActivated() && event.getPointerCount() == 2) {
- storePointerDownLocation(mSecondPointerDownLocation, event);
- mHandler.sendEmptyMessageDelayed(MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE,
- ViewConfiguration.getTapTimeout());
- } else if (mIsTwoFingerCountReached) {
- // Placing two-finger triple-taps behind isActivated to avoid
- // blocking panning scaling state
+ if (event.getPointerCount() == 2) {
if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)) {
// 3tap and hold
afterLongTapTimeoutTransitionToDraggingState(event);
} else {
- afterMultiTapTimeoutTransitionToDelegatingState();
+ if (mDetectTwoFingerTripleTap) {
+ // If mDetectTwoFingerTripleTap, delay transition to the delegating
+ // state for mMultiTapMaxDelay to ensure reachability of
+ // multi finger multi tap
+ afterMultiTapTimeoutTransitionToDelegatingState();
+ }
+
+ if (isActivated()) {
+ // If activated, delay transition to the panning scaling
+ // state for tap timeout to ensure reachability of
+ // multi finger multi tap
+ storePointerDownLocation(mSecondPointerDownLocation, event);
+ mHandler.sendEmptyMessageDelayed(
+ MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE,
+ ViewConfiguration.getTapTimeout());
+ }
}
} else {
transitionToDelegatingStateAndClear();
@@ -953,6 +962,9 @@
// (which is a rare combo to be used aside from magnification)
if (isMultiTapTriggered(2 /* taps */) && event.getPointerCount() == 1) {
transitionToViewportDraggingStateAndClear(event);
+ } else if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)
+ && event.getPointerCount() == 2) {
+ transitionToViewportDraggingStateAndClear(event);
} else if (isActivated() && event.getPointerCount() == 2) {
if (mIsSinglePanningEnabled
&& overscrollState(event, mFirstPointerDownLocation)
@@ -961,11 +973,6 @@
}
//Primary pointer is swiping, so transit to PanningScalingState
transitToPanningScalingStateAndClear();
- } else if (isMultiFingerMultiTapTriggered(/* targetTapCount= */ 2, event)
- && event.getPointerCount() == 2) {
- // Placing two-finger triple-taps behind isActivated to avoid
- // blocking panning scaling state
- transitionToViewportDraggingStateAndClear(event);
} else if (mIsSinglePanningEnabled
&& isActivated()
&& event.getPointerCount() == 1) {
@@ -979,8 +986,11 @@
}
} else if (isActivated() && pointerDownValid(mSecondPointerDownLocation)
&& distanceClosestPointerToPoint(
- mSecondPointerDownLocation, /* move */ event) > mSwipeMinDistance) {
- //Second pointer is swiping, so transit to PanningScalingState
+ mSecondPointerDownLocation, /* move */ event) > mSwipeMinDistance
+ // If mCompleteTapCount is not zero, it means that it is a multi tap
+ // gesture. So, we should not transit to the PanningScalingState.
+ && mCompletedTapCount == 0) {
+ // Second pointer is swiping, so transit to PanningScalingState
transitToPanningScalingStateAndClear();
}
}
@@ -988,6 +998,7 @@
case ACTION_UP: {
mHandler.removeMessages(MESSAGE_ON_TRIPLE_TAP_AND_HOLD);
+ mHandler.removeMessages(MESSAGE_TRANSITION_TO_PANNINGSCALING_STATE);
if (!mFullScreenMagnificationController.magnificationRegionContains(
mDisplayId, event.getX(), event.getY())) {
diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
index 96a873e..316a16d 100644
--- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
+++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java
@@ -32,7 +32,6 @@
import android.annotation.Nullable;
import android.app.ApplicationThreadConstants;
import android.app.IBackupAgent;
-import android.app.backup.BackupAnnotations;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManagerMonitor;
@@ -183,8 +182,7 @@
mUserId = 0;
mBackupEligibilityRules = null;
this.backupManagerService = backupManagerService;
- mBackupManagerMonitorEventSender =
- new BackupManagerMonitorEventSender(/*monitor*/null);
+ mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(/* monitor= */ null);
}
// This task can assume that the wakelock is properly held for it and doesn't have to worry
@@ -212,8 +210,7 @@
mTransportConnection = transportConnection;
mObserver = observer;
- mBackupManagerMonitorEventSender =
- new BackupManagerMonitorEventSender(monitor);
+ mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(monitor);
mToken = restoreSetToken;
mPmToken = pmToken;
mTargetPackage = targetPackage;
@@ -221,9 +218,10 @@
mFinished = false;
mDidLaunch = false;
mListener = listener;
- mAgentTimeoutParameters = Objects.requireNonNull(
- backupManagerService.getAgentTimeoutParameters(),
- "Timeout parameters cannot be null");
+ mAgentTimeoutParameters =
+ Objects.requireNonNull(
+ backupManagerService.getAgentTimeoutParameters(),
+ "Timeout parameters cannot be null");
mBackupEligibilityRules = backupEligibilityRules;
if (targetPackage != null) {
@@ -236,7 +234,8 @@
// We want everything and a pony
List<PackageInfo> apps =
PackageManagerBackupAgent.getStorableApplications(
- backupManagerService.getPackageManager(), mUserId,
+ backupManagerService.getPackageManager(),
+ mUserId,
backupEligibilityRules);
filterSet = packagesToNames(apps);
if (DEBUG) {
@@ -264,11 +263,11 @@
continue;
}
-
ApplicationInfo applicationInfo = info.applicationInfo;
if (backupEligibilityRules.appIsEligibleForBackup(applicationInfo)) {
if (Flags.enableSkippingRestoreLaunchedApps()
- && !backupEligibilityRules.isAppEligibleForRestore(applicationInfo)) {
+ && !backupEligibilityRules.isAppEligibleForRestore(
+ applicationInfo)) {
continue;
}
@@ -280,16 +279,21 @@
}
if (hasSystem) {
try {
- mAcceptSet.add(0, backupManagerService.getPackageManager().getPackageInfoAsUser(
- PLATFORM_PACKAGE_NAME, 0, mUserId));
+ mAcceptSet.add(
+ 0,
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(PLATFORM_PACKAGE_NAME, 0, mUserId));
} catch (NameNotFoundException e) {
// won't happen; we know a priori that it's valid
}
}
if (hasSettings) {
try {
- mAcceptSet.add(backupManagerService.getPackageManager().getPackageInfoAsUser(
- SETTINGS_PACKAGE, 0, mUserId));
+ mAcceptSet.add(
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(SETTINGS_PACKAGE, 0, mUserId));
} catch (NameNotFoundException e) {
// this one is always valid too
}
@@ -402,15 +406,15 @@
// If we're starting a full-system restore, set up to begin widget ID remapping
if (mIsSystemRestore) {
AppWidgetBackupBridge.systemRestoreStarting(mUserId);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE,
null,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
} else {
- //We are either performing RestoreAtInstall or Bmgr.
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ // We are either performing RestoreAtInstall or Bmgr.
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL,
null,
@@ -443,7 +447,7 @@
mStatus = transport.startRestore(mToken, packages);
if (mStatus != BackupTransport.TRANSPORT_OK) {
Slog.e(TAG, "Transport error " + mStatus + "; no restore possible");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_DURING_START_RESTORE,
mCurrentPackage,
@@ -457,7 +461,7 @@
RestoreDescription desc = transport.nextRestorePackage();
if (desc == null) {
Slog.e(TAG, "No restore metadata available; halting");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_RESTORE_METADATA_AVAILABLE,
mCurrentPackage,
@@ -467,11 +471,9 @@
executeNextState(UnifiedRestoreState.FINAL);
return;
}
- if (!PACKAGE_MANAGER_SENTINEL.equals(
- desc.getPackageName())) {
- Slog.e(TAG, "Required package metadata but got "
- + desc.getPackageName());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ if (!PACKAGE_MANAGER_SENTINEL.equals(desc.getPackageName())) {
+ Slog.e(TAG, "Required package metadata but got " + desc.getPackageName());
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_PM_METADATA_RECEIVED,
mCurrentPackage,
@@ -500,26 +502,27 @@
// message and jump straight to the FINAL state. Because this was
// synchronous we also know that we should cancel the pending timeout
// message.
- backupManagerService.getBackupHandler().removeMessages(
- MSG_RESTORE_OPERATION_TIMEOUT);
+ backupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_OPERATION_TIMEOUT);
// Verify that the backup set includes metadata. If not, we can't do
// signature/version verification etc, so we simply do not proceed with
// the restore operation.
if (!mPmAgent.hasMetadata()) {
Slog.e(TAG, "PM agent has no metadata, so not restoring");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE,
PACKAGE_MANAGER_SENTINEL,
"Package manager restore metadata missing");
mStatus = BackupTransport.TRANSPORT_ERROR;
- backupManagerService.getBackupHandler().removeMessages(
- MSG_BACKUP_RESTORE_STEP, this);
+ backupManagerService
+ .getBackupHandler()
+ .removeMessages(MSG_BACKUP_RESTORE_STEP, this);
executeNextState(UnifiedRestoreState.FINAL);
return;
}
@@ -530,15 +533,14 @@
} catch (Exception e) {
// If we lost the transport at any time, halt
Slog.e(TAG, "Unable to contact transport for restore: " + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_LOST_TRANSPORT,
null,
BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT,
monitoringExtras);
mStatus = BackupTransport.TRANSPORT_ERROR;
- backupManagerService.getBackupHandler().removeMessages(
- MSG_BACKUP_RESTORE_STEP, this);
+ backupManagerService.getBackupHandler().removeMessages(MSG_BACKUP_RESTORE_STEP, this);
executeNextState(UnifiedRestoreState.FINAL);
return;
}
@@ -553,10 +555,10 @@
mTransportConnection.connectOrThrow(
"PerformUnifiedRestoreTask.dispatchNextRestore()");
mRestoreDescription = transport.nextRestorePackage();
- final String pkgName = (mRestoreDescription != null)
- ? mRestoreDescription.getPackageName() : null;
+ final String pkgName =
+ (mRestoreDescription != null) ? mRestoreDescription.getPackageName() : null;
if (pkgName == null) {
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_CANNOT_GET_NEXT_PKG_NAME,
null,
@@ -586,23 +588,26 @@
if (metaInfo == null) {
PackageInfo pkgInfo = new PackageInfo();
pkgInfo.packageName = pkgName;
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PM_AGENT_HAS_NO_METADATA,
pkgInfo,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
Slog.e(TAG, "No metadata for " + pkgName);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName,
- "Package metadata missing");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, pkgName, "Package metadata missing");
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
}
try {
- mCurrentPackage = backupManagerService.getPackageManager().getPackageInfoAsUser(
- pkgName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ mCurrentPackage =
+ backupManagerService
+ .getPackageManager()
+ .getPackageInfoAsUser(
+ pkgName, PackageManager.GET_SIGNING_CERTIFICATES, mUserId);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_START_PACKAGE_RESTORE,
mCurrentPackage,
@@ -613,14 +618,14 @@
// Whoops, we thought we could restore this package but it
// turns out not to be present. Skip it.
Slog.e(TAG, "Package not present: " + pkgName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName,
- "Package missing on device");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, pkgName, "Package missing on device");
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
}
@@ -630,40 +635,53 @@
// installed. If the app has not declared that it is prepared to
// handle this case, we do not attempt the restore.
if ((mCurrentPackage.applicationInfo.flags
- & ApplicationInfo.FLAG_RESTORE_ANY_VERSION) == 0) {
- String message = "Source version " + metaInfo.versionCode
- + " > installed version " + mCurrentPackage.getLongVersionCode();
+ & ApplicationInfo.FLAG_RESTORE_ANY_VERSION)
+ == 0) {
+ String message =
+ "Source version "
+ + metaInfo.versionCode
+ + " > installed version "
+ + mCurrentPackage.getLongVersionCode();
Slog.w(TAG, "Package " + pkgName + ": " + message);
- Bundle monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- null,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
- metaInfo.versionCode);
- monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- monitoringExtras,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, false);
+ Bundle monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ null,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
+ metaInfo.versionCode);
+ monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ monitoringExtras,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY,
+ false);
monitoringExtras = addRestoreOperationTypeToEvent(monitoringExtras);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- pkgName, message);
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, pkgName, message);
nextState = UnifiedRestoreState.RUNNING_QUEUE;
return;
} else {
if (DEBUG) {
- Slog.v(TAG, "Source version " + metaInfo.versionCode
- + " > installed version " + mCurrentPackage.getLongVersionCode()
- + " but restoreAnyVersion");
+ Slog.v(
+ TAG,
+ "Source version "
+ + metaInfo.versionCode
+ + " > installed version "
+ + mCurrentPackage.getLongVersionCode()
+ + " but restoreAnyVersion");
}
- Bundle monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- null,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
- metaInfo.versionCode);
- monitoringExtras = mBackupManagerMonitorEventSender.putMonitoringExtra(
- monitoringExtras,
- BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY, true);
+ Bundle monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ null,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_VERSION,
+ metaInfo.versionCode);
+ monitoringExtras =
+ mBackupManagerMonitorEventSender.putMonitoringExtra(
+ monitoringExtras,
+ BackupManagerMonitor.EXTRA_LOG_RESTORE_ANYWAY,
+ true);
monitoringExtras = addRestoreOperationTypeToEvent(monitoringExtras);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_VERSION_HIGHER,
@@ -674,10 +692,15 @@
}
if (MORE_DEBUG) {
- Slog.v(TAG, "Package " + pkgName
- + " restore version [" + metaInfo.versionCode
- + "] is compatible with installed version ["
- + mCurrentPackage.getLongVersionCode() + "]");
+ Slog.v(
+ TAG,
+ "Package "
+ + pkgName
+ + " restore version ["
+ + metaInfo.versionCode
+ + "] is compatible with installed version ["
+ + mCurrentPackage.getLongVersionCode()
+ + "]");
}
// Reset per-package preconditions and fire the appropriate next state
@@ -690,19 +713,17 @@
} else {
// Unknown restore type; ignore this package and move on
Slog.e(TAG, "Unrecognized restore type " + type);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);;
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_UNKNOWN_RESTORE_TYPE,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
nextState = UnifiedRestoreState.RUNNING_QUEUE;
- return;
}
} catch (Exception e) {
- Slog.e(TAG, "Can't get next restore target from transport; halting: "
- + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);;
+ Slog.e(TAG, "Can't get next restore target from transport; halting: " + e.getMessage());
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_NO_NEXT_RESTORE_TARGET,
mCurrentPackage,
@@ -710,7 +731,6 @@
monitoringExtras);
EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
nextState = UnifiedRestoreState.FINAL;
- return;
} finally {
executeNextState(nextState);
}
@@ -725,21 +745,25 @@
// Validate some semantic requirements that apply in this way
// only to the key/value restore API flow
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_RESTORE, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_RESTORE,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- /*monitoringExtras*/ addRestoreOperationTypeToEvent(/*extras*/null));
+ /* extras= */ addRestoreOperationTypeToEvent(/* extras= */ null));
if (mCurrentPackage.applicationInfo.backupAgentName == null
|| "".equals(mCurrentPackage.applicationInfo.backupAgentName)) {
if (MORE_DEBUG) {
- Slog.i(TAG, "Data exists for package " + packageName
- + " but app has no agent; skipping");
+ Slog.i(
+ TAG,
+ "Data exists for package "
+ + packageName
+ + " but app has no agent; skipping");
}
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_APP_HAS_NO_AGENT, mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Package has no agent");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Package has no agent");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
@@ -748,31 +772,34 @@
PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
if (!BackupUtils.signaturesMatch(metaInfo.sigHashes, mCurrentPackage, pmi)) {
Slog.w(TAG, "Signature mismatch restoring " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_SIGNATURE_MISMATCH,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Signature mismatch");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Signature mismatch");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
// Good to go! Set up and bind the agent...
- mAgent = backupManagerService.bindToAgentSynchronous(
- mCurrentPackage.applicationInfo,
- ApplicationThreadConstants.BACKUP_MODE_RESTORE,
- mBackupEligibilityRules.getBackupDestination());
+ mAgent =
+ backupManagerService.bindToAgentSynchronous(
+ mCurrentPackage.applicationInfo,
+ ApplicationThreadConstants.BACKUP_MODE_RESTORE,
+ mBackupEligibilityRules.getBackupDestination());
if (mAgent == null) {
Slog.w(TAG, "Can't find backup agent for " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_CANT_FIND_AGENT,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
- "Restore agent missing");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, packageName, "Restore agent missing");
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
return;
}
@@ -786,9 +813,10 @@
++mCount;
} catch (Exception e) {
Slog.e(TAG, "Error when attempting restore: " + e.toString());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
keyValueAgentErrorCleanup(false);
@@ -820,16 +848,18 @@
"PerformUnifiedRestoreTask.initiateOneRestore()");
// Run the transport's restore pass
- stage = ParcelFileDescriptor.open(downloadFile,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ stage =
+ ParcelFileDescriptor.open(
+ downloadFile,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
if (transport.getRestoreData(stage) != BackupTransport.TRANSPORT_OK) {
// Transport-level failure. This failure could be specific to package currently in
// restore.
Slog.e(TAG, "Error getting restore data for " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_KV_RESTORE,
mCurrentPackage,
@@ -840,7 +870,7 @@
downloadFile.delete();
UnifiedRestoreState nextState =
BackupAndRestoreFeatureFlags
- .getUnifiedRestoreContinueAfterTransportFailureInKvRestore()
+ .getUnifiedRestoreContinueAfterTransportFailureInKvRestore()
? UnifiedRestoreState.RUNNING_QUEUE
: UnifiedRestoreState.FINAL;
executeNextState(nextState);
@@ -852,13 +882,16 @@
// if appropriate
if (staging) {
stage.close();
- stage = ParcelFileDescriptor.open(downloadFile,
- ParcelFileDescriptor.MODE_READ_ONLY);
+ stage =
+ ParcelFileDescriptor.open(
+ downloadFile, ParcelFileDescriptor.MODE_READ_ONLY);
- mBackupData = ParcelFileDescriptor.open(mBackupDataName,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ mBackupData =
+ ParcelFileDescriptor.open(
+ mBackupDataName,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
BackupDataInput in = new BackupDataInput(stage.getFileDescriptor());
BackupDataOutput out = new BackupDataOutput(mBackupData.getFileDescriptor());
@@ -870,34 +903,40 @@
// Okay, we have the data. Now have the agent do the restore.
stage.close();
- mBackupData = ParcelFileDescriptor.open(mBackupDataName,
- ParcelFileDescriptor.MODE_READ_ONLY);
+ mBackupData =
+ ParcelFileDescriptor.open(mBackupDataName, ParcelFileDescriptor.MODE_READ_ONLY);
- mNewState = ParcelFileDescriptor.open(mNewStateName,
- ParcelFileDescriptor.MODE_READ_WRITE |
- ParcelFileDescriptor.MODE_CREATE |
- ParcelFileDescriptor.MODE_TRUNCATE);
+ mNewState =
+ ParcelFileDescriptor.open(
+ mNewStateName,
+ ParcelFileDescriptor.MODE_READ_WRITE
+ | ParcelFileDescriptor.MODE_CREATE
+ | ParcelFileDescriptor.MODE_TRUNCATE);
// Kick off the restore, checking for hung agents. The timeout or
// the operationComplete() callback will schedule the next step,
// so we do not do that here.
- long restoreAgentTimeoutMillis = mAgentTimeoutParameters.getRestoreAgentTimeoutMillis(
- app.applicationInfo.uid);
+ long restoreAgentTimeoutMillis =
+ mAgentTimeoutParameters.getRestoreAgentTimeoutMillis(app.applicationInfo.uid);
backupManagerService.prepareOperationTimeout(
mEphemeralOpToken, restoreAgentTimeoutMillis, this, OpType.RESTORE_WAIT);
startedAgentRestore = true;
- mAgent.doRestoreWithExcludedKeys(mBackupData, appVersionCode, mNewState,
- mEphemeralOpToken, backupManagerService.getBackupManagerBinder(),
+ mAgent.doRestoreWithExcludedKeys(
+ mBackupData,
+ appVersionCode,
+ mNewState,
+ mEphemeralOpToken,
+ backupManagerService.getBackupManagerBinder(),
new ArrayList<>(getExcludedKeysForPackage(packageName)));
} catch (Exception e) {
Slog.e(TAG, "Unable to call app for restore: " + packageName, e);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_KV_AGENT_ERROR,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- packageName, e.toString());
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
// Clears any pending timeout messages as well.
keyValueAgentErrorCleanup(startedAgentRestore);
@@ -915,8 +954,8 @@
// 2. Widget metadata needs to be separated from the rest to be handled separately
// But 'android' package doesn't contain widget metadata so we want to skip staging for it
// when there are no keys to be excluded either.
- return !packageName.equals(PLATFORM_PACKAGE_NAME) ||
- !getExcludedKeysForPackage(PLATFORM_PACKAGE_NAME).isEmpty();
+ return !packageName.equals(PLATFORM_PACKAGE_NAME)
+ || !getExcludedKeysForPackage(PLATFORM_PACKAGE_NAME).isEmpty();
}
@VisibleForTesting
@@ -970,14 +1009,16 @@
// When finished, StreamFeederThread executes next state as appropriate on the
// backup looper, and the overall unified restore task resumes
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
- /*monitoringExtras*/ addRestoreOperationTypeToEvent(/*extras*/null));
+ /* extras= */ addRestoreOperationTypeToEvent(/* extras= */ null));
try {
StreamFeederThread feeder = new StreamFeederThread();
if (MORE_DEBUG) {
- Slog.i(TAG, "Spinning threads for stream restore of "
- + mCurrentPackage.packageName);
+ Slog.i(
+ TAG,
+ "Spinning threads for stream restore of " + mCurrentPackage.packageName);
}
new Thread(feeder, "unified-stream-feeder").start();
@@ -988,9 +1029,10 @@
// current target. We haven't asked the transport for data yet, though,
// so we can do that simply by going back to running the restore queue.
Slog.e(TAG, "Unable to construct pipes for stream restore!");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_NO_FEEDER_THREAD, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_NO_FEEDER_THREAD,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -1005,24 +1047,24 @@
try {
long restoreAgentFinishedTimeoutMillis =
mAgentTimeoutParameters.getRestoreAgentFinishedTimeoutMillis();
- backupManagerService
- .prepareOperationTimeout(mEphemeralOpToken,
- restoreAgentFinishedTimeoutMillis, this,
- OpType.RESTORE_WAIT);
- mAgent.doRestoreFinished(mEphemeralOpToken,
- backupManagerService.getBackupManagerBinder());
+ backupManagerService.prepareOperationTimeout(
+ mEphemeralOpToken,
+ restoreAgentFinishedTimeoutMillis,
+ this,
+ OpType.RESTORE_WAIT);
+ mAgent.doRestoreFinished(
+ mEphemeralOpToken, backupManagerService.getBackupManagerBinder());
// If we get this far, the callback or timeout will schedule the
// next restore state, so we're done
} catch (Exception e) {
final String packageName = mCurrentPackage.packageName;
Slog.e(TAG, "Unable to finalize restore of " + packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE, mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- packageName, e.toString());
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
keyValueAgentErrorCleanup(true);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
}
@@ -1054,13 +1096,20 @@
UnifiedRestoreState nextState = UnifiedRestoreState.RUNNING_QUEUE;
int status = BackupTransport.TRANSPORT_OK;
- EventLog.writeEvent(EventLogTags.FULL_RESTORE_PACKAGE,
- mCurrentPackage.packageName);
+ EventLog.writeEvent(EventLogTags.FULL_RESTORE_PACKAGE, mCurrentPackage.packageName);
- mEngine = new FullRestoreEngine(backupManagerService, mOperationStorage,
- this, null, mBackupManagerMonitorEventSender.getMonitor(),
- mCurrentPackage, false, mEphemeralOpToken, false,
- mBackupEligibilityRules);
+ mEngine =
+ new FullRestoreEngine(
+ backupManagerService,
+ mOperationStorage,
+ /* monitorTask= */ this,
+ /* observer= */ null,
+ mBackupManagerMonitorEventSender.getMonitor(),
+ mCurrentPackage,
+ /* allowApks= */ false,
+ mEphemeralOpToken,
+ /* isAdbRestore= */ false,
+ mBackupEligibilityRules);
mEngineThread = new FullRestoreEngineThread(mEngine, mEnginePipes[0]);
ParcelFileDescriptor eWriteEnd = mEnginePipes[1];
@@ -1077,8 +1126,8 @@
String callerLogString = "PerformUnifiedRestoreTask$StreamFeederThread.run()";
try {
- BackupTransportClient transport = mTransportConnection.connectOrThrow(
- callerLogString);
+ BackupTransportClient transport =
+ mTransportConnection.connectOrThrow(callerLogString);
while (status == BackupTransport.TRANSPORT_OK) {
// have the transport write some of the restoring data to us
int result = transport.getNextFullRestoreDataChunk(tWriteEnd);
@@ -1104,17 +1153,24 @@
} else if (result == BackupTransport.NO_MORE_DATA) {
// Clean finish. Wind up and we're done!
if (MORE_DEBUG) {
- Slog.i(TAG, "Got clean full-restore EOF for "
- + mCurrentPackage.packageName);
+ Slog.i(
+ TAG,
+ "Got clean full-restore EOF for "
+ + mCurrentPackage.packageName);
}
status = BackupTransport.TRANSPORT_OK;
break;
} else {
// Transport reported some sort of failure; the fall-through
// handling will deal properly with that.
- Slog.e(TAG, "Error " + result + " streaming restore for "
- + mCurrentPackage.packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Slog.e(
+ TAG,
+ "Error "
+ + result
+ + " streaming restore for "
+ + mCurrentPackage.packageName);
+ Bundle monitoringExtras =
+ addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_FULL_RESTORE,
mCurrentPackage,
@@ -1132,21 +1188,23 @@
// but potentially recoverable; abandon this package's restore but
// carry on with the next restore target.
Slog.e(TAG, "Unable to route data for restore");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_FULL_AGENT_ERROR,
mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- mCurrentPackage.packageName, "I/O error on pipes");
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE,
+ mCurrentPackage.packageName,
+ "I/O error on pipes");
status = BackupTransport.AGENT_ERROR;
} catch (Exception e) {
// The transport threw; terminate the whole operation. Closing
// the sockets will wake up the engine and it will then tidy up the
// remote end.
Slog.e(TAG, "Transport failed during restore: " + e.getMessage());
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_ERROR_FULL_RESTORE,
mCurrentPackage,
@@ -1218,10 +1276,14 @@
// BackupRestoreTask interface, specifically for timeout handling
@Override
- public void execute() { /* intentionally empty */ }
+ public void execute() {
+ // intentionally empty
+ }
@Override
- public void operationComplete(long result) { /* intentionally empty */ }
+ public void operationComplete(long result) {
+ // intentionally empty
+ }
// The app has timed out handling a restoring file
@Override
@@ -1230,10 +1292,11 @@
if (DEBUG) {
Slog.w(TAG, "Full-data restore target timed out; shutting down");
}
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
monitoringExtras);
mEngineThread.handleTimeout();
@@ -1252,8 +1315,7 @@
String callerLogString = "PerformUnifiedRestoreTask.finalizeRestore()";
try {
- BackupTransportClient transport =
- mTransportConnection.connectOrThrow(callerLogString);
+ BackupTransportClient transport = mTransportConnection.connectOrThrow(callerLogString);
transport.finishRestore();
} catch (Exception e) {
Slog.e(TAG, "Error finishing restore", e);
@@ -1278,17 +1340,21 @@
Slog.v(TAG, "finishing PM token " + mPmToken);
}
try {
- backupManagerService.getPackageManagerBinder().finishPackageInstall(mPmToken,
- mDidLaunch);
- } catch (RemoteException e) { /* can't happen */ }
+ backupManagerService
+ .getPackageManagerBinder()
+ .finishPackageInstall(mPmToken, mDidLaunch);
+ } catch (RemoteException e) {
+ // can't happen
+ }
} else {
// We were invoked via an active restore session, not by the Package
// Manager, so start up the session timeout again.
long restoreAgentTimeoutMillis =
mAgentTimeoutParameters.getRestoreSessionTimeoutMillis();
- backupManagerService.getBackupHandler().sendEmptyMessageDelayed(
- MSG_RESTORE_SESSION_TIMEOUT,
- restoreAgentTimeoutMillis);
+ backupManagerService
+ .getBackupHandler()
+ .sendEmptyMessageDelayed(
+ MSG_RESTORE_SESSION_TIMEOUT, restoreAgentTimeoutMillis);
}
if (mIsSystemRestore) {
@@ -1312,9 +1378,12 @@
Slog.d(TAG, "Starting next pending restore.");
}
PerformUnifiedRestoreTask task = backupManagerService.getPendingRestores().remove();
- backupManagerService.getBackupHandler().sendMessage(
- backupManagerService.getBackupHandler().obtainMessage(
- MSG_BACKUP_RESTORE_STEP, task));
+ backupManagerService
+ .getBackupHandler()
+ .sendMessage(
+ backupManagerService
+ .getBackupHandler()
+ .obtainMessage(MSG_BACKUP_RESTORE_STEP, task));
} else {
backupManagerService.setRestoreInProgress(false);
@@ -1325,7 +1394,7 @@
}
Slog.i(TAG, "Restore complete.");
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_RESTORE_COMPLETE,
null,
@@ -1381,14 +1450,15 @@
// migration to the newly-restored device's dataset, we will change
// the following from a discard of the newly-written state to the
// "correct" operation of renaming into the canonical state blob.
- mNewStateName.delete(); // TODO: remove; see above comment
+ mNewStateName.delete(); // TODO: remove; see above comment
// If this wasn't the PM pseudopackage, tear down the agent side
if (mCurrentPackage.applicationInfo != null) {
// unbind and tidy up even on timeout or failure
try {
- backupManagerService.getActivityManager().unbindBackupAgent(
- mCurrentPackage.applicationInfo);
+ backupManagerService
+ .getActivityManager()
+ .unbindBackupAgent(mCurrentPackage.applicationInfo);
// The agent was probably running with a stub Application object,
// which isn't a valid run mode for the main app logic. Shut
@@ -1407,17 +1477,22 @@
final boolean killAfterRestore =
!UserHandle.isCore(mCurrentPackage.applicationInfo.uid)
&& ((mRestoreDescription.getDataType()
- == RestoreDescription.TYPE_FULL_STREAM)
- || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0));
+ == RestoreDescription.TYPE_FULL_STREAM)
+ || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE)
+ != 0));
if (mTargetPackage == null && killAfterRestore) {
if (DEBUG) {
- Slog.d(TAG, "Restore complete, killing host process of "
- + mCurrentPackage.applicationInfo.processName);
+ Slog.d(
+ TAG,
+ "Restore complete, killing host process of "
+ + mCurrentPackage.applicationInfo.processName);
}
- backupManagerService.getActivityManager().killApplicationProcess(
- mCurrentPackage.applicationInfo.processName,
- mCurrentPackage.applicationInfo.uid);
+ backupManagerService
+ .getActivityManager()
+ .killApplicationProcess(
+ mCurrentPackage.applicationInfo.processName,
+ mCurrentPackage.applicationInfo.uid);
}
} catch (RemoteException e) {
// can't happen; we run in the same process as the activity manager
@@ -1434,9 +1509,12 @@
mOperationStorage.removeOperation(mEphemeralOpToken);
if (MORE_DEBUG) {
- Slog.i(TAG, "operationComplete() during restore: target="
- + mCurrentPackage.packageName
- + " state=" + mState);
+ Slog.i(
+ TAG,
+ "operationComplete() during restore: target="
+ + mCurrentPackage.packageName
+ + " state="
+ + mState);
}
final UnifiedRestoreState nextState;
@@ -1449,30 +1527,31 @@
break;
case RESTORE_KEYVALUE:
- case RESTORE_FULL: {
+ case RESTORE_FULL:
// Okay, we've just heard back from the agent that it's done with
// the restore itself. We now have to send the same agent its
// doRestoreFinished() callback, so roll into that state.
nextState = UnifiedRestoreState.RESTORE_FINISHED;
break;
- }
- case RESTORE_FINISHED: {
+ case RESTORE_FINISHED:
// Okay, we're done with this package. Tidy up and go on to the next
// app in the queue.
int size = (int) mBackupDataName.length();
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
- BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_RESTORE_FINISHED, mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_RESTORE_FINISHED,
+ mCurrentPackage,
BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY,
monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_PACKAGE,
- mCurrentPackage.packageName, size);
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_PACKAGE, mCurrentPackage.packageName, size);
- // Ask the agent for logs after doRestoreFinished() has completed executing to allow
+ // Ask the agent for logs after doRestoreFinished() has completed executing to
+ // allow
// it to finalize its logs.
- mBackupManagerMonitorEventSender.monitorAgentLoggingResults(mCurrentPackage,
- mAgent);
+ mBackupManagerMonitorEventSender.monitorAgentLoggingResults(
+ mCurrentPackage, mAgent);
// Just go back to running the restore queue
keyValueAgentCleanup();
@@ -1481,22 +1560,20 @@
// incorporate it into current bookeeping and then pass that along to
// the app as part of the restore-time work.
if (mWidgetData != null) {
- backupManagerService.restoreWidgetData(mCurrentPackage.packageName,
- mWidgetData);
+ backupManagerService.restoreWidgetData(
+ mCurrentPackage.packageName, mWidgetData);
}
nextState = UnifiedRestoreState.RUNNING_QUEUE;
break;
- }
- default: {
+ default:
// Some kind of horrible semantic error; we're in an unexpected state.
// Back off hard and wind up.
Slog.e(TAG, "Unexpected restore callback into state " + mState);
keyValueAgentErrorCleanup(true);
nextState = UnifiedRestoreState.FINAL;
break;
- }
}
executeNextState(nextState);
@@ -1507,12 +1584,14 @@
public void handleCancel(boolean cancelAll) {
mOperationStorage.removeOperation(mEphemeralOpToken);
Slog.e(TAG, "Timeout restoring application " + mCurrentPackage.packageName);
- Bundle monitoringExtras = addRestoreOperationTypeToEvent(/*extras*/null);
+ Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null);
mBackupManagerMonitorEventSender.monitorEvent(
BackupManagerMonitor.LOG_EVENT_ID_KEY_VALUE_RESTORE_TIMEOUT,
- mCurrentPackage, BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT, monitoringExtras);
- EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
- mCurrentPackage.packageName, "restore timeout");
+ mCurrentPackage,
+ BackupManagerMonitor.LOG_EVENT_CATEGORY_AGENT,
+ monitoringExtras);
+ EventLog.writeEvent(
+ EventLogTags.RESTORE_AGENT_FAILURE, mCurrentPackage.packageName, "restore timeout");
// Handle like an agent that threw on invocation: wipe it and go on to the next
keyValueAgentErrorCleanup(true);
executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
@@ -1521,12 +1600,13 @@
@VisibleForTesting
void executeNextState(UnifiedRestoreState nextState) {
if (MORE_DEBUG) {
- Slog.i(TAG, " => executing next step on "
- + this + " nextState=" + nextState);
+ Slog.i(TAG, " => executing next step on " + this + " nextState=" + nextState);
}
mState = nextState;
- Message msg = backupManagerService.getBackupHandler().obtainMessage(
- MSG_BACKUP_RESTORE_STEP, this);
+ Message msg =
+ backupManagerService
+ .getBackupHandler()
+ .obtainMessage(MSG_BACKUP_RESTORE_STEP, this);
backupManagerService.getBackupHandler().sendMessage(msg);
}
@@ -1584,9 +1664,8 @@
}
}
- private Bundle addRestoreOperationTypeToEvent (@Nullable Bundle extra) {
+ private Bundle addRestoreOperationTypeToEvent(@Nullable Bundle extras) {
return mBackupManagerMonitorEventSender.putMonitoringExtra(
- extra,
- BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, RESTORE);
+ extras, BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, RESTORE);
}
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 71a1f01..cce596b 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -833,6 +833,13 @@
}
@Override
+ public boolean isPermissionTransferUserConsented(String packageName, int userId,
+ int associationId) {
+ return mSystemDataTransferProcessor.isPermissionTransferUserConsented(packageName,
+ userId, associationId);
+ }
+
+ @Override
public void startSystemDataTransfer(String packageName, int userId, int associationId,
ISystemDataTransferCallback callback) {
mSystemDataTransferProcessor.startSystemDataTransfer(packageName, userId,
diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
index e5c847a..bd646fa 100644
--- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
+++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java
@@ -120,7 +120,8 @@
* Resolve the requested association, throwing if the caller doesn't have
* adequate permissions.
*/
- private @NonNull AssociationInfo resolveAssociation(String packageName, int userId,
+ @NonNull
+ private AssociationInfo resolveAssociation(String packageName, int userId,
int associationId) {
AssociationInfo association = mAssociationStore.getAssociationById(associationId);
association = PermissionsUtils.sanitizeWithCallerChecks(mContext, association);
@@ -133,6 +134,20 @@
}
/**
+ * Return whether the user has consented to the permission transfer for the association.
+ */
+ public boolean isPermissionTransferUserConsented(String packageName, @UserIdInt int userId,
+ int associationId) {
+ resolveAssociation(packageName, userId, associationId);
+
+ PermissionSyncRequest request = getPermissionSyncRequest(associationId);
+ if (request == null) {
+ return false;
+ }
+ return request.isUserConsented();
+ }
+
+ /**
* Build a PendingIntent of permission sync user consent dialog
*/
public PendingIntent buildPermissionTransferUserConsentIntent(String packageName,
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 3323d0b..659112e 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -136,7 +136,6 @@
"android.hardware.light-V2.0-java",
"android.hardware.gnss-V2-java",
"android.hardware.vibrator-V2-java",
- "android.nfc.flags-aconfig-java",
"app-compat-annotations",
"framework-tethering.stubs.module_lib",
"service-art.stubs.system_server",
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 898b693..31c9348 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -45,7 +45,6 @@
import com.android.internal.pm.pkg.component.ParsedMainComponent;
import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.permission.persistence.RuntimePermissionsState;
import com.android.server.pm.Installer.LegacyDexoptDisabledException;
import com.android.server.pm.KnownPackages;
import com.android.server.pm.PackageArchiver;
@@ -1104,7 +1103,9 @@
* Read legacy permission states for permissions migration to new permission subsystem.
* Note that this api is supposed to be used for permissions state migration only.
*/
- public abstract RuntimePermissionsState getLegacyPermissionsState(@UserIdInt int userId);
+ // TODO: restore to com.android.permission.persistence.RuntimePermissionsState
+ // once Ravenwood includes Mainline stubs
+ public abstract Object getLegacyPermissionsState(@UserIdInt int userId);
/**
* @return permissions file version for the given user.
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index 6794f75..3280afdf 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -1797,8 +1797,13 @@
mFingerprints);
try {
- dump.write("user_keys", AdbDebuggingManagerProto.USER_KEYS,
- FileUtils.readTextFile(new File("/data/misc/adb/adb_keys"), 0, null));
+ File userKeys = new File("/data/misc/adb/adb_keys");
+ if (userKeys.exists()) {
+ dump.write("user_keys", AdbDebuggingManagerProto.USER_KEYS,
+ FileUtils.readTextFile(userKeys, 0, null));
+ } else {
+ Slog.i(TAG, "No user keys on this device");
+ }
} catch (IOException e) {
Slog.i(TAG, "Cannot read user keys", e);
}
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 1928780..f8f3d82 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -480,6 +480,7 @@
}
public void systemServicesReady() {
+ mStats.setPowerStatsCollectorEnabled(Flags.streamlinedBatteryStats());
mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(Flags.streamlinedBatteryStats());
mWorker.systemServicesReady();
mStats.systemServicesReady(mContext);
@@ -885,9 +886,7 @@
syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
}
- synchronized (mStats) {
- return mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, queries);
- }
+ return mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, queries);
}
/** Register callbacks for statsd pulled atoms. */
@@ -2648,7 +2647,9 @@
pw.println(" --proto: output as a binary protobuffer");
pw.println(" --model power-profile: use the power profile model"
+ " even if measured energy is available");
- pw.println(" --sample: collect and dump a sample of stats for debugging purpose");
+ if (Flags.streamlinedBatteryStats()) {
+ pw.println(" --sample: collect and dump a sample of stats for debugging purpose");
+ }
pw.println(" <package.name>: optional name of package to filter output by.");
pw.println(" -h: print this help text.");
pw.println("Battery stats (batterystats) commands:");
@@ -2727,13 +2728,13 @@
BatteryUsageStatsQuery query = builder.build();
synchronized (mStats) {
mStats.prepareForDumpLocked();
- BatteryUsageStats batteryUsageStats =
- mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query);
- if (proto) {
- batteryUsageStats.dumpToProto(fd);
- } else {
- batteryUsageStats.dump(pw, "");
- }
+ }
+ BatteryUsageStats batteryUsageStats =
+ mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query);
+ if (proto) {
+ batteryUsageStats.dumpToProto(fd);
+ } else {
+ batteryUsageStats.dump(pw, "");
}
}
@@ -2938,10 +2939,10 @@
mCpuWakeupStats.dump(new IndentingPrintWriter(pw, " "),
SystemClock.elapsedRealtime());
return;
- } else if ("--sample".equals(arg)) {
+ } else if (Flags.streamlinedBatteryStats() && "--sample".equals(arg)) {
dumpStatsSample(pw);
return;
- } else if ("--aggregated".equals(arg)) {
+ } else if (Flags.streamlinedBatteryStats() && "--aggregated".equals(arg)) {
dumpAggregatedStats(pw);
return;
} else if ("--store".equals(arg)) {
diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
index 3ce92bc..0b56146 100644
--- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java
@@ -361,7 +361,8 @@
&& (record.userId == testRecord.userId)
&& record.intent.filterEquals(testRecord.intent)
&& isReceiverEquals(receiver, testReceiver)
- && testRecord.allReceiversPending()) {
+ && testRecord.allReceiversPending()
+ && record.isMatchingRecord(testRecord)) {
// Exact match found; perform in-place swap
args.arg1 = record;
args.argi1 = recordIndex;
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index e07631c..ad49991 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -230,6 +230,14 @@
new AtomicReference<>();
/**
+ * Container for holding the set of broadcast records that matches an enqueueing record.
+ * @see BroadcastRecord#isMatchingRecord(BroadcastRecord)
+ */
+ @GuardedBy("mService")
+ private final AtomicReference<ArrayMap<BroadcastRecord, Boolean>> mMatchingRecordsCache =
+ new AtomicReference<>();
+
+ /**
* Map from UID to its last known "foreground" state. A UID is considered to be in
* "foreground" state when it's procState is {@link ActivityManager#PROCESS_STATE_TOP}.
* <p>
@@ -747,6 +755,12 @@
if (replacedBroadcasts == null) {
replacedBroadcasts = new ArraySet<>();
}
+ ArrayMap<BroadcastRecord, Boolean> matchingBroadcasts =
+ mMatchingRecordsCache.getAndSet(null);
+ if (matchingBroadcasts == null) {
+ matchingBroadcasts = new ArrayMap<>();
+ }
+ r.setMatchingRecordsCache(matchingBroadcasts);
boolean enqueuedBroadcast = false;
for (int i = 0; i < r.receivers.size(); i++) {
@@ -780,6 +794,9 @@
skipAndCancelReplacedBroadcasts(replacedBroadcasts);
replacedBroadcasts.clear();
mReplacedBroadcastsCache.compareAndSet(null, replacedBroadcasts);
+ matchingBroadcasts.clear();
+ r.clearMatchingRecordsCache();
+ mMatchingRecordsCache.compareAndSet(null, matchingBroadcasts);
// If nothing to dispatch, send any pending result immediately
if (r.receivers.isEmpty() || !enqueuedBroadcast) {
diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java
index 198adcb..99b91ff 100644
--- a/services/core/java/com/android/server/am/BroadcastRecord.java
+++ b/services/core/java/com/android/server/am/BroadcastRecord.java
@@ -61,6 +61,7 @@
import android.os.Bundle;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.util.ArrayMap;
import android.util.PrintWriterPrinter;
import android.util.SparseArray;
import android.util.TimeUtils;
@@ -164,6 +165,11 @@
@Nullable
final BiFunction<Integer, Bundle, Bundle> filterExtrasForReceiver;
+ // Cache of records that are "matching" this. Only used at the time of enqueuing this record
+ // into the queue.
+ @Nullable
+ private ArrayMap<BroadcastRecord, Boolean> mMatchingRecordsCache;
+
private @Nullable String mCachedToString;
private @Nullable String mCachedToShortString;
@@ -1250,6 +1256,33 @@
return (terminalCount == 0 && dispatchTime <= 0);
}
+ boolean isMatchingRecord(@NonNull BroadcastRecord record) {
+ final int idx = mMatchingRecordsCache.indexOfKey(record);
+ if (idx > 0) {
+ return mMatchingRecordsCache.valueAt(idx);
+ }
+ // Consider a record to be matching if has the same receivers in the same order.
+ boolean matches = (receivers.size() == record.receivers.size());
+ if (matches) {
+ for (int i = receivers.size() - 1; i >= 0; --i) {
+ if (!isReceiverEquals(receivers.get(i), record.receivers.get(i))) {
+ matches = false;
+ break;
+ }
+ }
+ }
+ mMatchingRecordsCache.put(record, matches);
+ return matches;
+ }
+
+ void setMatchingRecordsCache(@NonNull ArrayMap<BroadcastRecord, Boolean> matchingRecordsCache) {
+ mMatchingRecordsCache = matchingRecordsCache;
+ }
+
+ void clearMatchingRecordsCache() {
+ mMatchingRecordsCache = null;
+ }
+
@Override
public String toString() {
if (mCachedToString == null) {
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index f47482d..95ef2b4 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -120,7 +120,7 @@
static final String[] sDeviceConfigAconfigScopes = new String[] {
"accessibility",
"android_core_networking",
- "angle",
+ "aoc",
"app_widgets",
"arc_next",
"avic",
@@ -144,6 +144,7 @@
"dck_framework",
"devoptions_settings",
"game",
+ "gpu",
"haptics",
"hardware_backed_security_mainline",
"input",
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 3446737..7780b39 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -1180,6 +1180,8 @@
uidState.pkgOps.put(packageName,
new Ops(packageName, uidState));
}
+
+ createSandboxUidStateIfNotExistsForAppLocked(uid);
}
}
}
@@ -1261,6 +1263,8 @@
ops.put(code, new Op(uidState, packageName, code, uid));
}
}
+
+ createSandboxUidStateIfNotExistsForAppLocked(uid);
}
/**
@@ -4011,6 +4015,11 @@
return uidState;
}
+ private void createSandboxUidStateIfNotExistsForAppLocked(int uid) {
+ final int sandboxUid = Process.toSdkSandboxUid(uid);
+ getUidStateLocked(sandboxUid, true);
+ }
+
private void updateAppWidgetVisibility(SparseArray<String> uidPackageNames, boolean visible) {
synchronized (this) {
getUidStateTracker().updateAppWidgetVisibility(uidPackageNames, visible);
diff --git a/services/core/java/com/android/server/appop/AudioRestrictionManager.java b/services/core/java/com/android/server/appop/AudioRestrictionManager.java
index be87037..b9ccc53 100644
--- a/services/core/java/com/android/server/appop/AudioRestrictionManager.java
+++ b/services/core/java/com/android/server/appop/AudioRestrictionManager.java
@@ -43,7 +43,7 @@
static {
SparseBooleanArray audioMutedUsages = new SparseBooleanArray();
SparseBooleanArray vibrationMutedUsages = new SparseBooleanArray();
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.SDK_USAGES.toArray()) {
final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage);
if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION ||
suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL ||
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index b1706ed..2f7d99f 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1595,8 +1595,8 @@
sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs);
}
- /*package*/ void setLeAudioTimeout(String address, int device, int delayMs) {
- sendILMsg(MSG_IL_BTLEAUDIO_TIMEOUT, SENDMSG_QUEUE, device, address, delayMs);
+ /*package*/ void setLeAudioTimeout(String address, int device, int codec, int delayMs) {
+ sendIILMsg(MSG_IIL_BTLEAUDIO_TIMEOUT, SENDMSG_QUEUE, device, codec, address, delayMs);
}
/*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) {
@@ -1794,8 +1794,9 @@
return;
}
@AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
- mBtHelper.getA2dpCodecWithFallbackToSBC(
- btInfo.mDevice, "MSG_L_SET_BT_ACTIVE_DEVICE");
+ mBtHelper.getCodecWithFallback(btInfo.mDevice,
+ btInfo.mProfile, btInfo.mIsLeOutput,
+ "MSG_L_SET_BT_ACTIVE_DEVICE");
mDeviceInventory.onSetBtActiveDevice(btInfo, codec,
(btInfo.mProfile
!= BluetoothProfile.LE_AUDIO || btInfo.mIsLeOutput)
@@ -1819,22 +1820,24 @@
case MSG_IL_BTA2DP_TIMEOUT:
// msg.obj == address of BTA2DP device
synchronized (mDeviceStateLock) {
- mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1);
+ mDeviceInventory.onMakeA2dpDeviceUnavailableNow(
+ (String) msg.obj, msg.arg1);
}
break;
- case MSG_IL_BTLEAUDIO_TIMEOUT:
+ case MSG_IIL_BTLEAUDIO_TIMEOUT:
// msg.obj == address of LE Audio device
synchronized (mDeviceStateLock) {
mDeviceInventory.onMakeLeAudioDeviceUnavailableNow(
- (String) msg.obj, msg.arg1);
+ (String) msg.obj, msg.arg1, msg.arg2);
}
break;
case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE: {
final BtDeviceInfo btInfo = (BtDeviceInfo) msg.obj;
synchronized (mDeviceStateLock) {
@AudioSystem.AudioFormatNativeEnumForBtCodec final int codec =
- mBtHelper.getA2dpCodecWithFallbackToSBC(
- btInfo.mDevice, "MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE");
+ mBtHelper.getCodecWithFallback(btInfo.mDevice,
+ btInfo.mProfile, btInfo.mIsLeOutput,
+ "MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE");
mDeviceInventory.onBluetoothDeviceConfigChange(
btInfo, codec, BtHelper.EVENT_DEVICE_CONFIG_CHANGE);
}
@@ -2084,7 +2087,7 @@
private static final int MSG_IL_SAVE_NDEF_DEVICE_FOR_STRATEGY = 47;
private static final int MSG_IL_SAVE_REMOVE_NDEF_DEVICE_FOR_STRATEGY = 48;
- private static final int MSG_IL_BTLEAUDIO_TIMEOUT = 49;
+ private static final int MSG_IIL_BTLEAUDIO_TIMEOUT = 49;
private static final int MSG_L_NOTIFY_PREFERRED_AUDIOPROFILE_APPLIED = 52;
private static final int MSG_L_CHECK_COMMUNICATION_DEVICE_REMOVAL = 53;
@@ -2104,7 +2107,7 @@
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
case MSG_L_SET_BT_ACTIVE_DEVICE:
case MSG_IL_BTA2DP_TIMEOUT:
- case MSG_IL_BTLEAUDIO_TIMEOUT:
+ case MSG_IIL_BTLEAUDIO_TIMEOUT:
case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE:
case MSG_TOGGLE_HDMI:
case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT:
@@ -2196,7 +2199,7 @@
case MSG_L_SET_BT_ACTIVE_DEVICE:
case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
case MSG_IL_BTA2DP_TIMEOUT:
- case MSG_IL_BTLEAUDIO_TIMEOUT:
+ case MSG_IIL_BTLEAUDIO_TIMEOUT:
case MSG_L_BLUETOOTH_DEVICE_CONFIG_CHANGE:
if (sLastDeviceConnectMsgTime >= time) {
// add a little delay to make sure messages are ordered as expected
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index e9b102b..e503f1f 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -689,9 +689,11 @@
case BluetoothProfile.LE_AUDIO:
case BluetoothProfile.LE_AUDIO_BROADCAST:
if (switchToUnavailable) {
- makeLeAudioDeviceUnavailableNow(address, btInfo.mAudioSystemDevice);
+ makeLeAudioDeviceUnavailableNow(address,
+ btInfo.mAudioSystemDevice, di.mDeviceCodecFormat);
} else if (switchToAvailable) {
- makeLeAudioDeviceAvailable(btInfo, streamType, "onSetBtActiveDevice");
+ makeLeAudioDeviceAvailable(
+ btInfo, streamType, codec, "onSetBtActiveDevice");
}
break;
default: throw new IllegalArgumentException("Invalid profile "
@@ -752,12 +754,13 @@
if (event == BtHelper.EVENT_DEVICE_CONFIG_CHANGE) {
- boolean a2dpCodecChange = false;
- if (btInfo.mProfile == BluetoothProfile.A2DP) {
+ boolean codecChange = false;
+ if (btInfo.mProfile == BluetoothProfile.A2DP
+ || btInfo.mProfile == BluetoothProfile.LE_AUDIO) {
if (di.mDeviceCodecFormat != codec) {
di.mDeviceCodecFormat = codec;
mConnectedDevices.replace(key, di);
- a2dpCodecChange = true;
+ codecChange = true;
}
final int res = mAudioSystem.handleDeviceConfigChange(
btInfo.mAudioSystemDevice, address, BtHelper.getName(btDevice), codec);
@@ -782,7 +785,7 @@
}
}
- if (!a2dpCodecChange) {
+ if (!codecChange) {
updateBluetoothPreferredModes_l(btDevice /*connectedDevice*/);
}
}
@@ -796,9 +799,9 @@
}
}
- /*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device) {
+ /*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device, int codec) {
synchronized (mDevicesLock) {
- makeLeAudioDeviceUnavailableNow(address, device);
+ makeLeAudioDeviceUnavailableNow(address, device, codec);
}
}
@@ -1335,6 +1338,27 @@
}
}
+ private static boolean devicesListEqual(@NonNull List<AudioDeviceAttributes> list1,
+ @NonNull List<AudioDeviceAttributes> list2) {
+ if (list1.size() != list2.size()) {
+ return false;
+ }
+ // This assumes a given device is only present once in a list
+ for (AudioDeviceAttributes d1 : list1) {
+ boolean found = false;
+ for (AudioDeviceAttributes d2 : list2) {
+ if (d1.equalTypeAddress(d2)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return false;
+ }
+ }
+ return true;
+ }
+
private int setDevicesRole(
ArrayMap<Pair<Integer, Integer>, List<AudioDeviceAttributes>> rolesMap,
AudioSystemInterface addOp,
@@ -1342,31 +1366,26 @@
int useCase, int role, @NonNull List<AudioDeviceAttributes> devices) {
synchronized (rolesMap) {
Pair<Integer, Integer> key = new Pair<>(useCase, role);
- List<AudioDeviceAttributes> roleDevices = new ArrayList<>();
- List<AudioDeviceAttributes> appliedDevices = new ArrayList<>();
-
if (rolesMap.containsKey(key)) {
- roleDevices = rolesMap.get(key);
- boolean equal = false;
- if (roleDevices.size() == devices.size()) {
- roleDevices.retainAll(devices);
- equal = roleDevices.size() == devices.size();
+ if (devicesListEqual(devices, rolesMap.get(key))) {
+ // NO OP: no change in preference
+ return AudioSystem.SUCCESS;
}
- if (!equal) {
- clearOp.deviceRoleAction(useCase, role, null);
- roleDevices.clear();
- appliedDevices.addAll(devices);
- }
- } else {
- appliedDevices.addAll(devices);
- }
- if (appliedDevices.isEmpty()) {
+ } else if (devices.isEmpty()) {
+ // NO OP: no preference to no preference
return AudioSystem.SUCCESS;
}
- final int status = addOp.deviceRoleAction(useCase, role, appliedDevices);
- if (status == AudioSystem.SUCCESS) {
- roleDevices.addAll(appliedDevices);
- rolesMap.put(key, roleDevices);
+ int status;
+ if (devices.isEmpty()) {
+ status = clearOp.deviceRoleAction(useCase, role, null);
+ if (status == AudioSystem.SUCCESS) {
+ rolesMap.remove(key);
+ }
+ } else {
+ status = addOp.deviceRoleAction(useCase, role, devices);
+ if (status == AudioSystem.SUCCESS) {
+ rolesMap.put(key, devices);
+ }
}
return status;
}
@@ -1641,11 +1660,12 @@
}
synchronized (mDevicesLock) {
- final ArraySet<String> toRemove = new ArraySet<>();
+ final ArraySet<Pair<String, Integer>> toRemove = new ArraySet<>();
// Disconnect ALL DEVICE_OUT_BLE_HEADSET or DEVICE_OUT_BLE_BROADCAST devices
mConnectedDevices.values().forEach(deviceInfo -> {
if (deviceInfo.mDeviceType == device) {
- toRemove.add(deviceInfo.mDeviceAddress);
+ toRemove.add(
+ new Pair<>(deviceInfo.mDeviceAddress, deviceInfo.mDeviceCodecFormat));
}
});
new MediaMetrics.Item(mMetricsId + "disconnectLeAudio")
@@ -1655,8 +1675,8 @@
final int delay = checkSendBecomingNoisyIntentInt(device,
AudioService.CONNECTION_STATE_DISCONNECTED,
AudioSystem.DEVICE_NONE);
- toRemove.stream().forEach(deviceAddress ->
- makeLeAudioDeviceUnavailableLater(deviceAddress, device, delay)
+ toRemove.stream().forEach(entry ->
+ makeLeAudioDeviceUnavailableLater(entry.first, device, entry.second, delay)
);
}
}
@@ -2200,7 +2220,8 @@
@GuardedBy("mDevicesLock")
private void makeLeAudioDeviceAvailable(
- AudioDeviceBroker.BtDeviceInfo btInfo, int streamType, String eventSource) {
+ AudioDeviceBroker.BtDeviceInfo btInfo, int streamType,
+ @AudioSystem.AudioFormatNativeEnumForBtCodec int codec, String eventSource) {
final int volumeIndex = btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10;
final int device = btInfo.mAudioSystemDevice;
@@ -2234,7 +2255,7 @@
AudioDeviceAttributes ada = new AudioDeviceAttributes(device, address, name);
final int res = AudioSystem.setDeviceConnectionState(ada,
- AudioSystem.DEVICE_STATE_AVAILABLE, AudioSystem.AUDIO_FORMAT_DEFAULT);
+ AudioSystem.DEVICE_STATE_AVAILABLE, codec);
if (res != AudioSystem.AUDIO_STATUS_OK) {
AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
"APM failed to make available LE Audio device addr=" + address
@@ -2249,7 +2270,7 @@
// Reset LEA suspend state each time a new sink is connected
mDeviceBroker.clearLeAudioSuspended(true /* internalOnly */);
mConnectedDevices.put(DeviceInfo.makeDeviceListKey(device, address),
- new DeviceInfo(device, name, address, AudioSystem.AUDIO_FORMAT_DEFAULT,
+ new DeviceInfo(device, name, address, codec,
peerAddress, groupId));
mDeviceBroker.postAccessoryPlugMediaUnmute(device);
setCurrentAudioRouteNameIfPossible(name, /*fromA2dp=*/false);
@@ -2272,13 +2293,14 @@
}
@GuardedBy("mDevicesLock")
- private void makeLeAudioDeviceUnavailableNow(String address, int device) {
+ private void makeLeAudioDeviceUnavailableNow(String address, int device,
+ @AudioSystem.AudioFormatNativeEnumForBtCodec int codec) {
AudioDeviceAttributes ada = null;
if (device != AudioSystem.DEVICE_NONE) {
ada = new AudioDeviceAttributes(device, address);
final int res = AudioSystem.setDeviceConnectionState(ada,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
- AudioSystem.AUDIO_FORMAT_DEFAULT);
+ codec);
if (res != AudioSystem.AUDIO_STATUS_OK) {
AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
@@ -2303,7 +2325,8 @@
}
@GuardedBy("mDevicesLock")
- private void makeLeAudioDeviceUnavailableLater(String address, int device, int delayMs) {
+ private void makeLeAudioDeviceUnavailableLater(
+ String address, int device, int codec, int delayMs) {
// prevent any activity on the LEA output to avoid unwanted
// reconnection of the sink.
mDeviceBroker.setLeAudioSuspended(
@@ -2311,7 +2334,7 @@
// the device will be made unavailable later, so consider it disconnected right away
mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address));
// send the delayed message to make the device unavailable later
- mDeviceBroker.setLeAudioTimeout(address, device, delayMs);
+ mDeviceBroker.setLeAudioTimeout(address, device, codec, delayMs);
}
@GuardedBy("mDevicesLock")
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5d47e35..4f6c6d6 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -38,6 +38,7 @@
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE;
+import static com.android.media.audio.Flags.alarmMinVolumeZero;
import static com.android.media.audio.Flags.bluetoothMacAddressAnonymization;
import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume;
import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE;
@@ -94,6 +95,7 @@
import android.hidl.manager.V1_0.IServiceManager;
import android.media.AudioAttributes;
import android.media.AudioAttributes.AttributeSystemUsage;
+import android.media.AudioDescriptor;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioDeviceVolumeManager;
@@ -106,6 +108,7 @@
import android.media.AudioManagerInternal;
import android.media.AudioMixerAttributes;
import android.media.AudioPlaybackConfiguration;
+import android.media.AudioProfile;
import android.media.AudioRecordingConfiguration;
import android.media.AudioRoutesInfo;
import android.media.AudioSystem;
@@ -233,6 +236,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -1191,6 +1195,19 @@
MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = maxAlarmVolume;
}
+ if (alarmMinVolumeZero()) {
+ try {
+ int minAlarmVolume = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_audio_alarm_min_vol);
+ if (minAlarmVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]) {
+ MIN_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = minAlarmVolume;
+ } else {
+ Log.e(TAG, "Error min alarm volume greater than max alarm volume");
+ }
+ } catch (Resources.NotFoundException e) {
+ Log.e(TAG, "Error querying for alarm min volume ", e);
+ }
+ }
int defaultAlarmVolume = SystemProperties.getInt("ro.config.alarm_vol_default", -1);
if (defaultAlarmVolume != -1 &&
defaultAlarmVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]) {
@@ -7673,6 +7690,13 @@
@Retention(RetentionPolicy.SOURCE)
public @interface ConnectionState {}
+ /**
+ * Default SAD for a TV using ARC, used when the Amplifier didn't report any SADs.
+ * Represents 2-channel LPCM including all defined sample rates and bit depths.
+ * For the format definition, see Table 34 in the CEA standard CEA-861-D.
+ */
+ private static final byte[] DEFAULT_ARC_AUDIO_DESCRIPTOR = new byte[]{0x09, 0x7f, 0x07};
+
@android.annotation.EnforcePermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
/**
* see AudioManager.setWiredDeviceConnectionState()
@@ -7684,6 +7708,27 @@
attributes = retrieveBluetoothAddress(attributes);
+ // When using ARC, a TV should use default 2 channel LPCM if the Amplifier didn't
+ // report any SADs. See section 13.15.3 of the HDMI-CEC spec version 1.4b.
+ if (attributes.getType() == AudioDeviceInfo.TYPE_HDMI_ARC
+ && attributes.getRole() == AudioDeviceAttributes.ROLE_OUTPUT
+ && attributes.getAudioDescriptors().isEmpty()) {
+ attributes = new AudioDeviceAttributes(
+ attributes.getRole(),
+ attributes.getType(),
+ attributes.getAddress(),
+ attributes.getName(),
+ attributes.getAudioProfiles(),
+ new ArrayList<AudioDescriptor>(Collections.singletonList(
+ new AudioDescriptor(
+ AudioDescriptor.STANDARD_EDID,
+ AudioProfile.AUDIO_ENCAPSULATION_TYPE_NONE,
+ DEFAULT_ARC_AUDIO_DESCRIPTOR
+ )
+ ))
+ );
+ }
+
if (state != CONNECTION_STATE_CONNECTED
&& state != CONNECTION_STATE_DISCONNECTED) {
throw new IllegalArgumentException("Invalid state " + state);
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 7b96215..a078d08 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -26,6 +26,7 @@
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothLeAudio;
+import android.bluetooth.BluetoothLeAudioCodecConfig;
import android.bluetooth.BluetoothLeAudioCodecStatus;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
@@ -250,35 +251,73 @@
}
}
- /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec int getA2dpCodec(
- @NonNull BluetoothDevice device) {
- if (mA2dp == null) {
- return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ /*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec int getCodec(
+ @NonNull BluetoothDevice device, @AudioService.BtProfile int profile) {
+ switch (profile) {
+ case BluetoothProfile.A2DP: {
+ if (mA2dp == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ BluetoothCodecStatus btCodecStatus = null;
+ try {
+ btCodecStatus = mA2dp.getCodecStatus(device);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception while getting status of " + device, e);
+ }
+ if (btCodecStatus == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ final BluetoothCodecConfig btCodecConfig = btCodecStatus.getCodecConfig();
+ if (btCodecConfig == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ return AudioSystem.bluetoothA2dpCodecToAudioFormat(btCodecConfig.getCodecType());
+ }
+ case BluetoothProfile.LE_AUDIO: {
+ if (mLeAudio == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ BluetoothLeAudioCodecStatus btLeCodecStatus = null;
+ int groupId = mLeAudio.getGroupId(device);
+ try {
+ btLeCodecStatus = mLeAudio.getCodecStatus(groupId);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception while getting status of " + device, e);
+ }
+ if (btLeCodecStatus == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ BluetoothLeAudioCodecConfig btLeCodecConfig =
+ btLeCodecStatus.getOutputCodecConfig();
+ if (btLeCodecConfig == null) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ return AudioSystem.bluetoothLeCodecToAudioFormat(btLeCodecConfig.getCodecType());
+ }
+ default:
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
}
- BluetoothCodecStatus btCodecStatus = null;
- try {
- btCodecStatus = mA2dp.getCodecStatus(device);
- } catch (Exception e) {
- Log.e(TAG, "Exception while getting status of " + device, e);
- }
- if (btCodecStatus == null) {
- return AudioSystem.AUDIO_FORMAT_DEFAULT;
- }
- final BluetoothCodecConfig btCodecConfig = btCodecStatus.getCodecConfig();
- if (btCodecConfig == null) {
- return AudioSystem.AUDIO_FORMAT_DEFAULT;
- }
- return AudioSystem.bluetoothCodecToAudioFormat(btCodecConfig.getCodecType());
}
/*package*/ synchronized @AudioSystem.AudioFormatNativeEnumForBtCodec
- int getA2dpCodecWithFallbackToSBC(
- @NonNull BluetoothDevice device, @NonNull String source) {
- @AudioSystem.AudioFormatNativeEnumForBtCodec int codec = getA2dpCodec(device);
+ int getCodecWithFallback(
+ @NonNull BluetoothDevice device, @AudioService.BtProfile int profile,
+ boolean isLeOutput, @NonNull String source) {
+ // For profiles other than A2DP and LE Audio output, the audio codec format must be
+ // AUDIO_FORMAT_DEFAULT as native audio policy manager expects a specific audio format
+ // only if audio HW module selection based on format is supported for the device type.
+ if (!(profile == BluetoothProfile.A2DP
+ || (profile == BluetoothProfile.LE_AUDIO && isLeOutput))) {
+ return AudioSystem.AUDIO_FORMAT_DEFAULT;
+ }
+ @AudioSystem.AudioFormatNativeEnumForBtCodec int codec =
+ getCodec(device, profile);
if (codec == AudioSystem.AUDIO_FORMAT_DEFAULT) {
AudioService.sDeviceLogger.enqueue(new EventLogger.StringEvent(
- "getA2dpCodec DEFAULT from " + source + " fallback to SBC"));
- return AudioSystem.AUDIO_FORMAT_SBC;
+ "getCodec DEFAULT from " + source + " fallback to "
+ + (profile == BluetoothProfile.A2DP ? "SBC" : "LC3")));
+ return profile == BluetoothProfile.A2DP
+ ? AudioSystem.AUDIO_FORMAT_SBC : AudioSystem.AUDIO_FORMAT_LC3;
}
return codec;
}
diff --git a/services/core/java/com/android/server/audio/SpatializerHelper.java b/services/core/java/com/android/server/audio/SpatializerHelper.java
index 61e4f36..4f7f31d 100644
--- a/services/core/java/com/android/server/audio/SpatializerHelper.java
+++ b/services/core/java/com/android/server/audio/SpatializerHelper.java
@@ -1016,6 +1016,11 @@
if (mSpat == null) {
mSpatCallback = new SpatializerCallback();
mSpat = AudioSystem.getSpatializer(mSpatCallback);
+ if (mSpat == null) {
+ Log.e(TAG, "createSpat(): No Spatializer found");
+ postReset();
+ return;
+ }
try {
//TODO: register heatracking callback only when sensors are registered
if (mIsHeadTrackingSupported) {
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 7452228..95a047f 100644
--- a/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
+++ b/services/core/java/com/android/server/biometrics/log/BiometricContextProvider.java
@@ -116,8 +116,10 @@
service.setBiometicContextListener(new IBiometricContextListener.Stub() {
@Override
public void onFoldChanged(int foldState) {
- mFoldState = foldState;
- // no need to notify, not sent to HAL
+ if (mFoldState != foldState) {
+ mFoldState = foldState;
+ notifyChanged();
+ }
}
@Override
@@ -254,6 +256,7 @@
+ "isAwake: " + isAwake() + ", "
+ "isDisplayOn: " + isDisplayOn() + ", "
+ "dock: " + getDockedState() + ", "
- + "rotation: " + getCurrentRotation() + "]";
+ + "rotation: " + getCurrentRotation() + ", "
+ + "foldState: " + mFoldState + "]";
}
}
diff --git a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
index f78ca43..b4e0dff 100644
--- a/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
+++ b/services/core/java/com/android/server/biometrics/log/OperationContextExt.java
@@ -23,6 +23,7 @@
import android.hardware.biometrics.IBiometricContextListener;
import android.hardware.biometrics.common.AuthenticateReason;
import android.hardware.biometrics.common.DisplayState;
+import android.hardware.biometrics.common.FoldState;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.common.OperationReason;
import android.hardware.biometrics.common.WakeReason;
@@ -250,6 +251,7 @@
OperationContextExt update(@NonNull BiometricContext biometricContext, boolean isCrypto) {
mAidlContext.isAod = biometricContext.isAod();
mAidlContext.displayState = toAidlDisplayState(biometricContext.getDisplayState());
+ mAidlContext.foldState = toAidlFoldState(biometricContext.getFoldState());
mAidlContext.isCrypto = isCrypto;
setFirstSessionId(biometricContext);
@@ -276,6 +278,19 @@
return DisplayState.UNKNOWN;
}
+ @FoldState
+ private static int toAidlFoldState(@IBiometricContextListener.FoldState int state) {
+ switch (state) {
+ case IBiometricContextListener.FoldState.FULLY_CLOSED:
+ return FoldState.FULLY_CLOSED;
+ case IBiometricContextListener.FoldState.FULLY_OPENED:
+ return FoldState.FULLY_OPENED;
+ case IBiometricContextListener.FoldState.HALF_OPENED:
+ return FoldState.HALF_OPENED;
+ }
+ return FoldState.UNKNOWN;
+ }
+
private void setFirstSessionId(@NonNull BiometricContext biometricContext) {
if (mIsBP) {
mSessionInfo = biometricContext.getBiometricPromptSessionInfo();
diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java
index 5bb5c53..a796544 100644
--- a/services/core/java/com/android/server/camera/CameraServiceProxy.java
+++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java
@@ -52,7 +52,6 @@
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.media.AudioManager;
-import android.nfc.INfcAdapter;
import android.nfc.NfcAdapter;
import android.nfc.NfcManager;
import android.os.Binder;
@@ -1281,45 +1280,19 @@
}
}
- // TODO(b/303286040): Remove the raw INfcAdapter usage once |ENABLE_NFC_MAINLINE_FLAG| is
- // rolled out.
- private static final String NFC_SERVICE_BINDER_NAME = "nfc";
- // Flags arguments to NFC adapter to enable/disable NFC
- public static final int DISABLE_POLLING_FLAGS = 0x1000;
- public static final int ENABLE_POLLING_FLAGS = 0x0000;
- private void setNfcReaderModeUsingINfcAdapter(boolean enablePolling) {
- IBinder nfcServiceBinder = getBinderService(NFC_SERVICE_BINDER_NAME);
- if (nfcServiceBinder == null) {
+ private void notifyNfcService(boolean enablePolling) {
+ NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
+ if (nfcManager == null) {
Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
return;
}
- INfcAdapter nfcAdapterRaw = INfcAdapter.Stub.asInterface(nfcServiceBinder);
- int flags = enablePolling ? ENABLE_POLLING_FLAGS : DISABLE_POLLING_FLAGS;
- if (DEBUG) Slog.v(TAG, "Setting NFC reader mode to flags " + flags);
- try {
- nfcAdapterRaw.setReaderMode(nfcInterfaceToken, null, flags, null);
- } catch (RemoteException e) {
- Slog.w(TAG, "Could not notify NFC service, remote exception: " + e);
+ NfcAdapter nfcAdapter = nfcManager.getDefaultAdapter();
+ if (nfcAdapter == null) {
+ Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
+ return;
}
- }
-
- private void notifyNfcService(boolean enablePolling) {
- if (android.nfc.Flags.enableNfcMainline()) {
- NfcManager nfcManager = mContext.getSystemService(NfcManager.class);
- if (nfcManager == null) {
- Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
- return;
- }
- NfcAdapter nfcAdapter = nfcManager.getDefaultAdapter();
- if (nfcAdapter == null) {
- Slog.w(TAG, "Could not connect to NFC service to notify it of camera state");
- return;
- }
- if (DEBUG) Slog.v(TAG, "Setting NFC reader mode. enablePolling: " + enablePolling);
- nfcAdapter.setReaderMode(enablePolling);
- } else {
- setNfcReaderModeUsingINfcAdapter(enablePolling);
- }
+ if (DEBUG) Slog.v(TAG, "Setting NFC reader mode. enablePolling: " + enablePolling);
+ nfcAdapter.setReaderMode(enablePolling);
}
private static int[] toArray(Collection<Integer> c) {
diff --git a/services/core/java/com/android/server/clipboard/ClipboardService.java b/services/core/java/com/android/server/clipboard/ClipboardService.java
index b394fb5..56a94ec0 100644
--- a/services/core/java/com/android/server/clipboard/ClipboardService.java
+++ b/services/core/java/com/android/server/clipboard/ClipboardService.java
@@ -56,6 +56,7 @@
import android.hardware.display.DisplayManager;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
@@ -67,7 +68,6 @@
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
@@ -116,8 +116,6 @@
public class ClipboardService extends SystemService {
private static final String TAG = "ClipboardService";
- private static final boolean IS_EMULATOR =
- SystemProperties.getBoolean("ro.boot.qemu", false);
@VisibleForTesting
public static final long DEFAULT_CLIPBOARD_TIMEOUT_MILLIS = 3600000;
@@ -193,7 +191,7 @@
mAutofillInternal = LocalServices.getService(AutofillManagerInternal.class);
final IBinder permOwner = mUgmInternal.newUriPermissionOwner("clipboard");
mPermissionOwner = permOwner;
- if (IS_EMULATOR) {
+ if (Build.IS_EMULATOR) {
mEmulatorClipboardMonitor = new EmulatorClipboardMonitor((clip) -> {
synchronized (mLock) {
Clipboard clipboard = getClipboardLocked(0, DEVICE_ID_DEFAULT);
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index aef2248..c517058 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -56,7 +56,6 @@
import android.content.pm.UserInfo;
import android.net.ConnectivityDiagnosticsManager;
import android.net.ConnectivityManager;
-import android.net.DnsResolver;
import android.net.INetd;
import android.net.INetworkManagementEventObserver;
import android.net.Ikev2VpnProfile;
@@ -67,8 +66,6 @@
import android.net.IpSecTransform;
import android.net.LinkAddress;
import android.net.LinkProperties;
-import android.net.LocalSocket;
-import android.net.LocalSocketAddress;
import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkAgentConfig;
@@ -109,7 +106,6 @@
import android.os.Binder;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
-import android.os.CancellationSignal;
import android.os.Handler;
import android.os.IBinder;
import android.os.INetworkManagementService;
@@ -120,7 +116,6 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
-import android.os.SystemService;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -160,11 +155,8 @@
import libcore.io.IoUtils;
-import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -190,8 +182,6 @@
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledFuture;
@@ -451,10 +441,6 @@
// The user id of initiating VPN.
private final int mUserId;
- interface RetryScheduler {
- void checkInterruptAndDelay(boolean sleepLonger) throws InterruptedException;
- }
-
private static class CarrierConfigInfo {
public final String mccMnc;
public final int keepaliveDelaySec;
@@ -483,26 +469,6 @@
return Binder.getCallingUid() == Process.SYSTEM_UID;
}
- public void startService(final String serviceName) {
- SystemService.start(serviceName);
- }
-
- public void stopService(final String serviceName) {
- SystemService.stop(serviceName);
- }
-
- public boolean isServiceRunning(final String serviceName) {
- return SystemService.isRunning(serviceName);
- }
-
- public boolean isServiceStopped(final String serviceName) {
- return SystemService.isStopped(serviceName);
- }
-
- public File getStateFile() {
- return new File("/data/misc/vpn/state");
- }
-
public DeviceIdleInternal getDeviceIdleInternal() {
return LocalServices.getService(DeviceIdleInternal.class);
}
@@ -511,104 +477,6 @@
return VpnConfig.getIntentForStatusPanel(context);
}
- public void sendArgumentsToDaemon(
- final String daemon, final LocalSocket socket, final String[] arguments,
- final RetryScheduler retryScheduler) throws IOException, InterruptedException {
- final LocalSocketAddress address = new LocalSocketAddress(
- daemon, LocalSocketAddress.Namespace.RESERVED);
-
- // Wait for the socket to connect.
- while (true) {
- try {
- socket.connect(address);
- break;
- } catch (Exception e) {
- // ignore
- }
- retryScheduler.checkInterruptAndDelay(true /* sleepLonger */);
- }
- socket.setSoTimeout(500);
-
- final OutputStream out = socket.getOutputStream();
- for (String argument : arguments) {
- byte[] bytes = argument.getBytes(StandardCharsets.UTF_8);
- if (bytes.length >= 0xFFFF) {
- throw new IllegalArgumentException("Argument is too large");
- }
- out.write(bytes.length >> 8);
- out.write(bytes.length);
- out.write(bytes);
- retryScheduler.checkInterruptAndDelay(false /* sleepLonger */);
- }
- out.write(0xFF);
- out.write(0xFF);
-
- // Wait for End-of-File.
- final InputStream in = socket.getInputStream();
- while (true) {
- try {
- if (in.read() == -1) {
- break;
- }
- } catch (Exception e) {
- // ignore
- }
- retryScheduler.checkInterruptAndDelay(true /* sleepLonger */);
- }
- }
-
- @NonNull
- public InetAddress resolve(final String endpoint)
- throws ExecutionException, InterruptedException {
- try {
- return InetAddresses.parseNumericAddress(endpoint);
- } catch (IllegalArgumentException e) {
- // Endpoint is not numeric : fall through and resolve
- }
-
- final CancellationSignal cancellationSignal = new CancellationSignal();
- try {
- final DnsResolver resolver = DnsResolver.getInstance();
- final CompletableFuture<InetAddress> result = new CompletableFuture();
- final DnsResolver.Callback<List<InetAddress>> cb =
- new DnsResolver.Callback<List<InetAddress>>() {
- @Override
- public void onAnswer(@NonNull final List<InetAddress> answer,
- final int rcode) {
- if (answer.size() > 0) {
- result.complete(answer.get(0));
- } else {
- result.completeExceptionally(
- new UnknownHostException(endpoint));
- }
- }
-
- @Override
- public void onError(@Nullable final DnsResolver.DnsException error) {
- // Unfortunately UnknownHostException doesn't accept a cause, so
- // print a message here instead. Only show the summary, not the
- // full stack trace.
- Log.e(TAG, "Async dns resolver error : " + error);
- result.completeExceptionally(new UnknownHostException(endpoint));
- }
- };
- resolver.query(null /* network, null for default */, endpoint,
- DnsResolver.FLAG_EMPTY, r -> r.run(), cancellationSignal, cb);
- return result.get();
- } catch (final ExecutionException e) {
- Log.e(TAG, "Cannot resolve VPN endpoint : " + endpoint + ".", e);
- throw e;
- } catch (final InterruptedException e) {
- Log.e(TAG, "Legacy VPN was interrupted while resolving the endpoint", e);
- cancellationSignal.cancel();
- throw e;
- }
- }
-
- public boolean isInterfacePresent(final Vpn vpn, final String iface) {
- return vpn.jniCheck(iface) != 0;
- }
-
/**
* @see ParcelFileDescriptor#adoptFd(int)
*/
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index f09fcea..2cca72e 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1978,8 +1978,9 @@
|| sdrAnimateValue != currentSdrBrightness)) {
boolean skipAnimation = initialRampSkip || hasBrightnessBuckets
|| !isDisplayContentVisible || brightnessIsTemporary;
- if (!skipAnimation && BrightnessSynchronizer.floatEquals(
- sdrAnimateValue, currentSdrBrightness)) {
+ final boolean isHdrOnlyChange = BrightnessSynchronizer.floatEquals(
+ sdrAnimateValue, currentSdrBrightness);
+ if (mFlags.isFastHdrTransitionsEnabled() && !skipAnimation && isHdrOnlyChange) {
// SDR brightness is unchanged, so animate quickly as this is only impacting
// a likely minority amount of display content
// ie, the highlights of an HDR video or UltraHDR image
diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java
index 5310e43..810ac08 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController2.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController2.java
@@ -1602,8 +1602,9 @@
|| sdrAnimateValue != currentSdrBrightness)) {
boolean skipAnimation = initialRampSkip || hasBrightnessBuckets
|| !isDisplayContentVisible || brightnessIsTemporary;
- if (!skipAnimation && BrightnessSynchronizer.floatEquals(
- sdrAnimateValue, currentSdrBrightness)) {
+ final boolean isHdrOnlyChange = BrightnessSynchronizer.floatEquals(
+ sdrAnimateValue, currentSdrBrightness);
+ if (mFlags.isFastHdrTransitionsEnabled() && !skipAnimation && isHdrOnlyChange) {
// SDR brightness is unchanged, so animate quickly as this is only impacting
// a likely minority amount of display content
// ie, the highlights of an HDR video or UltraHDR image
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index 2d5da71..bd5e189 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -101,6 +101,10 @@
Flags.FLAG_AUTO_BRIGHTNESS_MODES,
Flags::autoBrightnessModes);
+ private final FlagState mFastHdrTransitions = new FlagState(
+ Flags.FLAG_FAST_HDR_TRANSITIONS,
+ Flags::fastHdrTransitions);
+
/** Returns whether connected display management is enabled or not. */
public boolean isConnectedDisplayManagementEnabled() {
return mConnectedDisplayManagementFlagState.isEnabled();
@@ -190,7 +194,7 @@
return mBrightnessIntRangeUserPerceptionFlagState.isEnabled();
}
- public boolean isExternalVsyncProximityVoteEnabled() {
+ public boolean isVsyncProximityVoteEnabled() {
return mVsyncProximityVote.isEnabled();
}
@@ -205,6 +209,10 @@
return mAutoBrightnessModesFlagState.isEnabled();
}
+ public boolean isFastHdrTransitionsEnabled() {
+ return mFastHdrTransitions.isEnabled();
+ }
+
/**
* dumps all flagstates
* @param pw printWriter
@@ -226,6 +234,7 @@
pw.println(" " + mVsyncProximityVote);
pw.println(" " + mBrightnessWearBedtimeModeClamperFlagState);
pw.println(" " + mAutoBrightnessModesFlagState);
+ pw.println(" " + mFastHdrTransitions);
}
private static class FlagState {
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index 1b4d74c..7a723a3 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -144,3 +144,12 @@
bug: "293613040"
is_fixed_read_only: true
}
+
+flag {
+ name: "fast_hdr_transitions"
+ namespace: "display_manager"
+ description: "Feature flag for fast transitions into/out of HDR"
+ bug: "292124102"
+ is_fixed_read_only: true
+}
+
diff --git a/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java b/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
index c04df64..c538231 100644
--- a/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
+++ b/services/core/java/com/android/server/display/mode/BaseModeRefreshRateVote.java
@@ -31,7 +31,7 @@
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (summary.appRequestBaseModeRefreshRate == 0f
&& mAppRequestBaseModeRefreshRate > 0f) {
summary.appRequestBaseModeRefreshRate = mAppRequestBaseModeRefreshRate;
diff --git a/services/core/java/com/android/server/display/mode/CombinedVote.java b/services/core/java/com/android/server/display/mode/CombinedVote.java
index f24fe3a..4b68791 100644
--- a/services/core/java/com/android/server/display/mode/CombinedVote.java
+++ b/services/core/java/com/android/server/display/mode/CombinedVote.java
@@ -28,7 +28,7 @@
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
mVotes.forEach(vote -> vote.updateSummary(summary));
}
diff --git a/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java b/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
index 2fc5590..7f57406 100644
--- a/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
+++ b/services/core/java/com/android/server/display/mode/DisableRefreshRateSwitchingVote.java
@@ -31,7 +31,7 @@
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.disableRefreshRateSwitching =
summary.disableRefreshRateSwitching || mDisableRefreshRateSwitching;
}
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 8fa838d..f7b540b 100644
--- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
+++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java
@@ -179,6 +179,9 @@
private final boolean mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled;
+ private final boolean mVsyncProximityVoteEnabled;
+
+
public DisplayModeDirector(@NonNull Context context, @NonNull Handler handler,
@NonNull DisplayManagerFlags displayManagerFlags) {
this(context, handler, new RealInjector(context), displayManagerFlags);
@@ -196,6 +199,7 @@
.isDisplaysRefreshRatesSynchronizationEnabled();
mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled = displayManagerFlags
.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled();
+ mVsyncProximityVoteEnabled = displayManagerFlags.isVsyncProximityVoteEnabled();
mContext = context;
mHandler = new DisplayModeDirectorHandler(handler.getLooper());
mInjector = injector;
@@ -262,130 +266,6 @@
mVotesStorage.setLoggingEnabled(loggingEnabled);
}
- static final class VoteSummary {
- public float minPhysicalRefreshRate;
- public float maxPhysicalRefreshRate;
- public float minRenderFrameRate;
- public float maxRenderFrameRate;
- public int width;
- public int height;
- public int minWidth;
- public int minHeight;
- public boolean disableRefreshRateSwitching;
- public float appRequestBaseModeRefreshRate;
-
- public List<SupportedModesVote.SupportedMode> supportedModes;
-
- final boolean mIsDisplayResolutionRangeVotingEnabled;
-
- VoteSummary(boolean isDisplayResolutionRangeVotingEnabled) {
- mIsDisplayResolutionRangeVotingEnabled = isDisplayResolutionRangeVotingEnabled;
- reset();
- }
-
- public void reset() {
- minPhysicalRefreshRate = 0f;
- maxPhysicalRefreshRate = Float.POSITIVE_INFINITY;
- minRenderFrameRate = 0f;
- maxRenderFrameRate = Float.POSITIVE_INFINITY;
- width = Vote.INVALID_SIZE;
- height = Vote.INVALID_SIZE;
- minWidth = 0;
- minHeight = 0;
- disableRefreshRateSwitching = false;
- appRequestBaseModeRefreshRate = 0f;
- }
-
- @Override
- public String toString() {
- return "minPhysicalRefreshRate=" + minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + minRenderFrameRate
- + ", maxRenderFrameRate=" + maxRenderFrameRate
- + ", width=" + width
- + ", height=" + height
- + ", minWidth=" + minWidth
- + ", minHeight=" + minHeight
- + ", disableRefreshRateSwitching=" + disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate=" + appRequestBaseModeRefreshRate;
- }
- }
-
- // VoteSummary is returned as an output param to cut down a bit on the number of temporary
- // objects.
- private void summarizeVotes(
- SparseArray<Vote> votes,
- int lowestConsideredPriority,
- int highestConsideredPriority,
- /*out*/ VoteSummary summary) {
- summary.reset();
- for (int priority = highestConsideredPriority;
- priority >= lowestConsideredPriority;
- priority--) {
- Vote vote = votes.get(priority);
- if (vote == null) {
- continue;
- }
-
- vote.updateSummary(summary);
-
- if (mLoggingEnabled) {
- Slog.w(TAG, "Vote summary for priority " + Vote.priorityToString(priority)
- + ": " + summary);
- }
- }
- }
-
- private boolean equalsWithinFloatTolerance(float a, float b) {
- return a >= b - FLOAT_TOLERANCE && a <= b + FLOAT_TOLERANCE;
- }
-
- private Display.Mode selectBaseMode(VoteSummary summary,
- ArrayList<Display.Mode> availableModes, Display.Mode defaultMode) {
- // The base mode should be as close as possible to the app requested mode. Since all the
- // available modes already have the same size, we just need to look for a matching refresh
- // rate. If the summary doesn't include an app requested refresh rate, we'll use the default
- // mode refresh rate. This is important because SurfaceFlinger can do only seamless switches
- // by default. Some devices (e.g. TV) don't support seamless switching so the mode we select
- // here won't be changed.
- float preferredRefreshRate =
- summary.appRequestBaseModeRefreshRate > 0
- ? summary.appRequestBaseModeRefreshRate : defaultMode.getRefreshRate();
- for (Display.Mode availableMode : availableModes) {
- if (equalsWithinFloatTolerance(preferredRefreshRate, availableMode.getRefreshRate())) {
- return availableMode;
- }
- }
-
- // If we couldn't find a mode id based on the refresh rate, it means that the available
- // modes were filtered by the app requested size, which is different that the default mode
- // size, and the requested app refresh rate was dropped from the summary due to a higher
- // priority vote. Since we don't have any other hint about the refresh rate,
- // we just pick the first.
- return !availableModes.isEmpty() ? availableModes.get(0) : null;
- }
-
- private void disableModeSwitching(VoteSummary summary, float fps) {
- summary.minPhysicalRefreshRate = summary.maxPhysicalRefreshRate = fps;
- summary.maxRenderFrameRate = Math.min(summary.maxRenderFrameRate, fps);
-
- if (mLoggingEnabled) {
- Slog.i(TAG, "Disabled mode switching on summary: " + summary);
- }
- }
-
- private void disableRenderRateSwitching(VoteSummary summary, float fps) {
- summary.minRenderFrameRate = summary.maxRenderFrameRate;
-
- if (!isRenderRateAchievable(fps, summary)) {
- summary.minRenderFrameRate = summary.maxRenderFrameRate = fps;
- }
-
- if (mLoggingEnabled) {
- Slog.i(TAG, "Disabled render rate switching on summary: " + summary);
- }
- }
-
/**
* Calculates the refresh rate ranges and display modes that the system is allowed to freely
* switch between based on global and display-specific constraints.
@@ -407,9 +287,10 @@
return new DesiredDisplayModeSpecs();
}
- ArrayList<Display.Mode> availableModes = new ArrayList<>();
+ List<Display.Mode> availableModes = new ArrayList<>();
availableModes.add(defaultMode);
- VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled);
+ VoteSummary primarySummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled,
+ mVsyncProximityVoteEnabled, mLoggingEnabled, mSupportsFrameRateOverride);
int lowestConsideredPriority = Vote.MIN_PRIORITY;
int highestConsideredPriority = Vote.MAX_PRIORITY;
@@ -421,39 +302,18 @@
// We try to find a range of priorities which define a non-empty set of allowed display
// modes. Each time we fail we increase the lowest priority.
while (lowestConsideredPriority <= highestConsideredPriority) {
- summarizeVotes(
- votes, lowestConsideredPriority, highestConsideredPriority, primarySummary);
+ primarySummary.applyVotes(
+ votes, lowestConsideredPriority, highestConsideredPriority);
- // If we don't have anything specifying the width / height of the display, just use
- // the default width and height. We don't want these switching out from underneath
- // us since it's a pretty disruptive behavior.
- if (primarySummary.height == Vote.INVALID_SIZE
- || primarySummary.width == Vote.INVALID_SIZE) {
- primarySummary.width = defaultMode.getPhysicalWidth();
- primarySummary.height = defaultMode.getPhysicalHeight();
- } else if (mIsDisplayResolutionRangeVotingEnabled) {
- updateSummaryWithBestAllowedResolution(modes, primarySummary);
- }
+ primarySummary.adjustSize(defaultMode, modes);
- availableModes = filterModes(modes, primarySummary);
+ availableModes = primarySummary.filterModes(modes);
if (!availableModes.isEmpty()) {
if (mLoggingEnabled) {
Slog.w(TAG, "Found available modes=" + availableModes
+ " with lowest priority considered "
+ Vote.priorityToString(lowestConsideredPriority)
- + " and constraints: "
- + "width=" + primarySummary.width
- + ", height=" + primarySummary.height
- + ", minPhysicalRefreshRate="
- + primarySummary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate="
- + primarySummary.maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + primarySummary.minRenderFrameRate
- + ", maxRenderFrameRate=" + primarySummary.maxRenderFrameRate
- + ", disableRefreshRateSwitching="
- + primarySummary.disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate="
- + primarySummary.appRequestBaseModeRefreshRate);
+ + " and summary: " + primarySummary);
}
break;
}
@@ -461,17 +321,7 @@
if (mLoggingEnabled) {
Slog.w(TAG, "Couldn't find available modes with lowest priority set to "
+ Vote.priorityToString(lowestConsideredPriority)
- + " and with the following constraints: "
- + "width=" + primarySummary.width
- + ", height=" + primarySummary.height
- + ", minPhysicalRefreshRate=" + primarySummary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + primarySummary.maxPhysicalRefreshRate
- + ", minRenderFrameRate=" + primarySummary.minRenderFrameRate
- + ", maxRenderFrameRate=" + primarySummary.maxRenderFrameRate
- + ", disableRefreshRateSwitching="
- + primarySummary.disableRefreshRateSwitching
- + ", appRequestBaseModeRefreshRate="
- + primarySummary.appRequestBaseModeRefreshRate);
+ + " and with the following summary: " + primarySummary);
}
// If we haven't found anything with the current set of votes, drop the
@@ -479,51 +329,16 @@
lowestConsideredPriority++;
}
- if (mLoggingEnabled) {
- Slog.i(TAG,
- "Primary physical range: ["
- + primarySummary.minPhysicalRefreshRate
- + " "
- + primarySummary.maxPhysicalRefreshRate
- + "] render frame rate range: ["
- + primarySummary.minRenderFrameRate
- + " "
- + primarySummary.maxRenderFrameRate
- + "]");
- }
+ VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled,
+ mVsyncProximityVoteEnabled, mLoggingEnabled, mSupportsFrameRateOverride);
- VoteSummary appRequestSummary = new VoteSummary(mIsDisplayResolutionRangeVotingEnabled);
- summarizeVotes(
- votes,
+ appRequestSummary.applyVotes(votes,
Vote.APP_REQUEST_REFRESH_RATE_RANGE_PRIORITY_CUTOFF,
- Vote.MAX_PRIORITY,
- appRequestSummary);
- appRequestSummary.minPhysicalRefreshRate =
- Math.min(appRequestSummary.minPhysicalRefreshRate,
- primarySummary.minPhysicalRefreshRate);
- appRequestSummary.maxPhysicalRefreshRate =
- Math.max(appRequestSummary.maxPhysicalRefreshRate,
- primarySummary.maxPhysicalRefreshRate);
- appRequestSummary.minRenderFrameRate =
- Math.min(appRequestSummary.minRenderFrameRate,
- primarySummary.minRenderFrameRate);
- appRequestSummary.maxRenderFrameRate =
- Math.max(appRequestSummary.maxRenderFrameRate,
- primarySummary.maxRenderFrameRate);
- if (mLoggingEnabled) {
- Slog.i(TAG,
- "App request range: ["
- + appRequestSummary.minPhysicalRefreshRate
- + " "
- + appRequestSummary.maxPhysicalRefreshRate
- + "] Frame rate range: ["
- + appRequestSummary.minRenderFrameRate
- + " "
- + appRequestSummary.maxRenderFrameRate
- + "]");
- }
+ Vote.MAX_PRIORITY);
- Display.Mode baseMode = selectBaseMode(primarySummary, availableModes, defaultMode);
+ appRequestSummary.limitRefreshRanges(primarySummary);
+
+ Display.Mode baseMode = primarySummary.selectBaseMode(availableModes, defaultMode);
if (baseMode == null) {
Slog.w(TAG, "Can't find a set of allowed modes which satisfies the votes. Falling"
+ " back to the default mode. Display = " + displayId + ", votes = " + votes
@@ -544,13 +359,12 @@
if (modeSwitchingDisabled || primarySummary.disableRefreshRateSwitching) {
float fps = baseMode.getRefreshRate();
- disableModeSwitching(primarySummary, fps);
+ primarySummary.disableModeSwitching(fps);
if (modeSwitchingDisabled) {
- disableModeSwitching(appRequestSummary, fps);
- disableRenderRateSwitching(primarySummary, fps);
-
+ appRequestSummary.disableModeSwitching(fps);
+ primarySummary.disableRenderRateSwitching(fps);
if (mModeSwitchingType == DisplayManager.SWITCHING_TYPE_NONE) {
- disableRenderRateSwitching(appRequestSummary, fps);
+ appRequestSummary.disableRenderRateSwitching(fps);
}
}
}
@@ -577,138 +391,6 @@
}
}
- private boolean isRenderRateAchievable(float physicalRefreshRate, VoteSummary summary) {
- // Check whether the render frame rate range is achievable by the mode's physical
- // refresh rate, meaning that if a divisor of the physical refresh rate is in range
- // of the render frame rate.
- // For example for the render frame rate [50, 70]:
- // - 120Hz is in range as we can render at 60hz by skipping every other frame,
- // which is within the render rate range
- // - 90hz is not in range as none of the even divisors (i.e. 90, 45, 30)
- // fall within the acceptable render range.
- final int divisor =
- (int) Math.ceil((physicalRefreshRate / summary.maxRenderFrameRate)
- - FLOAT_TOLERANCE);
- float adjustedPhysicalRefreshRate = physicalRefreshRate / divisor;
- return adjustedPhysicalRefreshRate >= (summary.minRenderFrameRate - FLOAT_TOLERANCE);
- }
-
- private ArrayList<Display.Mode> filterModes(Display.Mode[] supportedModes,
- VoteSummary summary) {
- if (summary.minRenderFrameRate > summary.maxRenderFrameRate + FLOAT_TOLERANCE) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Vote summary resulted in empty set (invalid frame rate range)"
- + ": minRenderFrameRate=" + summary.minRenderFrameRate
- + ", maxRenderFrameRate=" + summary.maxRenderFrameRate);
- }
- return new ArrayList<>();
- }
-
- ArrayList<Display.Mode> availableModes = new ArrayList<>();
- boolean missingBaseModeRefreshRate = summary.appRequestBaseModeRefreshRate > 0f;
- for (Display.Mode mode : supportedModes) {
- if (mode.getPhysicalWidth() != summary.width
- || mode.getPhysicalHeight() != summary.height) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
- + ": desiredWidth=" + summary.width
- + ": desiredHeight=" + summary.height
- + ": actualWidth=" + mode.getPhysicalWidth()
- + ": actualHeight=" + mode.getPhysicalHeight());
- }
- continue;
- }
- final float physicalRefreshRate = mode.getRefreshRate();
- // Some refresh rates are calculated based on frame timings, so they aren't *exactly*
- // equal to expected refresh rate. Given that, we apply a bit of tolerance to this
- // comparison.
- if (physicalRefreshRate < (summary.minPhysicalRefreshRate - FLOAT_TOLERANCE)
- || physicalRefreshRate > (summary.maxPhysicalRefreshRate + FLOAT_TOLERANCE)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside refresh rate bounds"
- + ": minPhysicalRefreshRate=" + summary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + summary.maxPhysicalRefreshRate
- + ", modeRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
-
- // The physical refresh rate must be in the render frame rate range, unless
- // frame rate override is supported.
- if (!mSupportsFrameRateOverride) {
- if (physicalRefreshRate < (summary.minRenderFrameRate - FLOAT_TOLERANCE)
- || physicalRefreshRate > (summary.maxRenderFrameRate + FLOAT_TOLERANCE)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside render rate bounds"
- + ": minPhysicalRefreshRate=" + summary.minPhysicalRefreshRate
- + ", maxPhysicalRefreshRate=" + summary.maxPhysicalRefreshRate
- + ", modeRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
- }
-
- if (!isRenderRateAchievable(physicalRefreshRate, summary)) {
- if (mLoggingEnabled) {
- Slog.w(TAG, "Discarding mode " + mode.getModeId()
- + ", outside frame rate bounds"
- + ": minRenderFrameRate=" + summary.minRenderFrameRate
- + ", maxRenderFrameRate=" + summary.maxRenderFrameRate
- + ", modePhysicalRefreshRate=" + physicalRefreshRate);
- }
- continue;
- }
-
- availableModes.add(mode);
- if (equalsWithinFloatTolerance(mode.getRefreshRate(),
- summary.appRequestBaseModeRefreshRate)) {
- missingBaseModeRefreshRate = false;
- }
- }
- if (missingBaseModeRefreshRate) {
- return new ArrayList<>();
- }
-
- return availableModes;
- }
-
- private void updateSummaryWithBestAllowedResolution(final Display.Mode[] supportedModes,
- VoteSummary outSummary) {
- final int maxAllowedWidth = outSummary.width;
- final int maxAllowedHeight = outSummary.height;
- if (mLoggingEnabled) {
- Slog.i(TAG, "updateSummaryWithBestAllowedResolution " + outSummary);
- }
- outSummary.width = Vote.INVALID_SIZE;
- outSummary.height = Vote.INVALID_SIZE;
-
- int maxNumberOfPixels = 0;
- for (Display.Mode mode : supportedModes) {
- if (mode.getPhysicalWidth() > maxAllowedWidth
- || mode.getPhysicalHeight() > maxAllowedHeight
- || mode.getPhysicalWidth() < outSummary.minWidth
- || mode.getPhysicalHeight() < outSummary.minHeight
- || mode.getRefreshRate() < (outSummary.minPhysicalRefreshRate - FLOAT_TOLERANCE)
- || mode.getRefreshRate() > (outSummary.maxPhysicalRefreshRate + FLOAT_TOLERANCE)
- ) {
- continue;
- }
-
- int numberOfPixels = mode.getPhysicalHeight() * mode.getPhysicalWidth();
- if (numberOfPixels > maxNumberOfPixels || (mode.getPhysicalWidth() == maxAllowedWidth
- && mode.getPhysicalHeight() == maxAllowedHeight)) {
- if (mLoggingEnabled) {
- Slog.i(TAG, "updateSummaryWithBestAllowedResolution updated with " + mode);
- }
- maxNumberOfPixels = numberOfPixels;
- outSummary.width = mode.getPhysicalWidth();
- outSummary.height = mode.getPhysicalHeight();
- }
- }
- }
-
/**
* Gets the observer responsible for application display mode requests.
*/
diff --git a/services/core/java/com/android/server/display/mode/RefreshRateVote.java b/services/core/java/com/android/server/display/mode/RefreshRateVote.java
index 173b3c5..670b8a1 100644
--- a/services/core/java/com/android/server/display/mode/RefreshRateVote.java
+++ b/services/core/java/com/android/server/display/mode/RefreshRateVote.java
@@ -64,7 +64,7 @@
* Vote: min(ignored) min(applied) min(applied+physical) max(applied) max(ignored)
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.minRenderFrameRate = Math.max(summary.minRenderFrameRate, mMinRefreshRate);
summary.maxRenderFrameRate = Math.min(summary.maxRenderFrameRate, mMaxRefreshRate);
// Physical refresh rate cannot be lower than the minimal render frame rate.
@@ -97,7 +97,7 @@
* Vote: min(ignored) min(applied) max(applied+render) max(applied) max(ignored)
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
summary.minPhysicalRefreshRate = Math.max(summary.minPhysicalRefreshRate,
mMinRefreshRate);
summary.maxPhysicalRefreshRate = Math.min(summary.maxPhysicalRefreshRate,
diff --git a/services/core/java/com/android/server/display/mode/SizeVote.java b/services/core/java/com/android/server/display/mode/SizeVote.java
index a9b18a5..f2f8dc4 100644
--- a/services/core/java/com/android/server/display/mode/SizeVote.java
+++ b/services/core/java/com/android/server/display/mode/SizeVote.java
@@ -48,7 +48,7 @@
}
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (mHeight > 0 && mWidth > 0) {
// For display size, disable refresh rate switching and base mode refresh rate use
// only the first vote we come across (i.e. the highest priority vote that includes
diff --git a/services/core/java/com/android/server/display/mode/SupportedModesVote.java b/services/core/java/com/android/server/display/mode/SupportedModesVote.java
index b31461f..7eebcc0 100644
--- a/services/core/java/com/android/server/display/mode/SupportedModesVote.java
+++ b/services/core/java/com/android/server/display/mode/SupportedModesVote.java
@@ -35,7 +35,7 @@
* If summary.supportedModes==null then there is no restriction on supportedModes
*/
@Override
- public void updateSummary(DisplayModeDirector.VoteSummary summary) {
+ public void updateSummary(VoteSummary summary) {
if (summary.supportedModes == null) {
summary.supportedModes = new ArrayList<>(mSupportedModes);
} else {
diff --git a/services/core/java/com/android/server/display/mode/Vote.java b/services/core/java/com/android/server/display/mode/Vote.java
index c1cdd69..aa44566 100644
--- a/services/core/java/com/android/server/display/mode/Vote.java
+++ b/services/core/java/com/android/server/display/mode/Vote.java
@@ -128,7 +128,7 @@
*/
int INVALID_SIZE = -1;
- void updateSummary(DisplayModeDirector.VoteSummary summary);
+ void updateSummary(VoteSummary summary);
static Vote forPhysicalRefreshRates(float minRefreshRate, float maxRefreshRate) {
return new CombinedVote(
diff --git a/services/core/java/com/android/server/display/mode/VoteSummary.java b/services/core/java/com/android/server/display/mode/VoteSummary.java
new file mode 100644
index 0000000..99f4142
--- /dev/null
+++ b/services/core/java/com/android/server/display/mode/VoteSummary.java
@@ -0,0 +1,376 @@
+/*
+ * 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.display.mode;
+
+import android.util.Slog;
+import android.util.SparseArray;
+import android.view.Display;
+import android.view.SurfaceControl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class VoteSummary {
+ private static final float FLOAT_TOLERANCE = SurfaceControl.RefreshRateRange.FLOAT_TOLERANCE;
+ private static final String TAG = "VoteSummary";
+
+ public float minPhysicalRefreshRate;
+ public float maxPhysicalRefreshRate;
+ public float minRenderFrameRate;
+ public float maxRenderFrameRate;
+ public int width;
+ public int height;
+ public int minWidth;
+ public int minHeight;
+ public boolean disableRefreshRateSwitching;
+ public float appRequestBaseModeRefreshRate;
+
+ public List<SupportedModesVote.SupportedMode> supportedModes;
+
+ final boolean mIsDisplayResolutionRangeVotingEnabled;
+
+ private final boolean mVsyncProximityVoteEnabled;
+ private final boolean mSupportsFrameRateOverride;
+ private final boolean mLoggingEnabled;
+
+ VoteSummary(boolean isDisplayResolutionRangeVotingEnabled, boolean vsyncProximityVoteEnabled,
+ boolean loggingEnabled, boolean supportsFrameRateOverride) {
+ mIsDisplayResolutionRangeVotingEnabled = isDisplayResolutionRangeVotingEnabled;
+ mVsyncProximityVoteEnabled = vsyncProximityVoteEnabled;
+ mLoggingEnabled = loggingEnabled;
+ mSupportsFrameRateOverride = supportsFrameRateOverride;
+ reset();
+ }
+
+ void applyVotes(SparseArray<Vote> votes,
+ int lowestConsideredPriority, int highestConsideredPriority) {
+ reset();
+ for (int priority = highestConsideredPriority;
+ priority >= lowestConsideredPriority;
+ priority--) {
+ Vote vote = votes.get(priority);
+ if (vote == null) {
+ continue;
+ }
+ vote.updateSummary(this);
+ }
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "applyVotes for range ["
+ + Vote.priorityToString(lowestConsideredPriority) + ", "
+ + Vote.priorityToString(highestConsideredPriority) + "]: "
+ + this);
+ }
+ }
+
+ void adjustSize(Display.Mode defaultMode, Display.Mode[] modes) {
+ // If we don't have anything specifying the width / height of the display, just use
+ // the default width and height. We don't want these switching out from underneath
+ // us since it's a pretty disruptive behavior.
+ if (height == Vote.INVALID_SIZE || width == Vote.INVALID_SIZE) {
+ width = defaultMode.getPhysicalWidth();
+ height = defaultMode.getPhysicalHeight();
+ } else if (mIsDisplayResolutionRangeVotingEnabled) {
+ updateSummaryWithBestAllowedResolution(modes);
+ }
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "adjustSize: " + this);
+ }
+ }
+
+ void limitRefreshRanges(VoteSummary otherSummary) {
+ minPhysicalRefreshRate =
+ Math.min(minPhysicalRefreshRate, otherSummary.minPhysicalRefreshRate);
+ maxPhysicalRefreshRate =
+ Math.max(maxPhysicalRefreshRate, otherSummary.maxPhysicalRefreshRate);
+ minRenderFrameRate = Math.min(minRenderFrameRate, otherSummary.minRenderFrameRate);
+ maxRenderFrameRate = Math.max(maxRenderFrameRate, otherSummary.maxRenderFrameRate);
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "limitRefreshRanges: " + this);
+ }
+ }
+
+ List<Display.Mode> filterModes(Display.Mode[] modes) {
+ if (!isValid()) {
+ return new ArrayList<>();
+ }
+ ArrayList<Display.Mode> availableModes = new ArrayList<>();
+ boolean missingBaseModeRefreshRate = appRequestBaseModeRefreshRate > 0f;
+
+ for (Display.Mode mode : modes) {
+ if (!validateModeSupported(mode)) {
+ continue;
+ }
+ if (!validateModeSize(mode)) {
+ continue;
+ }
+ if (!validateModeWithinPhysicalRefreshRange(mode)) {
+ continue;
+ }
+ if (!validateModeWithinRenderRefreshRange(mode)) {
+ continue;
+ }
+ if (!validateModeRenderRateAchievable(mode)) {
+ continue;
+ }
+ availableModes.add(mode);
+ if (equalsWithinFloatTolerance(mode.getRefreshRate(), appRequestBaseModeRefreshRate)) {
+ missingBaseModeRefreshRate = false;
+ }
+ }
+ if (missingBaseModeRefreshRate) {
+ return new ArrayList<>();
+ }
+
+ return availableModes;
+ }
+
+ Display.Mode selectBaseMode(List<Display.Mode> availableModes, Display.Mode defaultMode) {
+ // The base mode should be as close as possible to the app requested mode. Since all the
+ // available modes already have the same size, we just need to look for a matching refresh
+ // rate. If the summary doesn't include an app requested refresh rate, we'll use the default
+ // mode refresh rate. This is important because SurfaceFlinger can do only seamless switches
+ // by default. Some devices (e.g. TV) don't support seamless switching so the mode we select
+ // here won't be changed.
+ float preferredRefreshRate =
+ appRequestBaseModeRefreshRate > 0
+ ? appRequestBaseModeRefreshRate : defaultMode.getRefreshRate();
+ for (Display.Mode availableMode : availableModes) {
+ if (equalsWithinFloatTolerance(preferredRefreshRate, availableMode.getRefreshRate())) {
+ return availableMode;
+ }
+ }
+
+ // If we couldn't find a mode id based on the refresh rate, it means that the available
+ // modes were filtered by the app requested size, which is different that the default mode
+ // size, and the requested app refresh rate was dropped from the summary due to a higher
+ // priority vote. Since we don't have any other hint about the refresh rate,
+ // we just pick the first.
+ return !availableModes.isEmpty() ? availableModes.get(0) : null;
+ }
+
+ void disableModeSwitching(float fps) {
+ minPhysicalRefreshRate = maxPhysicalRefreshRate = fps;
+ maxRenderFrameRate = Math.min(maxRenderFrameRate, fps);
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Disabled mode switching on summary: " + this);
+ }
+ }
+
+ void disableRenderRateSwitching(float fps) {
+ minRenderFrameRate = maxRenderFrameRate;
+
+ if (!isRenderRateAchievable(fps)) {
+ minRenderFrameRate = maxRenderFrameRate = fps;
+ }
+
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Disabled render rate switching on summary: " + this);
+ }
+ }
+ private boolean validateModeSize(Display.Mode mode) {
+ if (mode.getPhysicalWidth() != width
+ || mode.getPhysicalHeight() != height) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId() + ", wrong size"
+ + ": desiredWidth=" + width
+ + ": desiredHeight=" + height
+ + ": actualWidth=" + mode.getPhysicalWidth()
+ + ": actualHeight=" + mode.getPhysicalHeight());
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeWithinPhysicalRefreshRange(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ // Some refresh rates are calculated based on frame timings, so they aren't *exactly*
+ // equal to expected refresh rate. Given that, we apply a bit of tolerance to this
+ // comparison.
+ if (refreshRate < (minPhysicalRefreshRate - FLOAT_TOLERANCE)
+ || refreshRate > (maxPhysicalRefreshRate + FLOAT_TOLERANCE)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside refresh rate bounds"
+ + ": minPhysicalRefreshRate=" + minPhysicalRefreshRate
+ + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
+ + ", modeRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeWithinRenderRefreshRange(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ // The physical refresh rate must be in the render frame rate range, unless
+ // frame rate override is supported.
+ if (!mSupportsFrameRateOverride) {
+ if (refreshRate < (minRenderFrameRate - FLOAT_TOLERANCE)
+ || refreshRate > (maxRenderFrameRate + FLOAT_TOLERANCE)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside render rate bounds"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", modeRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean validateModeRenderRateAchievable(Display.Mode mode) {
+ float refreshRate = mode.getRefreshRate();
+ if (!isRenderRateAchievable(refreshRate)) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", outside frame rate bounds"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", modePhysicalRefreshRate=" + refreshRate);
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private boolean validateModeSupported(Display.Mode mode) {
+ if (supportedModes == null || !mVsyncProximityVoteEnabled) {
+ return true;
+ }
+ for (SupportedModesVote.SupportedMode supportedMode : supportedModes) {
+ if (equalsWithinFloatTolerance(mode.getRefreshRate(), supportedMode.mPeakRefreshRate)
+ && equalsWithinFloatTolerance(mode.getVsyncRate(), supportedMode.mVsyncRate)) {
+ return true;
+ }
+ }
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Discarding mode " + mode.getModeId()
+ + ", supportedMode not found"
+ + ": mode.refreshRate=" + mode.getRefreshRate()
+ + ", mode.vsyncRate=" + mode.getVsyncRate()
+ + ", supportedModes=" + supportedModes);
+ }
+ return false;
+ }
+
+ private boolean isRenderRateAchievable(float physicalRefreshRate) {
+ // Check whether the render frame rate range is achievable by the mode's physical
+ // refresh rate, meaning that if a divisor of the physical refresh rate is in range
+ // of the render frame rate.
+ // For example for the render frame rate [50, 70]:
+ // - 120Hz is in range as we can render at 60hz by skipping every other frame,
+ // which is within the render rate range
+ // - 90hz is not in range as none of the even divisors (i.e. 90, 45, 30)
+ // fall within the acceptable render range.
+ final int divisor =
+ (int) Math.ceil((physicalRefreshRate / maxRenderFrameRate)
+ - FLOAT_TOLERANCE);
+ float adjustedPhysicalRefreshRate = physicalRefreshRate / divisor;
+ return adjustedPhysicalRefreshRate >= (minRenderFrameRate - FLOAT_TOLERANCE);
+ }
+
+ private boolean isValid() {
+ if (minRenderFrameRate > maxRenderFrameRate + FLOAT_TOLERANCE) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Vote summary resulted in empty set (invalid frame rate range)"
+ + ": minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate);
+ }
+ return false;
+ }
+
+ if (supportedModes != null && mVsyncProximityVoteEnabled && supportedModes.isEmpty()) {
+ if (mLoggingEnabled) {
+ Slog.w(TAG, "Vote summary resulted in empty set (empty supportedModes)");
+ }
+ return false;
+ }
+ return true;
+ }
+
+ private void updateSummaryWithBestAllowedResolution(final Display.Mode[] supportedModes) {
+ int maxAllowedWidth = width;
+ int maxAllowedHeight = height;
+ width = Vote.INVALID_SIZE;
+ height = Vote.INVALID_SIZE;
+ int maxNumberOfPixels = 0;
+ for (Display.Mode mode : supportedModes) {
+ if (mode.getPhysicalWidth() > maxAllowedWidth
+ || mode.getPhysicalHeight() > maxAllowedHeight
+ || mode.getPhysicalWidth() < minWidth
+ || mode.getPhysicalHeight() < minHeight
+ || mode.getRefreshRate() < (minPhysicalRefreshRate - FLOAT_TOLERANCE)
+ || mode.getRefreshRate() > (maxPhysicalRefreshRate + FLOAT_TOLERANCE)
+ ) {
+ continue;
+ }
+
+ int numberOfPixels = mode.getPhysicalHeight() * mode.getPhysicalWidth();
+ if (numberOfPixels > maxNumberOfPixels || (mode.getPhysicalWidth() == maxAllowedWidth
+ && mode.getPhysicalHeight() == maxAllowedHeight)) {
+ maxNumberOfPixels = numberOfPixels;
+ width = mode.getPhysicalWidth();
+ height = mode.getPhysicalHeight();
+ }
+ }
+ }
+
+ private void reset() {
+ minPhysicalRefreshRate = 0f;
+ maxPhysicalRefreshRate = Float.POSITIVE_INFINITY;
+ minRenderFrameRate = 0f;
+ maxRenderFrameRate = Float.POSITIVE_INFINITY;
+ width = Vote.INVALID_SIZE;
+ height = Vote.INVALID_SIZE;
+ minWidth = 0;
+ minHeight = 0;
+ disableRefreshRateSwitching = false;
+ appRequestBaseModeRefreshRate = 0f;
+ supportedModes = null;
+ if (mLoggingEnabled) {
+ Slog.i(TAG, "Summary reset: " + this);
+ }
+ }
+
+ private static boolean equalsWithinFloatTolerance(float a, float b) {
+ return a >= b - FLOAT_TOLERANCE && a <= b + FLOAT_TOLERANCE;
+ }
+
+ @Override
+ public String toString() {
+ return "VoteSummary{ minPhysicalRefreshRate=" + minPhysicalRefreshRate
+ + ", maxPhysicalRefreshRate=" + maxPhysicalRefreshRate
+ + ", minRenderFrameRate=" + minRenderFrameRate
+ + ", maxRenderFrameRate=" + maxRenderFrameRate
+ + ", width=" + width
+ + ", height=" + height
+ + ", minWidth=" + minWidth
+ + ", minHeight=" + minHeight
+ + ", disableRefreshRateSwitching=" + disableRefreshRateSwitching
+ + ", appRequestBaseModeRefreshRate=" + appRequestBaseModeRefreshRate
+ + ", supportedModes=" + supportedModes
+ + ", mIsDisplayResolutionRangeVotingEnabled="
+ + mIsDisplayResolutionRangeVotingEnabled
+ + ", mVsyncProximityVoteEnabled=" + mVsyncProximityVoteEnabled
+ + ", mSupportsFrameRateOverride=" + mSupportsFrameRateOverride + " }";
+ }
+}
diff --git a/services/core/java/com/android/server/hdmi/NewDeviceAction.java b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
index 6147c10..f3532e5 100644
--- a/services/core/java/com/android/server/hdmi/NewDeviceAction.java
+++ b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
@@ -182,7 +182,7 @@
.setVendorId(mVendorId)
.setDisplayName(mDisplayName)
.build();
- localDevice().mService.getHdmiCecNetwork().addCecDevice(deviceInfo);
+ localDevice().mService.getHdmiCecNetwork().updateCecDevice(deviceInfo);
// Consume CEC messages we already got for this newly found device.
tv().processDelayedMessages(mDeviceLogicalAddress);
diff --git a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
index 2dd2a16..ebc784d 100644
--- a/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
+++ b/services/core/java/com/android/server/input/KeyboardMetricsCollector.java
@@ -369,15 +369,15 @@
if (inputDevice == null || inputDevice.isVirtual() || !inputDevice.isFullKeyboard()) {
return;
}
- int vendorId = inputDevice.getVendorId();
- int productId = inputDevice.getProductId();
if (keyboardSystemEvent == null) {
Slog.w(TAG, "Invalid keyboard event logging, keycode = " + Arrays.toString(keyCodes)
+ ", modifier state = " + modifierState);
return;
}
FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED,
- vendorId, productId, keyboardSystemEvent.getIntValue(), keyCodes, modifierState);
+ inputDevice.getVendorId(), inputDevice.getProductId(),
+ keyboardSystemEvent.getIntValue(), keyCodes, modifierState,
+ inputDevice.getDeviceBus());
if (DEBUG) {
Slog.d(TAG, "Logging Keyboard system event: " + keyboardSystemEvent.mName);
@@ -402,7 +402,7 @@
// Push the atom to Statsd
FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_CONFIGURED,
event.isFirstConfiguration(), event.getVendorId(), event.getProductId(),
- proto.getBytes());
+ proto.getBytes(), event.getDeviceBus());
if (DEBUG) {
Slog.d(TAG, "Logging Keyboard configuration event: " + event);
@@ -467,6 +467,10 @@
return mInputDevice.getProductId();
}
+ public int getDeviceBus() {
+ return mInputDevice.getDeviceBus();
+ }
+
public boolean isFirstConfiguration() {
return mIsFirstConfiguration;
}
@@ -479,6 +483,7 @@
public String toString() {
return "InputDevice = {VendorId = " + Integer.toHexString(getVendorId())
+ ", ProductId = " + Integer.toHexString(getProductId())
+ + ", Device Bus = " + Integer.toHexString(getDeviceBus())
+ "}, isFirstConfiguration = " + mIsFirstConfiguration
+ ", LayoutConfigurations = " + mLayoutConfigurations;
}
diff --git a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
index 749d6b0..dcb86a7 100644
--- a/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
+++ b/services/core/java/com/android/server/inputmethod/HandwritingModeController.java
@@ -22,6 +22,8 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.UiThread;
+import android.content.ComponentName;
+import android.content.pm.PackageManagerInternal;
import android.hardware.input.InputManagerGlobal;
import android.os.Handler;
import android.os.IBinder;
@@ -66,6 +68,7 @@
private final Looper mLooper;
private final InputManagerInternal mInputManagerInternal;
private final WindowManagerInternal mWindowManagerInternal;
+ private final PackageManagerInternal mPackageManagerInternal;
private ArrayList<MotionEvent> mHandwritingBuffer;
private InputEventReceiver mHandwritingEventReceiver;
@@ -75,6 +78,7 @@
// when set, package names are used for handwriting delegation.
private @Nullable String mDelegatePackageName;
private @Nullable String mDelegatorPackageName;
+ private boolean mDelegatorFromDefaultHomePackage;
private Runnable mDelegationIdleTimeoutRunnable;
private Handler mDelegationIdleTimeoutHandler;
@@ -88,6 +92,7 @@
mCurrentDisplayId = Display.INVALID_DISPLAY;
mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mCurrentRequestId = 0;
mInkWindowInitRunnable = inkWindowInitRunnable;
}
@@ -151,9 +156,20 @@
* @see InputMethodManager#prepareStylusHandwritingDelegation(View, String)
*/
void prepareStylusHandwritingDelegation(
- @NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
+ int userId, @NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
mDelegatePackageName = delegatePackageName;
mDelegatorPackageName = delegatorPackageName;
+ mDelegatorFromDefaultHomePackage = false;
+ // mDelegatorFromDefaultHomeActivity is only used in the cross-package delegation case.
+ // For same-package delegation, it doesn't need to be checked.
+ if (!delegatorPackageName.equals(delegatePackageName)) {
+ ComponentName defaultHomeActivity =
+ mPackageManagerInternal.getDefaultHomeActivity(userId);
+ if (defaultHomeActivity != null) {
+ mDelegatorFromDefaultHomePackage =
+ delegatorPackageName.equals(defaultHomeActivity.getPackageName());
+ }
+ }
if (mHandwritingBuffer == null) {
mHandwritingBuffer = new ArrayList<>(getHandwritingBufferSize());
} else {
@@ -170,6 +186,10 @@
return mDelegatorPackageName;
}
+ boolean isDelegatorFromDefaultHomePackage() {
+ return mDelegatorFromDefaultHomePackage;
+ }
+
private void scheduleHandwritingDelegationTimeout() {
if (mDelegationIdleTimeoutHandler == null) {
mDelegationIdleTimeoutHandler = new Handler(mLooper);
@@ -210,6 +230,7 @@
mDelegationIdleTimeoutRunnable = null;
mDelegatorPackageName = null;
mDelegatePackageName = null;
+ mDelegatorFromDefaultHomePackage = false;
}
/**
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index ddb32fe..a0bc7c2 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2085,7 +2085,7 @@
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
- methodList, directBootAwareness, mSettings.getEnabledInputMethodNames());
+ methodList, directBootAwareness);
settings = new InputMethodSettings(mContext, methodMap, userId, true /* copyOnWrite */);
}
// filter caller's access to input methods
@@ -2713,10 +2713,10 @@
}
@AnyThread
- void schedulePrepareStylusHandwritingDelegation(
+ void schedulePrepareStylusHandwritingDelegation(@UserIdInt int userId,
@NonNull String delegatePackageName, @NonNull String delegatorPackageName) {
mHandler.obtainMessage(
- MSG_PREPARE_HANDWRITING_DELEGATION,
+ MSG_PREPARE_HANDWRITING_DELEGATION, userId, 0 /* unused */,
new Pair<>(delegatePackageName, delegatorPackageName)).sendToTarget();
}
@@ -3433,7 +3433,8 @@
Slog.w(TAG, "prepareStylusHandwritingDelegation() fail");
throw new IllegalArgumentException("Delegator doesn't match Uid");
}
- schedulePrepareStylusHandwritingDelegation(delegatePackageName, delegatorPackageName);
+ schedulePrepareStylusHandwritingDelegation(
+ userId, delegatePackageName, delegatorPackageName);
}
@Override
@@ -3441,13 +3442,14 @@
@NonNull IInputMethodClient client,
@UserIdInt int userId,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
if (!isStylusHandwritingEnabled(mContext, userId)) {
Slog.w(TAG, "Can not accept stylus handwriting delegation. Stylus handwriting"
+ " pref is disabled for user: " + userId);
return false;
}
- if (!verifyDelegator(client, delegatePackageName, delegatorPackageName)) {
+ if (!verifyDelegator(client, delegatePackageName, delegatorPackageName, flags)) {
return false;
}
@@ -3471,14 +3473,20 @@
private boolean verifyDelegator(
@NonNull IInputMethodClient client,
@NonNull String delegatePackageName,
- @NonNull String delegatorPackageName) {
+ @NonNull String delegatorPackageName,
+ @InputMethodManager.HandwritingDelegateFlags int flags) {
if (!verifyClientAndPackageMatch(client, delegatePackageName)) {
Slog.w(TAG, "Delegate package does not belong to the same user. Ignoring"
+ " startStylusHandwriting");
return false;
}
synchronized (ImfLock.class) {
- if (!delegatorPackageName.equals(mHwController.getDelegatorPackageName())) {
+ boolean homeDelegatorAllowed =
+ (flags & InputMethodManager.HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED)
+ != 0;
+ if (!delegatorPackageName.equals(mHwController.getDelegatorPackageName())
+ && !(homeDelegatorAllowed
+ && mHwController.isDelegatorFromDefaultHomePackage())) {
Slog.w(TAG,
"Delegator package does not match. Ignoring startStylusHandwriting");
return false;
@@ -4200,7 +4208,7 @@
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
- methodList, DirectBootAwareness.AUTO, mSettings.getEnabledInputMethodNames());
+ methodList, DirectBootAwareness.AUTO);
final InputMethodSettings settings = new InputMethodSettings(mContext, methodMap,
userId, false);
settings.setAdditionalInputMethodSubtypes(imiId, toBeAdded, additionalSubtypeMap,
@@ -4924,9 +4932,10 @@
}
case MSG_PREPARE_HANDWRITING_DELEGATION:
synchronized (ImfLock.class) {
+ int userId = msg.arg1;
String delegate = (String) ((Pair) msg.obj).first;
String delegator = (String) ((Pair) msg.obj).second;
- mHwController.prepareStylusHandwritingDelegation(delegate, delegator);
+ mHwController.prepareStylusHandwritingDelegation(userId, delegate, delegator);
}
return true;
case MSG_START_HANDWRITING:
@@ -5025,7 +5034,7 @@
static void queryInputMethodServicesInternal(Context context,
@UserIdInt int userId, ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap,
ArrayMap<String, InputMethodInfo> methodMap, ArrayList<InputMethodInfo> methodList,
- @DirectBootAwareness int directBootAwareness, List<String> enabledInputMethodList) {
+ @DirectBootAwareness int directBootAwareness) {
final Context userAwareContext = context.getUserId() == userId
? context
: context.createContextAsUser(UserHandle.of(userId), 0 /* flags */);
@@ -5058,6 +5067,11 @@
methodList.ensureCapacity(services.size());
methodMap.ensureCapacity(services.size());
+ // Note: This is a temporary solution for Bug 261723412. If there is any better solution,
+ // we should remove this data dependency.
+ final List<String> enabledInputMethodList =
+ InputMethodUtils.getEnabledInputMethodIdsForFiltering(context, userId);
+
filterInputMethodServices(additionalSubtypeMap, methodMap, methodList,
enabledInputMethodList, userAwareContext, services);
}
@@ -5124,8 +5138,7 @@
mMyPackageMonitor.clearKnownImePackageNamesLocked();
queryInputMethodServicesInternal(mContext, mSettings.getCurrentUserId(),
- mAdditionalSubtypeMap, mMethodMap, mMethodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ mAdditionalSubtypeMap, mMethodMap, mMethodList, DirectBootAwareness.AUTO);
// Construct the set of possible IME packages for onPackageChanged() to avoid false
// negatives when the package state remains to be the same but only the component state is
@@ -5438,47 +5451,21 @@
*/
@GuardedBy("ImfLock.class")
private InputMethodInfo queryDefaultInputMethodForUserIdLocked(@UserIdInt int userId) {
- final String imeId = mSettings.getSelectedInputMethodForUser(userId);
- if (TextUtils.isEmpty(imeId)) {
- Slog.e(TAG, "No default input method found for userId " + userId);
- return null;
+ if (userId == mSettings.getCurrentUserId()) {
+ return mMethodMap.get(mSettings.getSelectedInputMethod());
}
- InputMethodInfo curInputMethodInfo;
- if (userId == mSettings.getCurrentUserId()
- && (curInputMethodInfo = mMethodMap.get(imeId)) != null) {
- // clone the InputMethodInfo before returning.
- return new InputMethodInfo(curInputMethodInfo);
- }
-
+ final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
+ final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
final ArrayMap<String, List<InputMethodSubtype>> additionalSubtypeMap = new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
- Context userAwareContext =
- mContext.createContextAsUser(UserHandle.of(userId), 0 /* flags */);
-
- final int flags = PackageManager.GET_META_DATA
- | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
- | PackageManager.MATCH_DIRECT_BOOT_AUTO;
- final List<ResolveInfo> services =
- userAwareContext.getPackageManager().queryIntentServicesAsUser(
- new Intent(InputMethod.SERVICE_INTERFACE),
- PackageManager.ResolveInfoFlags.of(flags),
- userId);
- for (ResolveInfo ri : services) {
- final String imeIdResolved = InputMethodInfo.computeId(ri);
- if (imeId.equals(imeIdResolved)) {
- try {
- return new InputMethodInfo(
- userAwareContext, ri, additionalSubtypeMap.get(imeId));
- } catch (Exception e) {
- Slog.wtf(TAG, "Unable to load input method " + imeId, e);
- }
- }
- }
- // we didn't find the InputMethodInfo for imeId. This shouldn't happen.
- Slog.e(TAG, "Error while locating input method info for imeId: " + imeId);
- return null;
+ queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap, methodMap,
+ methodList, DirectBootAwareness.AUTO);
+ InputMethodSettings settings = new InputMethodSettings(mContext, methodMap, userId,
+ true /* copyOnWrite */);
+ return methodMap.get(settings.getSelectedInputMethod());
}
+
private ArrayMap<String, InputMethodInfo> queryMethodMapForUser(@UserIdInt int userId) {
final ArrayMap<String, InputMethodInfo> methodMap = new ArrayMap<>();
final ArrayList<InputMethodInfo> methodList = new ArrayList<>();
@@ -5486,8 +5473,7 @@
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
- methodMap, methodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ methodMap, methodList, DirectBootAwareness.AUTO);
return methodMap;
}
@@ -6511,8 +6497,7 @@
new ArrayMap<>();
AdditionalSubtypeUtils.load(additionalSubtypeMap, userId);
queryInputMethodServicesInternal(mContext, userId, additionalSubtypeMap,
- methodMap, methodList, DirectBootAwareness.AUTO,
- mSettings.getEnabledInputMethodNames());
+ methodMap, methodList, DirectBootAwareness.AUTO);
final InputMethodSettings settings = new InputMethodSettings(mContext,
methodMap, userId, false);
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
index c97d8e2..984ae1f 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodUtils.java
@@ -330,17 +330,11 @@
@Nullable
private String getString(@NonNull String key, @Nullable String defaultValue) {
- return getStringForUser(key, defaultValue, mCurrentUserId);
- }
-
- @Nullable
- private String getStringForUser(
- @NonNull String key, @Nullable String defaultValue, @UserIdInt int userId) {
final String result;
if (mCopyOnWrite && mCopyOnWriteDataStore.containsKey(key)) {
result = mCopyOnWriteDataStore.get(key);
} else {
- result = Settings.Secure.getStringForUser(mResolver, key, userId);
+ result = Settings.Secure.getStringForUser(mResolver, key, mCurrentUserId);
}
return result != null ? result : defaultValue;
}
@@ -756,16 +750,6 @@
return imi;
}
- @Nullable
- String getSelectedInputMethodForUser(@UserIdInt int userId) {
- final String imi =
- getStringForUser(Settings.Secure.DEFAULT_INPUT_METHOD, null, userId);
- if (DEBUG) {
- Slog.d(TAG, "getSelectedInputMethodForUserStr: " + imi);
- }
- return imi;
- }
-
void putDefaultVoiceInputMethod(String imeId) {
if (DEBUG) {
Slog.d(TAG, "putDefaultVoiceInputMethodStr: " + imeId + ", " + mCurrentUserId);
@@ -1029,6 +1013,44 @@
}
/**
+ * Returns a list of enabled IME IDs to address Bug 261723412.
+ *
+ * <p>This is a temporary workaround until we come up with a better solution. Do not use this
+ * for anything other than Bug 261723412.</p>
+ *
+ * @param context {@link Context} object to query secure settings.
+ * @param userId User ID to query about.
+ * @return A list of enabled IME IDs.
+ */
+ @NonNull
+ static List<String> getEnabledInputMethodIdsForFiltering(@NonNull Context context,
+ @UserIdInt int userId) {
+ final String enabledInputMethodsStr = TextUtils.nullIfEmpty(
+ Settings.Secure.getStringForUser(
+ context.getContentResolver(),
+ Settings.Secure.ENABLED_INPUT_METHODS,
+ userId));
+ if (enabledInputMethodsStr == null) {
+ return List.of();
+ }
+ final TextUtils.SimpleStringSplitter inputMethodSplitter =
+ new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATOR);
+ final TextUtils.SimpleStringSplitter subtypeSplitter =
+ new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATOR);
+ inputMethodSplitter.setString(enabledInputMethodsStr);
+ final ArrayList<String> result = new ArrayList<>();
+ while (inputMethodSplitter.hasNext()) {
+ String nextImsStr = inputMethodSplitter.next();
+ subtypeSplitter.setString(nextImsStr);
+ if (subtypeSplitter.hasNext()) {
+ // The first element is ime id.
+ result.add(subtypeSplitter.next());
+ }
+ }
+ return result;
+ }
+
+ /**
* Convert the input method ID to a component name
*
* @param id A unique ID for this input method.
diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
index 35c6120..d359280 100644
--- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
+++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java
@@ -467,8 +467,7 @@
}
public byte[] getUuid() throws RemoteException {
- //TODO(b/247124878): return the UUID defined in this file when the API is put in use
- throw new RemoteException("This API is not implemented yet.");
+ return UUID;
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 57e424d..49095ce 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -246,7 +246,7 @@
private static final String MIGRATED_SP_FULL = "migrated_all_users_to_sp_and_bound_keys";
private static final boolean FIX_UNLOCKED_DEVICE_REQUIRED_KEYS =
- android.security.Flags.fixUnlockedDeviceRequiredKeys();
+ android.security.Flags.fixUnlockedDeviceRequiredKeysV2();
// Duration that LockSettingsService will store the gatekeeper password for. This allows
// multiple biometric enrollments without prompting the user to enter their password via
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
index 4bac872..17f2fcc 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java
@@ -155,43 +155,45 @@
try (final PrintWriter pw = getOutPrintWriter();) {
pw.println("lockSettings service commands:");
pw.println("");
- pw.println("NOTE: when lock screen is set, all commands require the --old <CREDENTIAL>"
- + " argument.");
+ pw.println("NOTE: when a secure lock screen is set, most commands require the");
+ pw.println("--old <CREDENTIAL> option.");
pw.println("");
pw.println(" help");
pw.println(" Prints this help text.");
pw.println("");
- pw.println(" get-disabled [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Checks whether lock screen is disabled.");
+ pw.println(" get-disabled [--user USER_ID]");
+ pw.println(" Prints true if the lock screen is completely disabled, i.e. set to None.");
+ pw.println(" Otherwise prints false.");
pw.println("");
- pw.println(" set-disabled [--old <CREDENTIAL>] [--user USER_ID] <true|false>");
- pw.println(" When true, disables lock screen.");
+ pw.println(" set-disabled [--user USER_ID] <true|false>");
+ pw.println(" Sets whether the lock screen is disabled. If the lock screen is secure, this");
+ pw.println(" has no immediate effect. I.e. this can only change between Swipe and None.");
pw.println("");
pw.println(" set-pattern [--old <CREDENTIAL>] [--user USER_ID] <PATTERN>");
- pw.println(" Sets the lock screen as pattern, using the given PATTERN to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PATTERN. PATTERN is a series");
+ pw.println(" of digits 1-9 that identify the cells of the pattern.");
pw.println("");
pw.println(" set-pin [--old <CREDENTIAL>] [--user USER_ID] <PIN>");
- pw.println(" Sets the lock screen as PIN, using the given PIN to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PIN.");
pw.println("");
pw.println(" set-password [--old <CREDENTIAL>] [--user USER_ID] <PASSWORD>");
- pw.println(" Sets the lock screen as password, using the given PASSWORD to unlock.");
+ pw.println(" Sets a secure lock screen that uses the given PASSWORD.");
pw.println("");
pw.println(" clear [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Clears the lock credentials.");
+ pw.println(" Clears the lock credential.");
pw.println("");
pw.println(" verify [--old <CREDENTIAL>] [--user USER_ID]");
- pw.println(" Verifies the lock credentials.");
+ pw.println(" Verifies the lock credential.");
pw.println("");
pw.println(" remove-cache [--user USER_ID]");
pw.println(" Removes cached unified challenge for the managed profile.");
pw.println("");
pw.println(" set-resume-on-reboot-provider-package <package_name>");
- pw.println(" Sets the package name for server based resume on reboot service "
- + "provider.");
+ pw.println(" Sets the package name for server based resume on reboot service provider.");
pw.println("");
pw.println(" require-strong-auth [--user USER_ID] <reason>");
- pw.println(" Requires the strong authentication. The current supported reasons: "
- + "STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN.");
+ pw.println(" Requires strong authentication. The current supported reasons:");
+ pw.println(" STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN.");
pw.println("");
}
}
diff --git a/services/core/java/com/android/server/notification/ZenModeEventLogger.java b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
index 1641d4a..87158cd 100644
--- a/services/core/java/com/android/server/notification/ZenModeEventLogger.java
+++ b/services/core/java/com/android/server/notification/ZenModeEventLogger.java
@@ -23,6 +23,7 @@
import static android.service.notification.NotificationServiceProto.RULE_TYPE_UNKNOWN;
import android.annotation.NonNull;
+import android.app.Flags;
import android.app.NotificationManager;
import android.content.pm.PackageManager;
import android.os.Process;
@@ -502,6 +503,13 @@
ZenModeConfig.getZenPolicySenders(mNewPolicy.allowMessagesFrom()));
proto.write(DNDPolicyProto.ALLOW_CONVERSATIONS_FROM,
mNewPolicy.allowConversationsFrom());
+
+ if (Flags.modesApi()) {
+ proto.write(DNDPolicyProto.ALLOW_CHANNELS,
+ mNewPolicy.allowPriorityChannels()
+ ? ZenPolicy.CHANNEL_TYPE_PRIORITY
+ : ZenPolicy.CHANNEL_TYPE_NONE);
+ }
} else {
Log.wtf(TAG, "attempted to write zen mode log event with null policy");
}
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index 89d8200..d0ded63 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -1519,7 +1519,7 @@
final boolean muteEverything = zenSilence || (zenPriorityOnly
&& ZenModeConfig.areAllZenBehaviorSoundsMuted(mConsolidatedPolicy));
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.SDK_USAGES.toArray()) {
final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage);
if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NEVER) {
applyRestrictions(zenPriorityOnly, false /*mute*/, usage);
diff --git a/services/core/java/com/android/server/pdb/TEST_MAPPING b/services/core/java/com/android/server/pdb/TEST_MAPPING
new file mode 100644
index 0000000..e5f154a
--- /dev/null
+++ b/services/core/java/com/android/server/pdb/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "postsubmit": [
+ {
+ "name": " PersistentDataBlockServiceTest"
+ }
+ ]
+}
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index af6a002..b23ccb8 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -397,6 +397,9 @@
@Nullable Certificate[] trustedInstallers,
Map<Integer, ApkChecksum> checksums,
@NonNull Injector injector) {
+ if (!file.exists()) {
+ return;
+ }
final String filePath = file.getAbsolutePath();
// Always available: FSI or IncFs.
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 448f215..1a65297 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -690,6 +690,9 @@
pkgSetting.setInstallReason(installReason, userId);
pkgSetting.setUninstallReason(PackageManager.UNINSTALL_REASON_UNKNOWN, userId);
pkgSetting.setFirstInstallTime(System.currentTimeMillis(), userId);
+ // Clear any existing archive state.
+ pkgSetting.setArchiveTimeMillis(0, userId);
+ pkgSetting.setArchiveState(null, userId);
mPm.mSettings.writePackageRestrictionsLPr(userId);
mPm.mSettings.writeKernelMappingLPr(pkgSetting);
installed = true;
@@ -2263,6 +2266,9 @@
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, userId,
installerPackageName);
}
+ // Clear any existing archive state.
+ ps.setArchiveState(null, userId);
+ ps.setArchiveTimeMillis(0, userId);
} else if (allUsers != null) {
// The caller explicitly specified INSTALL_ALL_USERS flag.
// Thus, updating the settings to install the app for all users.
@@ -2285,6 +2291,9 @@
ps.setEnabled(COMPONENT_ENABLED_STATE_DEFAULT, currentUserId,
installerPackageName);
}
+ // Clear any existing archive state.
+ ps.setArchiveState(null, currentUserId);
+ ps.setArchiveTimeMillis(0, currentUserId);
} else {
ps.setInstalled(false, currentUserId);
}
@@ -2861,10 +2870,11 @@
? request.getRemovedInfo().mArgs : null;
if (args != null) {
if (!killApp) {
- // If we didn't kill the app, defer the deletion of code/resource files, since
- // they may still be in use by the running application. This mitigates problems
- // in cases where resources or code is loaded by a new Activity before
- // ApplicationInfo changes have propagated to all application threads.
+ // If we didn't kill the app, defer the deletion of code/resource files,
+ // since the old code/resource files may still be in use by the running
+ // application. This mitigates problems and cases where resources or
+ // code is loaded by a new Activity before ApplicationInfo changes have
+ // propagated to all application threads.
mPm.scheduleDeferredNoKillPostDelete(args);
} else {
mRemovePackageHelper.cleanUpResources(args.mCodeFile, args.mInstructionSets);
diff --git a/services/core/java/com/android/server/pm/PackageArchiver.java b/services/core/java/com/android/server/pm/PackageArchiver.java
index c6e8a64..e3bab3f 100644
--- a/services/core/java/com/android/server/pm/PackageArchiver.java
+++ b/services/core/java/com/android/server/pm/PackageArchiver.java
@@ -24,6 +24,8 @@
import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED;
import static android.content.pm.ArchivedActivityInfo.bytesFromBitmap;
import static android.content.pm.ArchivedActivityInfo.drawableToBitmap;
+import static android.content.pm.PackageInstaller.EXTRA_UNARCHIVE_STATUS;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_OK;
import static android.content.pm.PackageManager.DELETE_ARCHIVE;
import static android.content.pm.PackageManager.DELETE_KEEP_DATA;
import static android.content.pm.PackageManager.INSTALL_UNARCHIVE_DRAFT;
@@ -38,6 +40,7 @@
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
+import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.IIntentReceiver;
@@ -51,6 +54,7 @@
import android.content.pm.LauncherApps;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.DeleteFlags;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.pm.VersionedPackage;
@@ -116,7 +120,17 @@
private static final String ARCHIVE_ICONS_DIR = "package_archiver";
- private static final String ACTION_UNARCHIVE_DIALOG = "android.intent.action.UNARCHIVE_DIALOG";
+ private static final String ACTION_UNARCHIVE_DIALOG =
+ "com.android.intent.action.UNARCHIVE_DIALOG";
+ private static final String ACTION_UNARCHIVE_ERROR_DIALOG =
+ "com.android.intent.action.UNARCHIVE_ERROR_DIALOG";
+
+ private static final String EXTRA_REQUIRED_BYTES =
+ "com.android.content.pm.extra.UNARCHIVE_EXTRA_REQUIRED_BYTES";
+ private static final String EXTRA_INSTALLER_PACKAGE_NAME =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_PACKAGE_NAME";
+ private static final String EXTRA_INSTALLER_TITLE =
+ "com.android.content.pm.extra.UNARCHIVE_INSTALLER_TITLE";
private final Context mContext;
private final PackageManagerService mPm;
@@ -141,7 +155,8 @@
@NonNull String packageName,
@NonNull String callerPackageName,
@NonNull IntentSender intentSender,
- @NonNull UserHandle userHandle) {
+ @NonNull UserHandle userHandle,
+ @DeleteFlags int flags) {
Objects.requireNonNull(packageName);
Objects.requireNonNull(callerPackageName);
Objects.requireNonNull(intentSender);
@@ -182,7 +197,7 @@
new VersionedPackage(packageName,
PackageManager.VERSION_CODE_HIGHEST),
callerPackageName,
- DELETE_ARCHIVE | DELETE_KEEP_DATA,
+ DELETE_ARCHIVE | DELETE_KEEP_DATA | flags,
intentSender,
userId,
binderUid);
@@ -304,11 +319,14 @@
/** Creates archived state for the package and user. */
private CompletableFuture<ArchiveState> createArchiveState(String packageName, int userId)
throws PackageManager.NameNotFoundException {
- PackageStateInternal ps = getPackageState(packageName, mPm.snapshotComputer(),
+ Computer snapshot = mPm.snapshotComputer();
+ PackageStateInternal ps = getPackageState(packageName, snapshot,
Binder.getCallingUid(), userId);
verifyNotSystemApp(ps.getFlags());
String responsibleInstallerPackage = getResponsibleInstallerPackage(ps);
verifyInstaller(responsibleInstallerPackage, userId);
+ ApplicationInfo installerInfo = snapshot.getApplicationInfo(
+ responsibleInstallerPackage, /* flags= */ 0, userId);
verifyOptOutStatus(packageName,
UserHandle.getUid(userId, UserHandle.getUid(userId, ps.getAppId())));
@@ -319,7 +337,7 @@
try {
archiveState.complete(
createArchiveStateInternal(packageName, userId, mainActivities,
- responsibleInstallerPackage));
+ installerInfo.loadLabel(mContext.getPackageManager()).toString()));
} catch (IOException e) {
archiveState.completeExceptionally(e);
}
@@ -327,8 +345,17 @@
return archiveState;
}
- static ArchiveState createArchiveState(@NonNull ArchivedPackageParcel archivedPackage,
+ @Nullable
+ ArchiveState createArchiveState(@NonNull ArchivedPackageParcel archivedPackage,
int userId, String installerPackage) {
+ ApplicationInfo installerInfo = mPm.snapshotComputer().getApplicationInfo(
+ installerPackage, /* flags= */ 0, userId);
+ if (installerInfo == null) {
+ // Should never happen because we just fetched the installerInfo.
+ Slog.e(TAG, "Couldnt find installer " + installerPackage);
+ return null;
+ }
+
try {
var packageName = archivedPackage.packageName;
var mainActivities = archivedPackage.archivedActivities;
@@ -345,7 +372,8 @@
archiveActivityInfos.add(activityInfo);
}
- return new ArchiveState(archiveActivityInfos, installerPackage);
+ return new ArchiveState(archiveActivityInfos,
+ installerInfo.loadLabel(mContext.getPackageManager()).toString());
} catch (IOException e) {
Slog.e(TAG, "Failed to create archive state", e);
return null;
@@ -353,7 +381,7 @@
}
ArchiveState createArchiveStateInternal(String packageName, int userId,
- List<LauncherActivityInfo> mainActivities, String installerPackage)
+ List<LauncherActivityInfo> mainActivities, String installerTitle)
throws IOException {
final int iconSize = mContext.getSystemService(
ActivityManager.class).getLauncherLargeIconSize();
@@ -371,7 +399,7 @@
archiveActivityInfos.add(activityInfo);
}
- return new ArchiveState(archiveActivityInfos, installerPackage);
+ return new ArchiveState(archiveActivityInfos, installerTitle);
}
// TODO(b/298452477) Handle monochrome icons.
@@ -411,14 +439,14 @@
return iconFile.toPath();
}
- private void verifyInstaller(String installerPackage, int userId)
+ private void verifyInstaller(String installerPackageName, int userId)
throws PackageManager.NameNotFoundException {
- if (TextUtils.isEmpty(installerPackage)) {
+ if (TextUtils.isEmpty(installerPackageName)) {
throw new PackageManager.NameNotFoundException("No installer found");
}
// Allow shell for easier development.
if ((Binder.getCallingUid() != Process.SHELL_UID)
- && !verifySupportsUnarchival(installerPackage, userId)) {
+ && !verifySupportsUnarchival(installerPackageName, userId)) {
throw new PackageManager.NameNotFoundException("Installer does not support unarchival");
}
}
@@ -587,7 +615,7 @@
final Intent broadcastIntent = new Intent();
broadcastIntent.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName);
- broadcastIntent.putExtra(PackageInstaller.EXTRA_UNARCHIVE_STATUS,
+ broadcastIntent.putExtra(EXTRA_UNARCHIVE_STATUS,
PackageInstaller.STATUS_PENDING_USER_ACTION);
broadcastIntent.putExtra(Intent.EXTRA_INTENT, dialogIntent);
sendIntent(statusReceiver, packageName, /* message= */ "", broadcastIntent);
@@ -781,6 +809,83 @@
: ps.getInstallSource().mUpdateOwnerPackageName;
}
+ void notifyUnarchivalListener(int status, String installerPackageName, String appPackageName,
+ long requiredStorageBytes, @Nullable PendingIntent userActionIntent,
+ IntentSender unarchiveIntentSender, int userId) {
+ final Intent broadcastIntent = new Intent();
+ broadcastIntent.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, appPackageName);
+ broadcastIntent.putExtra(EXTRA_UNARCHIVE_STATUS, status);
+
+ if (status != UNARCHIVAL_OK) {
+ final Intent dialogIntent = createErrorDialogIntent(status, installerPackageName,
+ appPackageName,
+ requiredStorageBytes, userActionIntent, userId);
+ if (dialogIntent == null) {
+ // Error already logged.
+ return;
+ }
+ broadcastIntent.putExtra(Intent.EXTRA_INTENT, dialogIntent);
+ }
+
+ final BroadcastOptions options = BroadcastOptions.makeBasic();
+ options.setPendingIntentBackgroundActivityStartMode(
+ MODE_BACKGROUND_ACTIVITY_START_DENIED);
+ try {
+ unarchiveIntentSender.sendIntent(mContext, 0, broadcastIntent, /* onFinished= */ null,
+ /* handler= */ null, /* requiredPermission= */ null,
+ options.toBundle());
+ } catch (IntentSender.SendIntentException e) {
+ Slog.e(TAG, TextUtils.formatSimple("Failed to send unarchive intent"), e);
+ }
+ }
+
+ @Nullable
+ private Intent createErrorDialogIntent(int status, String installerPackageName,
+ String appPackageName,
+ long requiredStorageBytes, PendingIntent userActionIntent, int userId) {
+ final Intent dialogIntent = new Intent(ACTION_UNARCHIVE_ERROR_DIALOG);
+ dialogIntent.putExtra(EXTRA_UNARCHIVE_STATUS, status);
+ if (requiredStorageBytes > 0) {
+ dialogIntent.putExtra(EXTRA_REQUIRED_BYTES, requiredStorageBytes);
+ }
+ // Note that the userActionIntent is provided by the installer and is used only by the
+ // system package installer as a follow-up action after the user confirms the dialog.
+ if (userActionIntent != null) {
+ dialogIntent.putExtra(Intent.EXTRA_INTENT, userActionIntent);
+ }
+ dialogIntent.putExtra(EXTRA_INSTALLER_PACKAGE_NAME, installerPackageName);
+ // We fetch this label from the archive state because the installer might not be installed
+ // anymore in an edge case.
+ String installerTitle = getInstallerTitle(appPackageName, userId);
+ if (installerTitle == null) {
+ // Error already logged.
+ return null;
+ }
+ dialogIntent.putExtra(EXTRA_INSTALLER_TITLE, installerTitle);
+ return dialogIntent;
+ }
+
+ private String getInstallerTitle(String appPackageName, int userId) {
+ PackageStateInternal packageState;
+ try {
+ packageState = getPackageState(appPackageName,
+ mPm.snapshotComputer(),
+ Process.SYSTEM_UID, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ Slog.e(TAG, TextUtils.formatSimple(
+ "notifyUnarchivalListener: Couldn't fetch package state for %s.",
+ appPackageName), e);
+ return null;
+ }
+ ArchiveState archiveState = packageState.getUserStateOrDefault(userId).getArchiveState();
+ if (archiveState == null) {
+ Slog.e(TAG, TextUtils.formatSimple("notifyUnarchivalListener: App not archived %s.",
+ appPackageName));
+ return null;
+ }
+ return archiveState.getInstallerTitle();
+ }
+
@NonNull
private static PackageStateInternal getPackageState(String packageName,
Computer snapshot, int callingUid, int userId)
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 882e05d..7d6dd62 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -16,9 +16,10 @@
package com.android.server.pm;
-import static android.app.ComponentOptions.MODE_BACKGROUND_ACTIVITY_START_DENIED;
import static android.app.admin.DevicePolicyResources.Strings.Core.PACKAGE_DELETED_BY_DO;
import static android.content.pm.PackageInstaller.LOCATION_DATA_APP;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_DISABLED;
+import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_NO_CONNECTIVITY;
import static android.content.pm.PackageInstaller.UNARCHIVAL_ERROR_USER_ACTION_NEEDED;
@@ -66,6 +67,7 @@
import android.content.pm.PackageInstaller.UnarchivalStatus;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.DeleteFlags;
import android.content.pm.ParceledListSlice;
import android.content.pm.VersionedPackage;
import android.content.pm.parsing.FrameworkParsingPackageUtils;
@@ -1389,11 +1391,14 @@
final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext,
statusReceiver, versionedPackage.getPackageName(),
canSilentlyInstallPackage, userId);
- if (mContext.checkCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES)
+ final boolean shouldShowConfirmationDialog =
+ (flags & PackageManager.DELETE_SHOW_DIALOG) != 0;
+ if (!shouldShowConfirmationDialog
+ && mContext.checkCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES)
== PackageManager.PERMISSION_GRANTED) {
// Sweet, call straight through!
mPm.deletePackageVersioned(versionedPackage, adapter.getBinder(), userId, flags);
- } else if (canSilentlyInstallPackage) {
+ } else if (!shouldShowConfirmationDialog && canSilentlyInstallPackage) {
// Allow the device owner and affiliated profile owner to silently delete packages
// Need to clear the calling identity to get DELETE_PACKAGES permission
final long ident = Binder.clearCallingIdentity();
@@ -1418,6 +1423,11 @@
intent.setData(Uri.fromParts("package", versionedPackage.getPackageName(), null));
intent.putExtra(PackageInstaller.EXTRA_CALLBACK,
new PackageManager.UninstallCompleteCallback(adapter.getBinder().asBinder()));
+ if ((flags & PackageManager.DELETE_ARCHIVE) != 0) {
+ // Delete flags are passed to the uninstaller activity so it can be preserved
+ // in the follow-up uninstall operation after the user confirmation
+ intent.putExtra(PackageInstaller.EXTRA_DELETE_FLAGS, flags);
+ }
adapter.onUserActionRequired(intent);
}
}
@@ -1630,9 +1640,10 @@
@NonNull String packageName,
@NonNull String callerPackageName,
@NonNull IntentSender intentSender,
- @NonNull UserHandle userHandle) {
+ @NonNull UserHandle userHandle,
+ @DeleteFlags int flags) {
mPackageArchiver.requestArchive(packageName, callerPackageName, intentSender,
- userHandle);
+ userHandle, flags);
}
@Override
@@ -1703,7 +1714,6 @@
});
}
- // TODO(b/307299702) Implement error dialog and propagate userActionIntent.
@Override
public void reportUnarchivalStatus(
int unarchiveId,
@@ -1746,8 +1756,10 @@
// Execute expensive calls outside the sync block.
mPm.mHandler.post(
- () -> notifyUnarchivalListener(status, session.params.appPackageName,
- unarchiveIntentSender));
+ () -> mPackageArchiver.notifyUnarchivalListener(status,
+ session.getInstallerPackageName(),
+ session.params.appPackageName, requiredStorageBytes, userActionIntent,
+ unarchiveIntentSender, userId));
session.params.unarchiveIntentSender = null;
if (status != UNARCHIVAL_OK) {
Binder.withCleanCallingIdentity(session::abandon);
@@ -1776,29 +1788,13 @@
UNARCHIVAL_ERROR_USER_ACTION_NEEDED,
UNARCHIVAL_ERROR_INSUFFICIENT_STORAGE,
UNARCHIVAL_ERROR_NO_CONNECTIVITY,
+ UNARCHIVAL_ERROR_INSTALLER_DISABLED,
+ UNARCHIVAL_ERROR_INSTALLER_UNINSTALLED,
UNARCHIVAL_GENERIC_ERROR).contains(status)) {
throw new IllegalStateException("Invalid status code passed " + status);
}
}
- private void notifyUnarchivalListener(int status, String packageName,
- IntentSender unarchiveIntentSender) {
- final Intent fillIn = new Intent();
- fillIn.putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName);
- fillIn.putExtra(PackageInstaller.EXTRA_UNARCHIVE_STATUS, status);
- // TODO(b/307299702) Attach failure dialog with EXTRA_INTENT and requiredStorageBytes here.
- final BroadcastOptions options = BroadcastOptions.makeBasic();
- options.setPendingIntentBackgroundActivityStartMode(
- MODE_BACKGROUND_ACTIVITY_START_DENIED);
- try {
- unarchiveIntentSender.sendIntent(mContext, 0, fillIn, /* onFinished= */ null,
- /* handler= */ null, /* requiredPermission= */ null,
- options.toBundle());
- } catch (SendIntentException e) {
- Slog.e(TAG, TextUtils.formatSimple("Failed to send unarchive intent"), e);
- }
- }
-
private static int getSessionCount(SparseArray<PackageInstallerSession> sessions,
int installerUid) {
int count = 0;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 233bf4f..5daada9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -523,6 +523,9 @@
private static final String PROPERTY_IS_UPDATE_OWNERSHIP_ENFORCEMENT_AVAILABLE =
"is_update_ownership_enforcement_available";
+ private static final String PROPERTY_DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED =
+ "deferred_no_kill_post_delete_delay_ms_extended";
+
/**
* The default response for package verification timeout.
*
@@ -924,7 +927,11 @@
static final int WRITE_USER_PACKAGE_RESTRICTIONS = 30;
- static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000;
+ private static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000;
+
+ private static final long DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED =
+ TimeUnit.DAYS.toMillis(1);
+
private static final int DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS = 500;
private static final int DEFERRED_PENDING_KILL_INSTALL_OBSERVER_DELAY_MS = 1000;
@@ -1288,7 +1295,19 @@
void scheduleDeferredNoKillPostDelete(InstallArgs args) {
Message message = mHandler.obtainMessage(DEFERRED_NO_KILL_POST_DELETE, args);
- mHandler.sendMessageDelayed(message, DEFERRED_NO_KILL_POST_DELETE_DELAY_MS);
+ // If the feature flag is on, retain the old files for a day. Otherwise, delete the old
+ // files after a few seconds.
+ long deleteDelayMillis = DEFERRED_NO_KILL_POST_DELETE_DELAY_MS;
+ if (Flags.improveInstallDontKill()) {
+ deleteDelayMillis = Binder.withCleanCallingIdentity(() -> {
+ return DeviceConfig.getLong(NAMESPACE_PACKAGE_MANAGER_SERVICE,
+ /* name= */ PROPERTY_DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED,
+ /* defaultValue= */ DEFERRED_NO_KILL_POST_DELETE_DELAY_MS_EXTENDED);
+ });
+ Slog.w(TAG, "Delaying the deletion of <" + args.getCodePath() + "> by "
+ + deleteDelayMillis + "ms or till the next reboot");
+ }
+ mHandler.sendMessageDelayed(message, deleteDelayMillis);
}
void schedulePruneUnusedStaticSharedLibraries(boolean delay) {
@@ -1515,8 +1534,8 @@
return;
}
for (int userId : userIds) {
- var archiveState = PackageArchiver.createArchiveState(archivePackage, userId,
- responsibleInstallerPackage);
+ var archiveState = mInstallerService.mPackageArchiver.createArchiveState(
+ archivePackage, userId, responsibleInstallerPackage);
if (archiveState == null) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index fc66203..215e952 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -4639,7 +4639,7 @@
try {
mInterface.getPackageInstaller().requestArchive(packageName,
/* callerPackageName= */ "", receiver.getIntentSender(),
- new UserHandle(translatedUserId));
+ new UserHandle(translatedUserId), 0);
} catch (Exception e) {
pw.println("Failure [" + e.getMessage() + "]");
return 1;
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 293b873..26dc576 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -770,6 +770,11 @@
onChanged();
}
+ void setArchiveState(ArchiveState archiveState, int userId) {
+ modifyUserState(userId).setArchiveState(archiveState);
+ onChanged();
+ }
+
void setArchiveTimeMillis(long value, int userId) {
modifyUserState(userId).setArchiveTimeMillis(value);
onChanged();
diff --git a/services/core/java/com/android/server/pm/UserDataPreparer.java b/services/core/java/com/android/server/pm/UserDataPreparer.java
index 6d58d34..8adb566 100644
--- a/services/core/java/com/android/server/pm/UserDataPreparer.java
+++ b/services/core/java/com/android/server/pm/UserDataPreparer.java
@@ -23,10 +23,10 @@
import android.os.Environment;
import android.os.FileUtils;
import android.os.RecoverySystem;
-import android.os.storage.StorageManager;
-import android.os.storage.VolumeInfo;
import android.os.SystemProperties;
import android.os.UserHandle;
+import android.os.storage.StorageManager;
+import android.os.storage.VolumeInfo;
import android.system.ErrnoException;
import android.system.Os;
import android.system.OsConstants;
@@ -35,6 +35,7 @@
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.utils.Slogf;
import java.io.File;
import java.io.IOException;
@@ -43,7 +44,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
/**
* Helper class for preparing and destroying user storage
@@ -65,31 +65,37 @@
/**
* Prepare storage areas for given user on all mounted devices.
*/
- void prepareUserData(int userId, int userSerial, int flags) {
+ void prepareUserData(UserInfo userInfo, int flags) {
synchronized (mInstallLock) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
/*
* Internal storage must be prepared before adoptable storage, since the user's volume
* keys are stored in their internal storage.
*/
- prepareUserDataLI(null /* internal storage */, userId, userSerial, flags, true);
+ prepareUserDataLI(null /* internal storage */, userInfo, flags, true);
for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
final String volumeUuid = vol.getFsUuid();
if (volumeUuid != null) {
- prepareUserDataLI(volumeUuid, userId, userSerial, flags, true);
+ prepareUserDataLI(volumeUuid, userInfo, flags, true);
}
}
}
}
- private void prepareUserDataLI(String volumeUuid, int userId, int userSerial, int flags,
+ private void prepareUserDataLI(String volumeUuid, UserInfo userInfo, int flags,
boolean allowRecover) {
- // Prepare storage and verify that serial numbers are consistent; if
- // there's a mismatch we need to destroy to avoid leaking data
+ final int userId = userInfo.id;
+ final int userSerial = userInfo.serialNumber;
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final boolean isNewUser = userInfo.lastLoggedInTime == 0;
+ Slogf.d(TAG, "Preparing user data; volumeUuid=%s, userId=%d, flags=0x%x, isNewUser=%s",
+ volumeUuid, userId, flags, isNewUser);
try {
+ // Prepare CE and/or DE storage.
storage.prepareUserStorage(volumeUuid, userId, userSerial, flags);
+ // Ensure that the data directories of a removed user with the same ID are not being
+ // reused. New users must get fresh data directories, to avoid leaking data.
if ((flags & StorageManager.FLAG_STORAGE_DE) != 0) {
enforceSerialNumber(getDataUserDeDirectory(volumeUuid, userId), userSerial);
if (Objects.equals(volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)) {
@@ -103,9 +109,10 @@
}
}
+ // Prepare the app data directories.
mInstaller.createUserData(volumeUuid, userId, userSerial, flags);
- // CE storage is available after they are prepared.
+ // If applicable, record that the system user's CE storage has been prepared.
if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 &&
(userId == UserHandle.USER_SYSTEM)) {
String propertyName = "sys.user." + userId + ".ce_available";
@@ -113,20 +120,31 @@
SystemProperties.set(propertyName, "true");
}
} catch (Exception e) {
- logCriticalInfo(Log.WARN, "Destroying user " + userId + " on volume " + volumeUuid
- + " because we failed to prepare: " + e);
- destroyUserDataLI(volumeUuid, userId, flags);
-
+ // Failed to prepare user data. For new users, specifically users that haven't ever
+ // been unlocked, destroy the user data, and try again (if not already retried). This
+ // might be effective at resolving some errors, such as stale directories from a reused
+ // user ID. Don't auto-destroy data for existing users, since issues with existing
+ // users might be fixable via an OTA without having to wipe the user's data.
+ if (isNewUser) {
+ logCriticalInfo(Log.ERROR, "Destroying user " + userId + " on volume " + volumeUuid
+ + " because we failed to prepare: " + e);
+ destroyUserDataLI(volumeUuid, userId, flags);
+ } else {
+ logCriticalInfo(Log.ERROR, "Failed to prepare user " + userId + " on volume "
+ + volumeUuid + ": " + e);
+ }
if (allowRecover) {
// Try one last time; if we fail again we're really in trouble
- prepareUserDataLI(volumeUuid, userId, userSerial,
- flags | StorageManager.FLAG_STORAGE_DE, false);
+ prepareUserDataLI(volumeUuid, userInfo, flags | StorageManager.FLAG_STORAGE_DE,
+ false);
} else {
+ // If internal storage of the system user fails to prepare on first boot, then
+ // things are *really* broken, so we might as well reboot to recovery right away.
try {
Log.wtf(TAG, "prepareUserData failed for user " + userId, e);
- if (userId == UserHandle.USER_SYSTEM) {
+ if (isNewUser && userId == UserHandle.USER_SYSTEM && volumeUuid == null) {
RecoverySystem.rebootPromptAndWipeUserData(mContext,
- "prepareUserData failed for system user");
+ "failed to prepare internal storage for system user");
}
} catch (IOException e2) {
throw new RuntimeException("error rebooting into recovery", e2);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index b89b4a2..1393121 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -5124,8 +5124,7 @@
// unlocked. We do this to ensure that CE storage isn't prepared before the CE key is
// saved to disk. This also matches what is done for user 0.
t.traceBegin("prepareUserData");
- mUserDataPreparer.prepareUserData(userId, userInfo.serialNumber,
- StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_DE);
t.traceEnd();
t.traceBegin("LSS.createNewUser");
@@ -6387,12 +6386,11 @@
}
TimingsTraceAndSlog t = new TimingsTraceAndSlog();
t.traceBegin("onBeforeStartUser-" + userId);
- final int userSerial = userInfo.serialNumber;
// Migrate only if build fingerprints mismatch
boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
userInfo.lastLoggedInFingerprint);
t.traceBegin("prepareUserData");
- mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_DE);
t.traceEnd();
t.traceBegin("reconcileAppsData");
getPackageManagerInternal().reconcileAppsData(userId, StorageManager.FLAG_STORAGE_DE,
@@ -6418,14 +6416,13 @@
if (userInfo == null) {
return;
}
- final int userSerial = userInfo.serialNumber;
// Migrate only if build fingerprints mismatch
boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
userInfo.lastLoggedInFingerprint);
final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
t.traceBegin("prepareUserData-" + userId);
- mUserDataPreparer.prepareUserData(userId, userSerial, StorageManager.FLAG_STORAGE_CE);
+ mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_CE);
t.traceEnd();
StorageManagerInternal smInternal = LocalServices.getService(StorageManagerInternal.class);
diff --git a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
index d0c346a..57f4a5d 100644
--- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
+++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java
@@ -337,7 +337,8 @@
0, // deprecated, used to be durationIncludingSleepMs
0, // optimizedPackagesCount
0, // packagesDependingOnBootClasspathCount
- 0); // totalPackagesCount
+ 0, // totalPackagesCount
+ ArtStatsLog.BACKGROUND_DEXOPT_JOB_ENDED__PASS__PASS_UNKNOWN);
}
}
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java b/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
index dbf4047..28818f7 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionMigrationHelperImpl.java
@@ -93,7 +93,7 @@
Map<Integer, Map<String, LegacyPermissionState>> appIdPermissionStates = new ArrayMap<>();
RuntimePermissionsState legacyState =
- mPackageManagerInternal.getLegacyPermissionsState(userId);
+ (RuntimePermissionsState) mPackageManagerInternal.getLegacyPermissionsState(userId);
PackageManagerLocal packageManagerLocal =
LocalManagerRegistry.getManager(PackageManagerLocal.class);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index e817df8..30bce2f4 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -22,6 +22,9 @@
import static android.app.AppOpsManager.OP_CREATE_ACCESSIBILITY_OVERLAY;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.AppOpsManager.OP_TOAST_WINDOW;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;
import static android.content.pm.PackageManager.FEATURE_AUTOMOTIVE;
import static android.content.pm.PackageManager.FEATURE_HDMI_CEC;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
@@ -563,6 +566,7 @@
int mShortPressOnWindowBehavior;
int mPowerVolUpBehavior;
boolean mStylusButtonsEnabled = true;
+ boolean mKidsModeEnabled;
boolean mHasSoftInput = false;
boolean mUseTvRouting;
boolean mAllowStartActivityForLongPressOnPowerDuringSetup;
@@ -887,6 +891,9 @@
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.STYLUS_BUTTONS_ENABLED), false, this,
UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.NAV_BAR_KIDS_MODE), false, this,
+ UserHandle.USER_ALL);
updateSettings();
}
@@ -2964,12 +2971,44 @@
mStylusButtonsEnabled = Settings.Secure.getIntForUser(resolver,
Secure.STYLUS_BUTTONS_ENABLED, 1, UserHandle.USER_CURRENT) == 1;
mInputManagerInternal.setStylusButtonMotionEventsEnabled(mStylusButtonsEnabled);
+
+ final boolean kidsModeEnabled = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.NAV_BAR_KIDS_MODE, 0, UserHandle.USER_CURRENT) == 1;
+ if (mKidsModeEnabled != kidsModeEnabled) {
+ mKidsModeEnabled = kidsModeEnabled;
+ updateKidsModeSettings();
+ }
}
if (updateRotation) {
updateRotation(true);
}
}
+ private void updateKidsModeSettings() {
+ if (mKidsModeEnabled) {
+ // Needed since many Kids apps aren't optimised to support both orientations and it
+ // will be hard for kids to understand the app compat mode.
+ // TODO(229961548): Remove ignoreOrientationRequest exception for Kids Mode once
+ // possible.
+ if (mContext.getResources().getBoolean(R.bool.config_reverseDefaultRotation)) {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ true /* isIgnoreOrientationRequestDisabled */,
+ new int[]{SCREEN_ORIENTATION_LANDSCAPE,
+ SCREEN_ORIENTATION_REVERSE_LANDSCAPE},
+ new int[]{SCREEN_ORIENTATION_SENSOR_LANDSCAPE,
+ SCREEN_ORIENTATION_SENSOR_LANDSCAPE});
+ } else {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ true /* isIgnoreOrientationRequestDisabled */,
+ null /* fromOrientations */, null /* toOrientations */);
+ }
+ } else {
+ mWindowManagerInternal.setOrientationRequestPolicy(
+ false /* isIgnoreOrientationRequestDisabled */,
+ null /* fromOrientations */, null /* toOrientations */);
+ }
+ }
+
private DreamManagerInternal getDreamManagerInternal() {
if (mDreamManagerInternal == null) {
// If mDreamManagerInternal is null, attempt to re-fetch it.
@@ -3433,7 +3472,7 @@
}
break;
case KeyEvent.KEYCODE_DEL:
- case KeyEvent.KEYCODE_GRAVE:
+ case KeyEvent.KEYCODE_ESCAPE:
if (firstDown && event.isMetaPressed()) {
logKeyboardSystemsEvent(event, KeyboardLogEvent.BACK);
injectBackGesture(event.getDownTime());
@@ -3932,7 +3971,9 @@
}
return true;
case KeyEvent.KEYCODE_ESCAPE:
- if (down && repeatCount == 0) {
+ if (down
+ && KeyEvent.metaStateHasNoModifiers(metaState)
+ && repeatCount == 0) {
mContext.closeSystemDialogs();
}
return true;
@@ -6421,6 +6462,7 @@
pw.print(!mAllowLockscreenWhenOnDisplays.isEmpty());
pw.print(" mLockScreenTimeout="); pw.print(mLockScreenTimeout);
pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive);
+ pw.print(prefix); pw.print("mKidsModeEnabled="); pw.println(mKidsModeEnabled);
mHapticFeedbackVibrationProvider.dump(prefix, pw);
mGlobalKeyManager.dump(prefix, pw);
diff --git a/services/core/java/com/android/server/power/LowPowerStandbyController.java b/services/core/java/com/android/server/power/LowPowerStandbyController.java
index fbad762..fa94b43 100644
--- a/services/core/java/com/android/server/power/LowPowerStandbyController.java
+++ b/services/core/java/com/android/server/power/LowPowerStandbyController.java
@@ -33,6 +33,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
@@ -146,6 +147,7 @@
this::onStandbyTimeoutExpired;
private final LowPowerStandbyControllerInternal mLocalService = new LocalService();
private final SparseIntArray mUidAllowedReasons = new SparseIntArray();
+ private final List<String> mLowPowerStandbyManagingPackages = new ArrayList<>();
private final List<StandbyPortsLock> mStandbyPortLocks = new ArrayList<>();
@GuardedBy("mLock")
@@ -370,6 +372,14 @@
return;
}
+ List<PackageInfo> manageLowPowerStandbyPackages = mContext.getPackageManager()
+ .getPackagesHoldingPermissions(new String[]{
+ Manifest.permission.MANAGE_LOW_POWER_STANDBY
+ }, PackageManager.MATCH_SYSTEM_ONLY);
+ for (PackageInfo packageInfo : manageLowPowerStandbyPackages) {
+ mLowPowerStandbyManagingPackages.add(packageInfo.packageName);
+ }
+
mAlarmManager = mContext.getSystemService(AlarmManager.class);
mPowerManager = mContext.getSystemService(PowerManager.class);
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
@@ -756,9 +766,7 @@
Slog.d(TAG, "notifyEnabledChangedLocked, mIsEnabled=" + mIsEnabled);
}
- final Intent intent = new Intent(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ sendExplicitBroadcast(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
}
@GuardedBy("mLock")
@@ -772,10 +780,7 @@
Slog.d(TAG, "notifyPolicyChanged, policy=" + policy);
}
- final Intent intent = new Intent(
- PowerManager.ACTION_LOW_POWER_STANDBY_POLICY_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ sendExplicitBroadcast(PowerManager.ACTION_LOW_POWER_STANDBY_POLICY_CHANGED);
}
private void onStandbyTimeoutExpired() {
@@ -787,6 +792,22 @@
}
}
+ private void sendExplicitBroadcast(String intentType) {
+ final Intent intent = new Intent(intentType);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+
+ // Send explicit broadcast to holders of MANAGE_LOW_POWER_STANDBY
+ final Intent privilegedIntent = new Intent(intentType);
+ privilegedIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ for (String packageName : mLowPowerStandbyManagingPackages) {
+ final Intent explicitIntent = new Intent(privilegedIntent);
+ explicitIntent.setPackage(packageName);
+ mContext.sendBroadcastAsUser(explicitIntent, UserHandle.ALL,
+ Manifest.permission.MANAGE_LOW_POWER_STANDBY);
+ }
+ }
+
@GuardedBy("mLock")
private void enqueueNotifyActiveChangedLocked() {
final Message msg = mHandler.obtainMessage(MSG_NOTIFY_ACTIVE_CHANGED, mIsActive);
@@ -1360,7 +1381,7 @@
}
final Intent intent = new Intent(PowerManager.ACTION_LOW_POWER_STANDBY_PORTS_CHANGED);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
Manifest.permission.MANAGE_LOW_POWER_STANDBY);
}
diff --git a/services/core/java/com/android/server/power/TEST_MAPPING b/services/core/java/com/android/server/power/TEST_MAPPING
index 05a0e85..e64704a 100644
--- a/services/core/java/com/android/server/power/TEST_MAPPING
+++ b/services/core/java/com/android/server/power/TEST_MAPPING
@@ -45,6 +45,17 @@
{"include-filter": "com.android.server.power"},
{"exclude-annotation": "org.junit.Ignore"}
]
+ },
+ {
+ "name": "CtsStatsdAtomHostTestCases",
+ "options": [
+ {"exclude-annotation": "androidx.test.filters.FlakyTest"},
+ {"exclude-annotation": "org.junit.Ignore"},
+ {"include-filter": "android.cts.statsdatom.powermanager"}
+ ],
+ "file_patterns": [
+ "(/|^)ThermalManagerService.java"
+ ]
}
]
}
diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java
index d17207b..99653ae 100644
--- a/services/core/java/com/android/server/power/ThermalManagerService.java
+++ b/services/core/java/com/android/server/power/ThermalManagerService.java
@@ -16,8 +16,17 @@
package com.android.server.power;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__FEATURE_NOT_SUPPORTED;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__HAL_NOT_READY;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__SUCCESS;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_STATUS_CALLED__API_STATUS__HAL_NOT_READY;
+import static com.android.internal.util.FrameworkStatsLog.THERMAL_STATUS_CALLED__API_STATUS__SUCCESS;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.StatsManager;
import android.content.Context;
import android.hardware.thermal.IThermal;
import android.hardware.thermal.IThermalChangedCallback;
@@ -48,11 +57,13 @@
import android.util.ArrayMap;
import android.util.EventLog;
import android.util.Slog;
+import android.util.StatsEvent;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.FrameworkStatsLog;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.SystemService;
@@ -122,6 +133,8 @@
@VisibleForTesting
final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher();
+ private final Context mContext;
+
public ThermalManagerService(Context context) {
this(context, null);
}
@@ -129,6 +142,7 @@
@VisibleForTesting
ThermalManagerService(Context context, @Nullable ThermalHalWrapper halWrapper) {
super(context);
+ mContext = context;
mHalWrapper = halWrapper;
if (halWrapper != null) {
halWrapper.setCallback(this::onTemperatureChangedCallback);
@@ -146,6 +160,9 @@
if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
onActivityManagerReady();
}
+ if (phase == SystemService.PHASE_BOOT_COMPLETED) {
+ registerStatsCallbacks();
+ }
}
private void onActivityManagerReady() {
@@ -326,6 +343,31 @@
}
}
+ private void registerStatsCallbacks() {
+ final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
+ if (statsManager != null) {
+ statsManager.setPullAtomCallback(
+ FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS,
+ null, // use default PullAtomMetadata values
+ DIRECT_EXECUTOR,
+ this::onPullAtom);
+ }
+ }
+
+ private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) {
+ if (atomTag == FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS) {
+ final float[] thresholds;
+ synchronized (mTemperatureWatcher.mSamples) {
+ thresholds = Arrays.copyOf(mTemperatureWatcher.mHeadroomThresholds,
+ mTemperatureWatcher.mHeadroomThresholds.length);
+ }
+ data.add(
+ FrameworkStatsLog.buildStatsEvent(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS,
+ thresholds));
+ }
+ return android.app.StatsManager.PULL_SUCCESS;
+ }
+
@VisibleForTesting
final IThermalService.Stub mService = new IThermalService.Stub() {
@Override
@@ -449,6 +491,12 @@
synchronized (mLock) {
final long token = Binder.clearCallingIdentity();
try {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_STATUS_CALLED,
+ Binder.getCallingUid(),
+ mHalReady.get()
+ ? THERMAL_STATUS_CALLED__API_STATUS__SUCCESS
+ : THERMAL_STATUS_CALLED__API_STATUS__HAL_NOT_READY,
+ thermalSeverityToStatsdStatus(mStatus));
return mStatus;
} finally {
Binder.restoreCallingIdentity(token);
@@ -493,6 +541,9 @@
@Override
public float getThermalHeadroom(int forecastSeconds) {
if (!mHalReady.get()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED, getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__HAL_NOT_READY,
+ Float.NaN);
return Float.NaN;
}
@@ -500,6 +551,9 @@
if (DEBUG) {
Slog.d(TAG, "Invalid forecastSeconds: " + forecastSeconds);
}
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED, getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__INVALID_ARGUMENT,
+ Float.NaN);
return Float.NaN;
}
@@ -509,12 +563,21 @@
@Override
public float[] getThermalHeadroomThresholds() {
if (!mHalReady.get()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__HAL_NOT_READY);
throw new IllegalStateException("Thermal HAL connection is not initialized");
}
if (!Flags.allowThermalHeadroomThresholds()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__FEATURE_NOT_SUPPORTED);
throw new UnsupportedOperationException("Thermal headroom thresholds not enabled");
}
synchronized (mTemperatureWatcher.mSamples) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_THRESHOLDS_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_THRESHOLDS_CALLED__API_STATUS__SUCCESS);
return Arrays.copyOf(mTemperatureWatcher.mHeadroomThresholds,
mTemperatureWatcher.mHeadroomThresholds.length);
}
@@ -544,6 +607,27 @@
};
+ private static int thermalSeverityToStatsdStatus(int severity) {
+ switch (severity) {
+ case PowerManager.THERMAL_STATUS_NONE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__NONE;
+ case PowerManager.THERMAL_STATUS_LIGHT:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__LIGHT;
+ case PowerManager.THERMAL_STATUS_MODERATE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__MODERATE;
+ case PowerManager.THERMAL_STATUS_SEVERE:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__SEVERE;
+ case PowerManager.THERMAL_STATUS_CRITICAL:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__CRITICAL;
+ case PowerManager.THERMAL_STATUS_EMERGENCY:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__EMERGENCY;
+ case PowerManager.THERMAL_STATUS_SHUTDOWN:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__SHUTDOWN;
+ default:
+ return FrameworkStatsLog.THERMAL_STATUS_CALLED__STATUS__NONE;
+ }
+ }
+
private static void dumpItemsLocked(PrintWriter pw, String prefix,
Collection<?> items) {
for (Iterator iterator = items.iterator(); iterator.hasNext();) {
@@ -1492,13 +1576,15 @@
threshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE];
if (!Float.isNaN(severeThreshold)) {
mSevereThresholds.put(threshold.name, severeThreshold);
- for (int severity = ThrottlingSeverity.LIGHT;
- severity <= ThrottlingSeverity.SHUTDOWN; severity++) {
- if (Flags.allowThermalHeadroomThresholds()
- && threshold.hotThrottlingThresholds.length > severity) {
- updateHeadroomThreshold(severity,
- threshold.hotThrottlingThresholds[severity],
- severeThreshold);
+ if (Flags.allowThermalHeadroomThresholds()) {
+ for (int severity = ThrottlingSeverity.LIGHT;
+ severity <= ThrottlingSeverity.SHUTDOWN; severity++) {
+ if (severity != ThrottlingSeverity.SEVERE
+ && threshold.hotThrottlingThresholds.length > severity) {
+ updateHeadroomThreshold(severity,
+ threshold.hotThrottlingThresholds[severity],
+ severeThreshold);
+ }
}
}
}
@@ -1506,11 +1592,15 @@
}
}
- // For a older device with multiple SKIN sensors, we will set a severity's headroom
+ // For an older device with multiple SKIN sensors, we will set a severity's headroom
// threshold based on the minimum value of all as a workaround.
void updateHeadroomThreshold(int severity, float threshold, float severeThreshold) {
if (!Float.isNaN(threshold)) {
synchronized (mSamples) {
+ if (severity == ThrottlingSeverity.SEVERE) {
+ mHeadroomThresholds[severity] = 1.0f;
+ return;
+ }
float headroom = normalizeTemperature(threshold, severeThreshold);
if (Float.isNaN(mHeadroomThresholds[severity])) {
mHeadroomThresholds[severity] = headroom;
@@ -1620,6 +1710,10 @@
// to sample, return early
if (mSamples.isEmpty()) {
Slog.e(TAG, "No temperature samples found");
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE,
+ Float.NaN);
return Float.NaN;
}
@@ -1627,16 +1721,22 @@
// so return early
if (mSevereThresholds.isEmpty()) {
Slog.e(TAG, "No temperature thresholds found");
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD,
+ Float.NaN);
return Float.NaN;
}
float maxNormalized = Float.NaN;
+ int noThresholdSampleCount = 0;
for (Map.Entry<String, ArrayList<Sample>> entry : mSamples.entrySet()) {
String name = entry.getKey();
ArrayList<Sample> samples = entry.getValue();
Float threshold = mSevereThresholds.get(name);
if (threshold == null) {
+ noThresholdSampleCount++;
Slog.e(TAG, "No threshold found for " + name);
continue;
}
@@ -1659,7 +1759,17 @@
maxNormalized = normalized;
}
}
-
+ if (noThresholdSampleCount == mSamples.size()) {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ THERMAL_HEADROOM_CALLED__API_STATUS__NO_TEMPERATURE_THRESHOLD,
+ Float.NaN);
+ } else {
+ FrameworkStatsLog.write(FrameworkStatsLog.THERMAL_HEADROOM_CALLED,
+ Binder.getCallingUid(),
+ FrameworkStatsLog.THERMAL_HEADROOM_CALLED__API_STATUS__SUCCESS,
+ maxNormalized);
+ }
return maxNormalized;
}
}
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index c17d6ab..7c833cb 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -32,6 +32,8 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.WorkDuration;
+import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseIntArray;
@@ -196,6 +198,9 @@
private static native void nativeSetMode(long halPtr, int mode, boolean enabled);
+ private static native void nativeReportActualWorkDuration(long halPtr,
+ WorkDuration[] workDurations);
+
/** Wrapper for HintManager.nativeInit */
public void halInit() {
nativeInit();
@@ -253,6 +258,10 @@
nativeSetMode(halPtr, mode, enabled);
}
+ /** Wrapper for HintManager.nativeReportActualWorkDuration */
+ public void halReportActualWorkDuration(long halPtr, WorkDuration[] workDurations) {
+ nativeReportActualWorkDuration(halPtr, workDurations);
+ }
}
@VisibleForTesting
@@ -629,6 +638,56 @@
}
}
+ @Override
+ public void reportActualWorkDuration2(WorkDuration[] workDurations) {
+ synchronized (this) {
+ if (mHalSessionPtr == 0 || !mUpdateAllowed) {
+ return;
+ }
+ Preconditions.checkArgument(workDurations.length != 0, "the count"
+ + " of work durations shouldn't be 0.");
+ for (WorkDuration workDuration : workDurations) {
+ validateWorkDuration(workDuration);
+ }
+ mNativeWrapper.halReportActualWorkDuration(mHalSessionPtr, workDurations);
+ }
+ }
+
+ void validateWorkDuration(WorkDuration workDuration) {
+ if (DEBUG) {
+ Slogf.d(TAG, "WorkDuration(" + workDuration.getTimestampNanos() + ", "
+ + workDuration.getWorkPeriodStartTimestampNanos() + ", "
+ + workDuration.getActualTotalDurationNanos() + ", "
+ + workDuration.getActualCpuDurationNanos() + ", "
+ + workDuration.getActualGpuDurationNanos() + ")");
+ }
+
+ // Allow work period start timestamp to be zero in system server side because
+ // legacy API call will use zero value. It can not be estimated with the timestamp
+ // the sample is received because the samples could stack up.
+ if (workDuration.getWorkPeriodStartTimestampNanos() < 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple(
+ "Work period start timestamp (%d) should be greater than 0",
+ workDuration.getWorkPeriodStartTimestampNanos()));
+ }
+ if (workDuration.getActualTotalDurationNanos() <= 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual total duration (%d) should be greater than 0",
+ workDuration.getActualTotalDurationNanos()));
+ }
+ if (workDuration.getActualCpuDurationNanos() <= 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual CPU duration (%d) should be greater than 0",
+ workDuration.getActualCpuDurationNanos()));
+ }
+ if (workDuration.getActualGpuDurationNanos() < 0) {
+ throw new IllegalArgumentException(
+ TextUtils.formatSimple("Actual GPU duration (%d) should be non negative",
+ workDuration.getActualGpuDurationNanos()));
+ }
+ }
+
private void onProcStateChanged(boolean updateAllowed) {
updateHintAllowed(updateAllowed);
}
diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
index 0491c14..698f6ea 100644
--- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
+++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java
@@ -49,6 +49,7 @@
import android.os.Binder;
import android.os.BluetoothBatteryStats;
import android.os.Build;
+import android.os.ConditionVariable;
import android.os.Handler;
import android.os.IBatteryPropertiesRegistrar;
import android.os.Looper;
@@ -137,7 +138,6 @@
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.net.module.util.NetworkCapabilitiesUtils;
-import com.android.server.power.optimization.Flags;
import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
import libcore.util.EmptyArray;
@@ -286,6 +286,7 @@
private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>();
private int[] mCpuPowerBracketMap;
private final CpuPowerStatsCollector mCpuPowerStatsCollector;
+ private boolean mPowerStatsCollectorEnabled;
public LongSparseArray<SamplingTimer> getKernelMemoryStats() {
return mKernelMemoryStats;
@@ -601,6 +602,10 @@
@SuppressWarnings("GuardedBy") // errorprone false positive on getProcStateTimeCounter
@VisibleForTesting
public void updateProcStateCpuTimesLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
+ if (mPowerStatsCollectorEnabled) {
+ return;
+ }
+
ensureKernelSingleUidTimeReaderLocked();
final Uid u = getUidStatsLocked(uid);
@@ -653,8 +658,9 @@
*/
@SuppressWarnings("GuardedBy") // errorprone false positive on getProcStateTimeCounter
public void updateCpuTimesForAllUids() {
- if (mCpuPowerStatsCollector != null) {
+ if (mPowerStatsCollectorEnabled && mCpuPowerStatsCollector != null) {
mCpuPowerStatsCollector.schedule();
+ return;
}
synchronized (BatteryStatsImpl.this) {
@@ -712,7 +718,7 @@
@GuardedBy("this")
private void ensureKernelSingleUidTimeReaderLocked() {
- if (mKernelSingleUidTimeReader != null) {
+ if (mPowerStatsCollectorEnabled || mKernelSingleUidTimeReader != null) {
return;
}
@@ -8213,6 +8219,10 @@
@GuardedBy("mBsi")
private void ensureMultiStateCounters(long timestampMs) {
+ if (mBsi.mPowerStatsCollectorEnabled) {
+ throw new IllegalStateException("Multi-state counters used in streamlined mode");
+ }
+
if (mProcStateTimeMs == null) {
mProcStateTimeMs =
new TimeInFreqMultiStateCounter(mBsi.mOnBatteryTimeBase,
@@ -10511,7 +10521,7 @@
mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
}
- if (mBsi.trackPerProcStateCpuTimes()) {
+ if (!mBsi.mPowerStatsCollectorEnabled && mBsi.trackPerProcStateCpuTimes()) {
mBsi.updateProcStateCpuTimesLocked(mUid, elapsedRealtimeMs, uptimeMs);
LongArrayMultiStateCounter onBatteryCounter =
@@ -10533,7 +10543,7 @@
final int batteryConsumerProcessState =
mapUidProcessStateToBatteryConsumerProcessState(uidRunningState);
- if (mBsi.mSystemReady && Flags.streamlinedBatteryStats()) {
+ if (mBsi.mSystemReady && mBsi.mPowerStatsCollectorEnabled) {
mBsi.mHistory.recordProcessStateChange(elapsedRealtimeMs, uptimeMs, mUid,
batteryConsumerProcessState);
}
@@ -11702,6 +11712,10 @@
// Store the empty state to disk to ensure consistency
writeSyncLocked();
+ if (mPowerStatsCollectorEnabled) {
+ schedulePowerStatsSampleCollection();
+ }
+
// Flush external data, gathering snapshots, but don't process it since it is pre-reset data
mIgnoreNextExternalStats = true;
mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ON_RESET);
@@ -14211,7 +14225,7 @@
mCpuUidFreqTimeReader.onSystemReady();
}
if (mCpuPowerStatsCollector != null) {
- mCpuPowerStatsCollector.onSystemReady();
+ mCpuPowerStatsCollector.setEnabled(mPowerStatsCollectorEnabled);
}
mSystemReady = true;
}
@@ -15232,6 +15246,15 @@
return mCpuUidFreqTimeReader.isFastCpuTimesReader();
}
+ /**
+ * Enables or disables the PowerStatsCollector mode.
+ */
+ public void setPowerStatsCollectorEnabled(boolean enabled) {
+ synchronized (this) {
+ mPowerStatsCollectorEnabled = enabled;
+ }
+ }
+
@GuardedBy("this")
public void systemServicesReady(Context context) {
mConstants.startObserving(context.getContentResolver());
@@ -15743,6 +15766,16 @@
}
/**
+ * Schedules an immediate collection of PowerStats samples and awaits the result.
+ */
+ public void collectPowerStatsSamples() {
+ schedulePowerStatsSampleCollection();
+ ConditionVariable done = new ConditionVariable();
+ mHandler.post(done::open);
+ done.block();
+ }
+
+ /**
* Grabs one sample of PowerStats and prints it.
*/
public void dumpStatsSample(PrintWriter pw) {
diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
index 303c245..096c5e6 100644
--- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
+++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java
@@ -71,7 +71,7 @@
// Power calculators are applied in the order of registration
mPowerCalculators.add(new BatteryChargeCalculator());
- if (mPowerStatsExporterEnabled) {
+ if (!mPowerStatsExporterEnabled) {
mPowerCalculators.add(
new CpuPowerCalculator(mCpuScalingPolicies, mPowerProfile));
}
@@ -126,6 +126,10 @@
*/
public List<BatteryUsageStats> getBatteryUsageStats(BatteryStatsImpl stats,
List<BatteryUsageStatsQuery> queries) {
+ if (mPowerStatsExporterEnabled) {
+ stats.collectPowerStatsSamples();
+ }
+
ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size());
synchronized (stats) {
stats.prepareForDumpLocked();
@@ -168,15 +172,16 @@
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0);
final double minConsumedPowerThreshold = query.getMinConsumedPowerThreshold();
- final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
- stats.getCustomEnergyConsumerNames(), includePowerModels,
- includeProcessStateData, minConsumedPowerThreshold);
- // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration
- // of batteryUsageStats sessions to wall-clock adjustments
- batteryUsageStatsBuilder.setStatsStartTimestamp(stats.getStartClockTime());
- batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs);
-
+ final BatteryUsageStats.Builder batteryUsageStatsBuilder;
synchronized (stats) {
+ batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
+ stats.getCustomEnergyConsumerNames(), includePowerModels,
+ includeProcessStateData, minConsumedPowerThreshold);
+
+ // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration
+ // of batteryUsageStats sessions to wall-clock adjustments
+ batteryUsageStatsBuilder.setStatsStartTimestamp(stats.getStartClockTime());
+ batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs);
SparseArray<? extends BatteryStats.Uid> uidStats = stats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
final BatteryStats.Uid uid = uidStats.valueAt(i);
@@ -385,7 +390,6 @@
}
public void setPowerStatsExporterEnabled(boolean enabled) {
-
mPowerStatsExporterEnabled = enabled;
}
}
diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
index c05407c..4442845 100644
--- a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
+++ b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java
@@ -35,7 +35,6 @@
import com.android.internal.os.PowerProfile;
import com.android.internal.os.PowerStats;
import com.android.server.LocalServices;
-import com.android.server.power.optimization.Flags;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -273,13 +272,6 @@
mDefaultCpuPowerBracketsPerEnergyConsumer = defaultCpuPowerBracketsPerEnergyConsumer;
}
- /**
- * Initializes the collector during the boot sequence.
- */
- public void onSystemReady() {
- setEnabled(Flags.streamlinedBatteryStats());
- }
-
private boolean ensureInitialized() {
if (mIsInitialized) {
return true;
diff --git a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java b/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
index 70c24d5..1f6f113 100644
--- a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
+++ b/services/core/java/com/android/server/power/stats/PowerStatsExporter.java
@@ -60,6 +60,7 @@
*/
public void exportAggregatedPowerStats(BatteryUsageStats.Builder batteryUsageStatsBuilder,
long monotonicStartTime, long monotonicEndTime) {
+ boolean hasStoredSpans = false;
long maxEndTime = monotonicStartTime;
List<PowerStatsSpan.Metadata> spans = mPowerStatsStore.getTableOfContents();
for (int i = spans.size() - 1; i >= 0; i--) {
@@ -99,13 +100,14 @@
}
List<PowerStatsSpan.Section> sections = span.getSections();
for (int k = 0; k < sections.size(); k++) {
+ hasStoredSpans = true;
PowerStatsSpan.Section section = sections.get(k);
populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder,
((AggregatedPowerStatsSection) section).getAggregatedPowerStats());
}
}
- if (maxEndTime < monotonicEndTime - mBatterySessionTimeSpanSlackMillis) {
+ if (!hasStoredSpans || maxEndTime < monotonicEndTime - mBatterySessionTimeSpanSlackMillis) {
mPowerStatsAggregator.aggregatePowerStats(maxEndTime, monotonicEndTime,
stats -> populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder, stats));
}
diff --git a/services/core/java/com/android/server/power/stats/PowerStatsStore.java b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
index 7123bcb..7bcdc71 100644
--- a/services/core/java/com/android/server/power/stats/PowerStatsStore.java
+++ b/services/core/java/com/android/server/power/stats/PowerStatsStore.java
@@ -171,7 +171,7 @@
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
return PowerStatsSpan.read(inputStream, parser, mSectionReader, sectionTypes);
} catch (IOException | XmlPullParserException e) {
- Slog.wtf(TAG, "Cannot read PowerStatsSpan file: " + file);
+ Slog.wtf(TAG, "Cannot read PowerStatsSpan file: " + file, e);
}
} finally {
unlockStoreDirectory();
diff --git a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
index 8b57f87..8e9c889 100644
--- a/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
+++ b/services/core/java/com/android/server/speech/SpeechRecognitionManagerServiceImpl.java
@@ -38,6 +38,7 @@
import android.speech.IRecognitionSupportCallback;
import android.speech.RecognitionService;
import android.speech.SpeechRecognizer;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseIntArray;
@@ -253,6 +254,7 @@
@GuardedBy("mLock")
private void incrementSessionCountForUidLocked(int uid) {
mSessionCountByUid.put(uid, mSessionCountByUid.get(uid, 0) + 1);
+ Log.i(TAG, "Client " + uid + " has opened " + mSessionCountByUid.get(uid, 0) + " sessions");
}
@GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 940feb5..e876241 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -4871,7 +4871,7 @@
}
private int pullCachedAppsHighWatermark(int atomTag, List<StatsEvent> pulledData) {
- pulledData.add(LocalServices.getService(ActivityManagerInternal.class)
+ pulledData.add((StatsEvent) LocalServices.getService(ActivityManagerInternal.class)
.getCachedAppsHighWatermarkStats(atomTag, true));
return StatsManager.PULL_SUCCESS;
}
diff --git a/services/core/java/com/android/server/timezonedetector/TEST_MAPPING b/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
index 358618a..004d7996 100644
--- a/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
+++ b/services/core/java/com/android/server/timezonedetector/TEST_MAPPING
@@ -10,10 +10,7 @@
},
{
"name": "FrameworksTimeServicesTests"
- }
- ],
- // TODO(b/182461754): Change to "presubmit" when go/test-mapping-slo-guide allows.
- "postsubmit": [
+ },
{
"name": "CtsLocationTimeZoneManagerHostTest"
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index f82f08b..d172d3f 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -827,7 +827,7 @@
}
final boolean trusted;
- if (android.security.Flags.fixUnlockedDeviceRequiredKeys()) {
+ if (android.security.Flags.fixUnlockedDeviceRequiredKeysV2()) {
trusted = getUserTrustStateInner(id) == TrustState.TRUSTED;
} else {
trusted = aggregateIsTrusted(id);
@@ -1598,8 +1598,22 @@
fout.printf(" User \"%s\" (id=%d, flags=%#x)",
user.name, user.id, user.flags);
if (!user.supportsSwitchToByUser()) {
- fout.println("(managed profile)");
- fout.println(" disabled because switching to this user is not possible.");
+ final boolean locked;
+ if (user.isProfile()) {
+ if (mLockPatternUtils.isSeparateProfileChallengeEnabled(user.id)) {
+ fout.print(" (profile with separate challenge)");
+ locked = isDeviceLockedInner(user.id);
+ } else {
+ fout.print(" (profile with unified challenge)");
+ locked = isDeviceLockedInner(resolveProfileParent(user.id));
+ }
+ } else {
+ fout.println(" (user that cannot be switched to)");
+ locked = isDeviceLockedInner(user.id);
+ }
+ fout.println(": deviceLocked=" + dumpBool(locked));
+ fout.println(
+ " Trust agents disabled because switching to this user is not possible.");
return;
}
if (isCurrent) {
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 75e6faf..0d06f5b 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -3390,7 +3390,8 @@
if (currentFocusedApp != null && currentFocusedApp.task == task
&& topFocusedDisplayId == mDisplayContent.getDisplayId()) {
final Task topFocusableTask = mDisplayContent.getTask(
- (t) -> t.isLeafTask() && t.isFocusable(), true /* traverseTopToBottom */);
+ (t) -> t.isLeafTask() && t.isFocusable() && !t.inPinnedWindowingMode(),
+ true /* traverseTopToBottom */);
if (task == topFocusableTask) {
if (currentFocusedApp == this) {
ProtoLog.d(WM_DEBUG_FOCUS, "moveFocusableActivityToTop: already on top "
@@ -5262,7 +5263,7 @@
boolean canAffectSystemUiFlags() {
return task != null && task.canAffectSystemUiFlags() && isVisible()
- && !inPinnedWindowingMode();
+ && !mWaitForEnteringPinnedMode && !inPinnedWindowingMode();
}
@Override
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index bbaa691..e5794a1 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1861,7 +1861,10 @@
+ "PendingIntent. However, only the creator of the PendingIntent allows BAL, "
+ "while the sender does not allow BAL. realCallingPackage: "
+ realCallingPackage + "; callingPackage: " + mRequest.callingPackage
- + "; mTargetRootTask:" + mTargetRootTask);
+ + "; mTargetRootTask:" + mTargetRootTask + "; mIntent: " + mIntent
+ + "; mTargetRootTask.getTopNonFinishingActivity: "
+ + mTargetRootTask.getTopNonFinishingActivity()
+ + "; mTargetRootTask.getRootActivity: " + mTargetRootTask.getRootActivity());
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 6f5c676..b8b102f 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -5280,6 +5280,9 @@
/** Applies latest configuration and/or visibility updates if needed. */
boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) {
+ if (starting == null && mTaskSupervisor.isRootVisibilityUpdateDeferred()) {
+ return true;
+ }
boolean kept = true;
final Task mainRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
// mainRootTask is null during startup.
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 3a711b2..27cc2d6 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -1182,22 +1182,6 @@
}
}
- @Override
- public void setOrientationRequestPolicy(boolean isIgnoreOrientationRequestDisabled,
- @Nullable int[] fromOrientations, @Nullable int[] toOrientations) {
- enforceTaskPermission("setOrientationRequestPolicy()");
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (mGlobalLock) {
- mService.mWindowManager
- .setOrientationRequestPolicy(isIgnoreOrientationRequestDisabled,
- fromOrientations, toOrientations);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
-
public boolean handleInterceptBackPressedOnTaskRoot(Task task) {
if (!shouldInterceptBackPressedOnRootTask(task)) {
return false;
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index e5604ec..4243948 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -2857,12 +2857,18 @@
return false;
}
- /** Applies the new configuration for the changed displays. */
- void applyDisplayChangeIfNeeded() {
+ /**
+ * Applies the new configuration for the changed displays. Returns the activities that should
+ * check whether to deliver the new configuration to clients.
+ */
+ @Nullable
+ ArrayList<ActivityRecord> applyDisplayChangeIfNeeded() {
+ ArrayList<ActivityRecord> activitiesMayChange = null;
for (int i = mParticipants.size() - 1; i >= 0; --i) {
final WindowContainer<?> wc = mParticipants.valueAt(i);
final DisplayContent dc = wc.asDisplayContent();
if (dc == null || !mChanges.get(dc).hasChanged()) continue;
+ final int originalSeq = dc.getConfiguration().seq;
dc.sendNewConfiguration();
// Set to ready if no other change controls the ready state. But if there is, such as
// if an activity is pausing, it will call setReady(ar, false) and wait for the next
@@ -2871,7 +2877,22 @@
if (!mReadyTrackerOld.mUsed) {
setReady(dc, true);
}
+ if (originalSeq == dc.getConfiguration().seq) continue;
+ // If the update is deferred, sendNewConfiguration won't deliver new configuration to
+ // clients, then it is the caller's responsibility to deliver the changes.
+ if (mController.mAtm.mTaskSupervisor.isRootVisibilityUpdateDeferred()) {
+ if (activitiesMayChange == null) {
+ activitiesMayChange = new ArrayList<>();
+ }
+ final ArrayList<ActivityRecord> visibleActivities = activitiesMayChange;
+ dc.forAllActivities(r -> {
+ if (r.isVisibleRequested()) {
+ visibleActivities.add(r);
+ }
+ });
+ }
}
+ return activitiesMayChange;
}
boolean getLegacyIsReady() {
diff --git a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
new file mode 100644
index 0000000..e82dc37
--- /dev/null
+++ b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
@@ -0,0 +1,448 @@
+/*
+ * Copyright 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.wm;
+
+import static android.graphics.Matrix.MSCALE_X;
+import static android.graphics.Matrix.MSCALE_Y;
+import static android.graphics.Matrix.MSKEW_X;
+import static android.graphics.Matrix.MSKEW_Y;
+
+import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TPL;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Region;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.IntArray;
+import android.util.Pair;
+import android.util.Size;
+import android.view.InputWindowHandle;
+import android.window.ITrustedPresentationListener;
+import android.window.TrustedPresentationThresholds;
+import android.window.WindowInfosListener;
+
+import com.android.internal.protolog.common.ProtoLog;
+import com.android.server.wm.utils.RegionUtils;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Optional;
+
+/**
+ * Class to handle TrustedPresentationListener registrations in a thread safe manner. This class
+ * also takes care of cleaning up listeners when the remote process dies.
+ */
+public class TrustedPresentationListenerController {
+
+ // Should only be accessed by the posting to the handler
+ private class Listeners {
+ private final class ListenerDeathRecipient implements IBinder.DeathRecipient {
+ IBinder mListenerBinder;
+ int mInstances;
+
+ ListenerDeathRecipient(IBinder listenerBinder) {
+ mListenerBinder = listenerBinder;
+ mInstances = 0;
+ try {
+ mListenerBinder.linkToDeath(this, 0);
+ } catch (RemoteException ignore) {
+ }
+ }
+
+ void addInstance() {
+ mInstances++;
+ }
+
+ // return true if there are no instances alive
+ boolean removeInstance() {
+ mInstances--;
+ if (mInstances > 0) {
+ return false;
+ }
+ mListenerBinder.unlinkToDeath(this, 0);
+ return true;
+ }
+
+ public void binderDied() {
+ mHandler.post(() -> {
+ mUniqueListeners.remove(mListenerBinder);
+ removeListeners(mListenerBinder, Optional.empty());
+ });
+ }
+ }
+
+ // tracks binder deaths for cleanup
+ ArrayMap<IBinder, ListenerDeathRecipient> mUniqueListeners = new ArrayMap<>();
+ ArrayMap<IBinder /*window*/, ArrayList<TrustedPresentationInfo>> mWindowToListeners =
+ new ArrayMap<>();
+
+ void register(IBinder window, ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ var listenersForWindow = mWindowToListeners.computeIfAbsent(window,
+ iBinder -> new ArrayList<>());
+ listenersForWindow.add(new TrustedPresentationInfo(thresholds, id, listener));
+
+ // register death listener
+ var listenerBinder = listener.asBinder();
+ var deathRecipient = mUniqueListeners.computeIfAbsent(listenerBinder,
+ ListenerDeathRecipient::new);
+ deathRecipient.addInstance();
+ }
+
+ void unregister(ITrustedPresentationListener trustedPresentationListener, int id) {
+ var listenerBinder = trustedPresentationListener.asBinder();
+ var deathRecipient = mUniqueListeners.get(listenerBinder);
+ if (deathRecipient == null) {
+ ProtoLog.e(WM_DEBUG_TPL, "unregister failed, couldn't find"
+ + " deathRecipient for %s with id=%d", trustedPresentationListener, id);
+ return;
+ }
+
+ if (deathRecipient.removeInstance()) {
+ mUniqueListeners.remove(listenerBinder);
+ }
+ removeListeners(listenerBinder, Optional.of(id));
+ }
+
+ boolean isEmpty() {
+ return mWindowToListeners.isEmpty();
+ }
+
+ ArrayList<TrustedPresentationInfo> get(IBinder windowToken) {
+ return mWindowToListeners.get(windowToken);
+ }
+
+ private void removeListeners(IBinder listenerBinder, Optional<Integer> id) {
+ for (int i = mWindowToListeners.size() - 1; i >= 0; i--) {
+ var listeners = mWindowToListeners.valueAt(i);
+ for (int j = listeners.size() - 1; j >= 0; j--) {
+ var listener = listeners.get(j);
+ if (listener.mListener.asBinder() == listenerBinder && (id.isEmpty()
+ || listener.mId == id.get())) {
+ listeners.remove(j);
+ }
+ }
+ if (listeners.isEmpty()) {
+ mWindowToListeners.removeAt(i);
+ }
+ }
+ }
+ }
+
+ private final Object mHandlerThreadLock = new Object();
+ private HandlerThread mHandlerThread;
+ private Handler mHandler;
+
+ private WindowInfosListener mWindowInfosListener;
+
+ Listeners mRegisteredListeners = new Listeners();
+
+ private InputWindowHandle[] mLastWindowHandles;
+
+ private final Object mIgnoredWindowTokensLock = new Object();
+
+ private final ArraySet<IBinder> mIgnoredWindowTokens = new ArraySet<>();
+
+ private void startHandlerThreadIfNeeded() {
+ synchronized (mHandlerThreadLock) {
+ if (mHandler == null) {
+ mHandlerThread = new HandlerThread("WindowInfosListenerForTpl");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+ }
+ }
+ }
+
+ void addIgnoredWindowTokens(IBinder token) {
+ synchronized (mIgnoredWindowTokensLock) {
+ mIgnoredWindowTokens.add(token);
+ }
+ }
+
+ void removeIgnoredWindowTokens(IBinder token) {
+ synchronized (mIgnoredWindowTokensLock) {
+ mIgnoredWindowTokens.remove(token);
+ }
+ }
+
+ void registerListener(IBinder window, ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ startHandlerThreadIfNeeded();
+ mHandler.post(() -> {
+ ProtoLog.d(WM_DEBUG_TPL, "Registering listener=%s with id=%d for window=%s with %s",
+ listener, id, window, thresholds);
+
+ mRegisteredListeners.register(window, listener, thresholds, id);
+ registerWindowInfosListener();
+ // Update the initial state for the new registered listener
+ computeTpl(mLastWindowHandles);
+ });
+ }
+
+ void unregisterListener(ITrustedPresentationListener listener, int id) {
+ startHandlerThreadIfNeeded();
+ mHandler.post(() -> {
+ ProtoLog.d(WM_DEBUG_TPL, "Unregistering listener=%s with id=%d",
+ listener, id);
+
+ mRegisteredListeners.unregister(listener, id);
+ if (mRegisteredListeners.isEmpty()) {
+ unregisterWindowInfosListener();
+ }
+ });
+ }
+
+ void dump(PrintWriter pw) {
+ final String innerPrefix = " ";
+ pw.println("TrustedPresentationListenerController:");
+ pw.println(innerPrefix + "Active unique listeners ("
+ + mRegisteredListeners.mUniqueListeners.size() + "):");
+ for (int i = 0; i < mRegisteredListeners.mWindowToListeners.size(); i++) {
+ pw.println(
+ innerPrefix + " window=" + mRegisteredListeners.mWindowToListeners.keyAt(i));
+ final var listeners = mRegisteredListeners.mWindowToListeners.valueAt(i);
+ for (int j = 0; j < listeners.size(); j++) {
+ final var listener = listeners.get(j);
+ pw.println(innerPrefix + innerPrefix + " listener=" + listener.mListener.asBinder()
+ + " id=" + listener.mId
+ + " thresholds=" + listener.mThresholds);
+ }
+ }
+ }
+
+ private void registerWindowInfosListener() {
+ if (mWindowInfosListener != null) {
+ return;
+ }
+
+ mWindowInfosListener = new WindowInfosListener() {
+ @Override
+ public void onWindowInfosChanged(InputWindowHandle[] windowHandles,
+ DisplayInfo[] displayInfos) {
+ mHandler.post(() -> computeTpl(windowHandles));
+ }
+ };
+ mLastWindowHandles = mWindowInfosListener.register().first;
+ }
+
+ private void unregisterWindowInfosListener() {
+ if (mWindowInfosListener == null) {
+ return;
+ }
+
+ mWindowInfosListener.unregister();
+ mWindowInfosListener = null;
+ mLastWindowHandles = null;
+ }
+
+ private void computeTpl(InputWindowHandle[] windowHandles) {
+ mLastWindowHandles = windowHandles;
+ if (mLastWindowHandles == null || mLastWindowHandles.length == 0
+ || mRegisteredListeners.isEmpty()) {
+ return;
+ }
+
+ Rect tmpRect = new Rect();
+ Matrix tmpInverseMatrix = new Matrix();
+ float[] tmpMatrix = new float[9];
+ Region coveredRegionsAbove = new Region();
+ long currTimeMs = System.currentTimeMillis();
+ ProtoLog.v(WM_DEBUG_TPL, "Checking %d windows", mLastWindowHandles.length);
+
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates =
+ new ArrayMap<>();
+ ArraySet<IBinder> ignoredWindowTokens;
+ synchronized (mIgnoredWindowTokensLock) {
+ ignoredWindowTokens = new ArraySet<>(mIgnoredWindowTokens);
+ }
+ for (var windowHandle : mLastWindowHandles) {
+ if (ignoredWindowTokens.contains(windowHandle.getWindowToken())) {
+ ProtoLog.v(WM_DEBUG_TPL, "Skipping %s", windowHandle.name);
+ continue;
+ }
+ tmpRect.set(windowHandle.frame);
+ var listeners = mRegisteredListeners.get(windowHandle.getWindowToken());
+ if (listeners != null) {
+ Region region = new Region();
+ region.op(tmpRect, coveredRegionsAbove, Region.Op.DIFFERENCE);
+ windowHandle.transform.invert(tmpInverseMatrix);
+ tmpInverseMatrix.getValues(tmpMatrix);
+ float scaleX = (float) Math.sqrt(tmpMatrix[MSCALE_X] * tmpMatrix[MSCALE_X]
+ + tmpMatrix[MSKEW_X] * tmpMatrix[MSKEW_X]);
+ float scaleY = (float) Math.sqrt(tmpMatrix[MSCALE_Y] * tmpMatrix[MSCALE_Y]
+ + tmpMatrix[MSKEW_Y] * tmpMatrix[MSKEW_Y]);
+
+ float fractionRendered = computeFractionRendered(region, new RectF(tmpRect),
+ windowHandle.contentSize,
+ scaleX, scaleY);
+
+ checkIfInThreshold(listeners, listenerUpdates, fractionRendered, windowHandle.alpha,
+ currTimeMs);
+ }
+
+ coveredRegionsAbove.op(tmpRect, Region.Op.UNION);
+ ProtoLog.v(WM_DEBUG_TPL, "coveredRegionsAbove updated with %s frame:%s region:%s",
+ windowHandle.name, tmpRect.toShortString(), coveredRegionsAbove);
+ }
+
+ for (int i = 0; i < listenerUpdates.size(); i++) {
+ var updates = listenerUpdates.valueAt(i);
+ var listener = listenerUpdates.keyAt(i);
+ try {
+ listener.onTrustedPresentationChanged(updates.first.toArray(),
+ updates.second.toArray());
+ } catch (RemoteException ignore) {
+ }
+ }
+ }
+
+ private void addListenerUpdate(
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates,
+ ITrustedPresentationListener listener, int id, boolean presentationState) {
+ var updates = listenerUpdates.get(listener);
+ if (updates == null) {
+ updates = new Pair<>(new IntArray(), new IntArray());
+ listenerUpdates.put(listener, updates);
+ }
+ if (presentationState) {
+ updates.first.add(id);
+ } else {
+ updates.second.add(id);
+ }
+ }
+
+
+ private void checkIfInThreshold(
+ ArrayList<TrustedPresentationInfo> listeners,
+ ArrayMap<ITrustedPresentationListener, Pair<IntArray, IntArray>> listenerUpdates,
+ float fractionRendered, float alpha, long currTimeMs) {
+ ProtoLog.v(WM_DEBUG_TPL, "checkIfInThreshold fractionRendered=%f alpha=%f currTimeMs=%d",
+ fractionRendered, alpha, currTimeMs);
+ for (int i = 0; i < listeners.size(); i++) {
+ var trustedPresentationInfo = listeners.get(i);
+ var listener = trustedPresentationInfo.mListener;
+ boolean lastState = trustedPresentationInfo.mLastComputedTrustedPresentationState;
+ boolean newState =
+ (alpha >= trustedPresentationInfo.mThresholds.mMinAlpha) && (fractionRendered
+ >= trustedPresentationInfo.mThresholds.mMinFractionRendered);
+ trustedPresentationInfo.mLastComputedTrustedPresentationState = newState;
+
+ ProtoLog.v(WM_DEBUG_TPL,
+ "lastState=%s newState=%s alpha=%f minAlpha=%f fractionRendered=%f "
+ + "minFractionRendered=%f",
+ lastState, newState, alpha, trustedPresentationInfo.mThresholds.mMinAlpha,
+ fractionRendered, trustedPresentationInfo.mThresholds.mMinFractionRendered);
+
+ if (lastState && !newState) {
+ // We were in the trusted presentation state, but now we left it,
+ // emit the callback if needed
+ if (trustedPresentationInfo.mLastReportedTrustedPresentationState) {
+ trustedPresentationInfo.mLastReportedTrustedPresentationState = false;
+ addListenerUpdate(listenerUpdates, listener,
+ trustedPresentationInfo.mId, /*presentationState*/ false);
+ ProtoLog.d(WM_DEBUG_TPL, "Adding untrusted state listener=%s with id=%d",
+ listener, trustedPresentationInfo.mId);
+ }
+ // Reset the timer
+ trustedPresentationInfo.mEnteredTrustedPresentationStateTime = -1;
+ } else if (!lastState && newState) {
+ // We were not in the trusted presentation state, but we entered it, begin the timer
+ // and make sure this gets called at least once more!
+ trustedPresentationInfo.mEnteredTrustedPresentationStateTime = currTimeMs;
+ mHandler.postDelayed(() -> {
+ computeTpl(mLastWindowHandles);
+ }, (long) (trustedPresentationInfo.mThresholds.mStabilityRequirementMs * 1.5));
+ }
+
+ // Has the timer elapsed, but we are still in the state? Emit a callback if needed
+ if (!trustedPresentationInfo.mLastReportedTrustedPresentationState && newState && (
+ currTimeMs - trustedPresentationInfo.mEnteredTrustedPresentationStateTime
+ > trustedPresentationInfo.mThresholds.mStabilityRequirementMs)) {
+ trustedPresentationInfo.mLastReportedTrustedPresentationState = true;
+ addListenerUpdate(listenerUpdates, listener,
+ trustedPresentationInfo.mId, /*presentationState*/ true);
+ ProtoLog.d(WM_DEBUG_TPL, "Adding trusted state listener=%s with id=%d",
+ listener, trustedPresentationInfo.mId);
+ }
+ }
+ }
+
+ private float computeFractionRendered(Region visibleRegion, RectF screenBounds,
+ Size contentSize,
+ float sx, float sy) {
+ ProtoLog.v(WM_DEBUG_TPL,
+ "computeFractionRendered: visibleRegion=%s screenBounds=%s contentSize=%s "
+ + "scale=%f,%f",
+ visibleRegion, screenBounds, contentSize, sx, sy);
+
+ if (contentSize.getWidth() == 0 || contentSize.getHeight() == 0) {
+ return -1;
+ }
+ if (screenBounds.width() == 0 || screenBounds.height() == 0) {
+ return -1;
+ }
+
+ float fractionRendered = Math.min(sx * sy, 1.0f);
+ ProtoLog.v(WM_DEBUG_TPL, "fractionRendered scale=%f", fractionRendered);
+
+ float boundsOverSourceW = screenBounds.width() / (float) contentSize.getWidth();
+ float boundsOverSourceH = screenBounds.height() / (float) contentSize.getHeight();
+ fractionRendered *= boundsOverSourceW * boundsOverSourceH;
+ ProtoLog.v(WM_DEBUG_TPL, "fractionRendered boundsOverSource=%f", fractionRendered);
+ // Compute the size of all the rects since they may be disconnected.
+ float[] visibleSize = new float[1];
+ RegionUtils.forEachRect(visibleRegion, rect -> {
+ float size = rect.width() * rect.height();
+ visibleSize[0] += size;
+ });
+
+ fractionRendered *= visibleSize[0] / (screenBounds.width() * screenBounds.height());
+ return fractionRendered;
+ }
+
+ private static class TrustedPresentationInfo {
+ boolean mLastComputedTrustedPresentationState = false;
+ boolean mLastReportedTrustedPresentationState = false;
+ long mEnteredTrustedPresentationStateTime = -1;
+ final TrustedPresentationThresholds mThresholds;
+
+ final ITrustedPresentationListener mListener;
+ final int mId;
+
+ private TrustedPresentationInfo(TrustedPresentationThresholds thresholds, int id,
+ ITrustedPresentationListener listener) {
+ mThresholds = thresholds;
+ mId = id;
+ mListener = listener;
+ checkValid(thresholds);
+ }
+
+ private void checkValid(TrustedPresentationThresholds thresholds) {
+ if (thresholds.mMinAlpha <= 0 || thresholds.mMinFractionRendered <= 0
+ || thresholds.mStabilityRequirementMs < 1) {
+ throw new IllegalArgumentException(
+ "TrustedPresentationThresholds values are invalid");
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index ae171a0..808a11d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -993,4 +993,18 @@
* @param displayId the id of display to check if there is a software navigation bar.
*/
public abstract boolean hasNavigationBar(int displayId);
+
+ /**
+ * Controls whether the app-requested screen orientation is always respected.
+ *
+ * @param respected If {@code true}, the app requested orientation is always respected.
+ * Otherwise, the system might ignore the request due to
+ * {@link com.android.server.wm.DisplayArea#getIgnoreOrientationRequest}.
+ * @param fromOrientations The orientations we want to map to the correspondent orientations
+ * in toOrientation.
+ * @param toOrientations The orientations we map to the ones in fromOrientations at the same
+ * index
+ */
+ public abstract void setOrientationRequestPolicy(boolean respected,
+ int[] fromOrientations, int[] toOrientations);
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index dd2b48b..0c57036 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -303,9 +303,11 @@
import android.window.ClientWindowFrames;
import android.window.ISurfaceSyncGroupCompletedListener;
import android.window.ITaskFpsCallback;
+import android.window.ITrustedPresentationListener;
import android.window.ScreenCapture;
import android.window.SystemPerformanceHinter;
import android.window.TaskSnapshot;
+import android.window.TrustedPresentationThresholds;
import android.window.WindowContainerToken;
import android.window.WindowContextInfo;
@@ -764,6 +766,9 @@
private final SurfaceSyncGroupController mSurfaceSyncGroupController =
new SurfaceSyncGroupController();
+ final TrustedPresentationListenerController mTrustedPresentationListenerController =
+ new TrustedPresentationListenerController();
+
@VisibleForTesting
final class SettingsObserver extends ContentObserver {
private final Uri mDisplayInversionEnabledUri =
@@ -7171,6 +7176,7 @@
pw.println(separator);
}
mSystemPerformanceHinter.dump(pw, "");
+ mTrustedPresentationListenerController.dump(pw);
}
}
@@ -8523,6 +8529,15 @@
mImeTargetChangeListener = listener;
}
}
+
+ @Override
+ public void setOrientationRequestPolicy(boolean respected,
+ int[] fromOrientations, int[] toOrientations) {
+ synchronized (mGlobalLock) {
+ WindowManagerService.this.setOrientationRequestPolicy(respected,
+ fromOrientations, toOrientations);
+ }
+ }
}
private final class ImeTargetVisibilityPolicyImpl extends ImeTargetVisibilityPolicy {
@@ -9762,4 +9777,17 @@
Binder.restoreCallingIdentity(origId);
}
}
+
+ @Override
+ public void registerTrustedPresentationListener(IBinder window,
+ ITrustedPresentationListener listener,
+ TrustedPresentationThresholds thresholds, int id) {
+ mTrustedPresentationListenerController.registerListener(window, listener, thresholds, id);
+ }
+
+ @Override
+ public void unregisterTrustedPresentationListener(ITrustedPresentationListener listener,
+ int id) {
+ mTrustedPresentationListenerController.unregisterListener(listener, id);
+ }
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 2af6569..a872fd0 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -570,8 +570,10 @@
mService.deferWindowLayout();
mService.mTaskSupervisor.setDeferRootVisibilityUpdate(true /* deferUpdate */);
try {
- if (transition != null) {
- transition.applyDisplayChangeIfNeeded();
+ final ArrayList<ActivityRecord> activitiesMayChange =
+ transition != null ? transition.applyDisplayChangeIfNeeded() : null;
+ if (activitiesMayChange != null) {
+ effects |= TRANSACT_EFFECTS_CLIENT_CONFIG;
}
final List<WindowContainerTransaction.HierarchyOp> hops = t.getHierarchyOps();
final int hopSize = hops.size();
@@ -695,8 +697,23 @@
for (int i = haveConfigChanges.size() - 1; i >= 0; --i) {
haveConfigChanges.valueAt(i).forAllActivities(r -> {
r.ensureActivityConfiguration(0, PRESERVE_WINDOWS);
+ if (activitiesMayChange != null) {
+ activitiesMayChange.remove(r);
+ }
});
}
+ // TODO(b/258618073): Combine with haveConfigChanges after confirming that there
+ // is no problem to always preserve window. Currently this uses the parameters
+ // as ATMS#ensureConfigAndVisibilityAfterUpdate.
+ if (activitiesMayChange != null) {
+ for (int i = activitiesMayChange.size() - 1; i >= 0; --i) {
+ final ActivityRecord ar = activitiesMayChange.get(i);
+ if (!ar.isVisibleRequested()) continue;
+ ar.ensureActivityConfiguration(0 /* globalChanges */,
+ !PRESERVE_WINDOWS, true /* ignoreVisibility */,
+ false /* isRequestedOrientationChanged */);
+ }
+ }
}
if (effects != 0) {
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index e1f1f66..7bc7e2c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1189,6 +1189,11 @@
ProtoLog.v(WM_DEBUG_ADD_REMOVE, "Adding %s to %s", this, parentWindow);
parentWindow.addChild(this, sWindowSubLayerComparator);
}
+
+ if (token.mRoundedCornerOverlay) {
+ mWmService.mTrustedPresentationListenerController.addIgnoredWindowTokens(
+ getWindowToken());
+ }
}
@Override
@@ -2393,6 +2398,9 @@
}
mWmService.postWindowRemoveCleanupLocked(this);
+
+ mWmService.mTrustedPresentationListenerController.removeIgnoredWindowTokens(
+ getWindowToken());
}
@Override
diff --git a/services/core/jni/com_android_server_hint_HintManagerService.cpp b/services/core/jni/com_android_server_hint_HintManagerService.cpp
index 7edf445..ccd9bd0 100644
--- a/services/core/jni/com_android_server_hint_HintManagerService.cpp
+++ b/services/core/jni/com_android_server_hint_HintManagerService.cpp
@@ -20,6 +20,7 @@
#include <aidl/android/hardware/power/IPower.h>
#include <android-base/stringprintf.h>
+#include <inttypes.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedPrimitiveArray.h>
#include <powermanager/PowerHalController.h>
@@ -38,6 +39,15 @@
namespace android {
+static struct {
+ jclass clazz{};
+ jfieldID workPeriodStartTimestampNanos{};
+ jfieldID actualTotalDurationNanos{};
+ jfieldID actualCpuDurationNanos{};
+ jfieldID actualGpuDurationNanos{};
+ jfieldID timestampNanos{};
+} gWorkDurationInfo;
+
static power::PowerHalController gPowerHalController;
static std::unordered_map<jlong, std::shared_ptr<IPowerHintSession>> gSessionMap;
static std::mutex gSessionMapLock;
@@ -180,6 +190,26 @@
setMode(session_ptr, static_cast<SessionMode>(mode), enabled);
}
+static void nativeReportActualWorkDuration2(JNIEnv* env, jclass /* clazz */, jlong session_ptr,
+ jobjectArray jWorkDurations) {
+ int size = env->GetArrayLength(jWorkDurations);
+ std::vector<WorkDuration> workDurations(size);
+ for (int i = 0; i < size; i++) {
+ jobject workDuration = env->GetObjectArrayElement(jWorkDurations, i);
+ workDurations[i].workPeriodStartTimestampNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.workPeriodStartTimestampNanos);
+ workDurations[i].durationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualTotalDurationNanos);
+ workDurations[i].cpuDurationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualCpuDurationNanos);
+ workDurations[i].gpuDurationNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.actualGpuDurationNanos);
+ workDurations[i].timeStampNanos =
+ env->GetLongField(workDuration, gWorkDurationInfo.timestampNanos);
+ }
+ reportActualWorkDuration(session_ptr, workDurations);
+}
+
// ----------------------------------------------------------------------------
static const JNINativeMethod sHintManagerServiceMethods[] = {
/* name, signature, funcPtr */
@@ -194,9 +224,23 @@
{"nativeSendHint", "(JI)V", (void*)nativeSendHint},
{"nativeSetThreads", "(J[I)V", (void*)nativeSetThreads},
{"nativeSetMode", "(JIZ)V", (void*)nativeSetMode},
+ {"nativeReportActualWorkDuration", "(J[Landroid/os/WorkDuration;)V",
+ (void*)nativeReportActualWorkDuration2},
};
int register_android_server_HintManagerService(JNIEnv* env) {
+ gWorkDurationInfo.clazz = env->FindClass("android/os/WorkDuration");
+ gWorkDurationInfo.workPeriodStartTimestampNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mWorkPeriodStartTimestampNanos", "J");
+ gWorkDurationInfo.actualTotalDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualTotalDurationNanos", "J");
+ gWorkDurationInfo.actualCpuDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualCpuDurationNanos", "J");
+ gWorkDurationInfo.actualGpuDurationNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mActualGpuDurationNanos", "J");
+ gWorkDurationInfo.timestampNanos =
+ env->GetFieldID(gWorkDurationInfo.clazz, "mTimestampNanos", "J");
+
return jniRegisterNativeMethods(env,
"com/android/server/power/hint/"
"HintManagerService$NativeWrapper",
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 1919eb3..59e95e7 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -268,6 +268,8 @@
"com.android.server.backup.BackupManagerService$Lifecycle";
private static final String APPWIDGET_SERVICE_CLASS =
"com.android.server.appwidget.AppWidgetService";
+ private static final String ARC_PERSISTENT_DATA_BLOCK_SERVICE_CLASS =
+ "com.android.server.arc.persistent_data_block.ArcPersistentDataBlockService";
private static final String ARC_SYSTEM_HEALTH_SERVICE =
"com.android.server.arc.health.ArcSystemHealthService";
private static final String VOICE_RECOGNITION_MANAGER_SERVICE_CLASS =
@@ -1489,8 +1491,6 @@
boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
false);
- boolean isEmulator = SystemProperties.get("ro.boot.qemu").equals("1");
-
boolean isWatch = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WATCH);
@@ -1892,6 +1892,12 @@
t.traceEnd();
}
+ if (Build.IS_ARC && SystemProperties.getInt("ro.boot.dev_mode", 0) == 1) {
+ t.traceBegin("StartArcPersistentDataBlock");
+ mSystemServiceManager.startService(ARC_PERSISTENT_DATA_BLOCK_SERVICE_CLASS);
+ t.traceEnd();
+ }
+
t.traceBegin("StartTestHarnessMode");
mSystemServiceManager.startService(TestHarnessModeService.class);
t.traceEnd();
@@ -2318,7 +2324,7 @@
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|| mPackageManager.hasSystemFeature(
PackageManager.FEATURE_USB_ACCESSORY)
- || isEmulator) {
+ || Build.IS_EMULATOR) {
// Manage USB host and device support
t.traceBegin("StartUsbService");
mSystemServiceManager.startService(USB_SERVICE_CLASS);
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
index afbe352..e5be4d9 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/UserDataPreparerTest.java
@@ -21,6 +21,8 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -56,6 +58,7 @@
private static final int TEST_USER_SERIAL = 1000;
private static final int TEST_USER_ID = 10;
+ private static final UserInfo TEST_USER = new UserInfo();
private TestUserDataPreparer mUserDataPreparer;
@@ -72,6 +75,8 @@
@Before
public void setup() {
+ TEST_USER.id = TEST_USER_ID;
+ TEST_USER.serialNumber = TEST_USER_SERIAL;
Context ctx = InstrumentationRegistry.getContext();
FileUtils.deleteContents(ctx.getCacheDir());
mInstallLock = new Object();
@@ -92,8 +97,7 @@
userDeDir.mkdirs();
File systemDeDir = mUserDataPreparer.getDataSystemDeDirectory(TEST_USER_ID);
systemDeDir.mkdirs();
- mUserDataPreparer
- .prepareUserData(TEST_USER_ID, TEST_USER_SERIAL, StorageManager.FLAG_STORAGE_DE);
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_DE);
verify(mStorageManagerMock).prepareUserStorage(isNull(String.class), eq(TEST_USER_ID),
eq(TEST_USER_SERIAL), eq(StorageManager.FLAG_STORAGE_DE));
verify(mInstaller).createUserData(isNull(String.class), eq(TEST_USER_ID),
@@ -110,8 +114,7 @@
userCeDir.mkdirs();
File systemCeDir = mUserDataPreparer.getDataSystemCeDirectory(TEST_USER_ID);
systemCeDir.mkdirs();
- mUserDataPreparer
- .prepareUserData(TEST_USER_ID, TEST_USER_SERIAL, StorageManager.FLAG_STORAGE_CE);
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
verify(mStorageManagerMock).prepareUserStorage(isNull(String.class), eq(TEST_USER_ID),
eq(TEST_USER_SERIAL), eq(StorageManager.FLAG_STORAGE_CE));
verify(mInstaller).createUserData(isNull(String.class), eq(TEST_USER_ID),
@@ -123,6 +126,28 @@
}
@Test
+ public void testPrepareUserData_forNewUser_destroysOnFailure() throws Exception {
+ TEST_USER.lastLoggedInTime = 0;
+ doThrow(new IllegalStateException("expected exception for test")).when(mStorageManagerMock)
+ .prepareUserStorage(isNull(String.class), eq(TEST_USER_ID), eq(TEST_USER_SERIAL),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
+ verify(mStorageManagerMock).destroyUserStorage(isNull(String.class), eq(TEST_USER_ID),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ }
+
+ @Test
+ public void testPrepareUserData_forExistingUser_doesNotDestroyOnFailure() throws Exception {
+ TEST_USER.lastLoggedInTime = System.currentTimeMillis();
+ doThrow(new IllegalStateException("expected exception for test")).when(mStorageManagerMock)
+ .prepareUserStorage(isNull(String.class), eq(TEST_USER_ID), eq(TEST_USER_SERIAL),
+ eq(StorageManager.FLAG_STORAGE_CE));
+ mUserDataPreparer.prepareUserData(TEST_USER, StorageManager.FLAG_STORAGE_CE);
+ verify(mStorageManagerMock, never()).destroyUserStorage(isNull(String.class),
+ eq(TEST_USER_ID), eq(StorageManager.FLAG_STORAGE_CE));
+ }
+
+ @Test
public void testDestroyUserData_De_DoesNotDestroyCe() throws Exception {
// Add file in CE storage
File systemCeDir = mUserDataPreparer.getDataSystemCeDirectory(TEST_USER_ID);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
index 693cafe..acd9dce 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
@@ -727,6 +727,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_FAST_HDR_TRANSITIONS)
public void testDisplayBrightnessHdr_SkipAnimationOnHdrAppearance() {
Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
@@ -762,6 +763,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_FAST_HDR_TRANSITIONS)
public void testDisplayBrightnessHdr_SkipAnimationOnHdrRemoval() {
Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index b227993..50b0e16 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -1202,6 +1202,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_FAST_HDR_TRANSITIONS)
public void testDisplayBrightnessHdr_SkipAnimationOnHdrAppearance() {
Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
@@ -1236,6 +1237,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_FAST_HDR_TRANSITIONS)
public void testDisplayBrightnessHdr_SkipAnimationOnHdrRemoval() {
Settings.System.putInt(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
index 3f72364..bf2edfe 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/BaseModeRefreshRateVoteTest.kt
@@ -18,7 +18,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -41,7 +40,7 @@
@Test
fun `updates summary with base mode refresh rate if not set`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
baseModeVote.updateSummary(summary)
@@ -50,7 +49,7 @@
@Test
fun `keeps summary base mode refresh rate if set`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.appRequestBaseModeRefreshRate = OTHER_BASE_REFRESH_RATE
baseModeVote.updateSummary(summary)
@@ -61,7 +60,7 @@
@Test
fun `keeps summary with base mode refresh rate if vote refresh rate is negative`() {
val invalidBaseModeVote = BaseModeRefreshRateVote(-10f)
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
invalidBaseModeVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
index 7f8da88..209e5a3 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/CombinedVoteTest.kt
@@ -18,7 +18,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -47,7 +46,7 @@
@Test
fun `delegates update to children`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
combinedVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
index c624325..38782c2 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisableRefreshRateSwitchingVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameter
import com.google.testing.junit.testparameterinjector.TestParameterInjector
@@ -32,7 +31,7 @@
fun `disabled refresh rate switching is not changed`(
@TestParameter voteDisableSwitching: Boolean
) {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.disableRefreshRateSwitching = true
val vote = DisableRefreshRateSwitchingVote(voteDisableSwitching)
@@ -43,7 +42,7 @@
@Test
fun `disables refresh rate switching if requested`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
val vote = DisableRefreshRateSwitchingVote(true)
vote.updateSummary(summary)
@@ -53,7 +52,7 @@
@Test
fun `does not disable refresh rate switching if not requested`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
val vote = DisableRefreshRateSwitchingVote(false)
vote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
index 547008e..9edcc32 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/PhysicalVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameterInjector
import org.junit.Before
@@ -39,7 +38,7 @@
@Test
fun `updates minPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 45f
physicalVote.updateSummary(summary)
@@ -49,7 +48,7 @@
@Test
fun `does not update minPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 75f
physicalVote.updateSummary(summary)
@@ -59,7 +58,7 @@
@Test
fun `updates maxPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxPhysicalRefreshRate = 120f
physicalVote.updateSummary(summary)
@@ -69,7 +68,7 @@
@Test
fun `does not update maxPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxPhysicalRefreshRate = 75f
physicalVote.updateSummary(summary)
@@ -79,7 +78,7 @@
@Test
fun `updates maxRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 120f
physicalVote.updateSummary(summary)
@@ -89,7 +88,7 @@
@Test
fun `does not update maxRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 75f
physicalVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
index 868a893..2d65f1c 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/RenderVoteTest.kt
@@ -17,7 +17,6 @@
package com.android.server.display.mode
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import com.google.testing.junit.testparameterinjector.TestParameterInjector
import org.junit.Before
@@ -40,7 +39,7 @@
@Test
fun `updates minRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minRenderFrameRate = 45f
renderVote.updateSummary(summary)
@@ -50,7 +49,7 @@
@Test
fun `does not update minRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minRenderFrameRate = 75f
renderVote.updateSummary(summary)
@@ -60,7 +59,7 @@
@Test
fun `updates maxRenderFrameRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 120f
renderVote.updateSummary(summary)
@@ -70,7 +69,7 @@
@Test
fun `does not update maxRenderFrameRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.maxRenderFrameRate = 75f
renderVote.updateSummary(summary)
@@ -80,7 +79,7 @@
@Test
fun `updates minPhysicalRefreshRate if summary has less`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 45f
renderVote.updateSummary(summary)
@@ -90,7 +89,7 @@
@Test
fun `does not update minPhysicalRefreshRate if summary has more`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.minPhysicalRefreshRate = 75f
renderVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
index 1c631b0..1be2fbf 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SizeVoteTest.kt
@@ -18,7 +18,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -41,7 +40,7 @@
@Test
fun `updates size if width and height not set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = Vote.INVALID_SIZE
summary.height = Vote.INVALID_SIZE
summary.minWidth = 100
@@ -57,7 +56,7 @@
@Test
fun `does not update size if width set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = 150
summary.height = Vote.INVALID_SIZE
summary.minWidth = 100
@@ -73,7 +72,7 @@
@Test
fun `does not update size if height set and display resolution voting disabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ false)
+ val summary = createVotesSummary(isDisplayResolutionRangeVotingEnabled = false)
summary.width = Vote.INVALID_SIZE
summary.height = 250
summary.minWidth = 100
@@ -89,7 +88,7 @@
@Test
fun `updates width if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 850
sizeVote.updateSummary(summary)
@@ -99,7 +98,7 @@
@Test
fun `does not update width if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 750
sizeVote.updateSummary(summary)
@@ -109,7 +108,7 @@
@Test
fun `updates height if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.height = 1650
sizeVote.updateSummary(summary)
@@ -119,7 +118,7 @@
@Test
fun `does not update height if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.height = 1550
sizeVote.updateSummary(summary)
@@ -129,7 +128,7 @@
@Test
fun `updates minWidth if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minWidth = 350
@@ -140,7 +139,7 @@
@Test
fun `does not update minWidth if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minWidth = 450
@@ -151,7 +150,7 @@
@Test
fun `updates minHeight if summary has less and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minHeight = 1150
@@ -162,7 +161,7 @@
@Test
fun `does not update minHeight if summary has more and display resolution voting enabled`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.width = 150
summary.minHeight = 1250
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
index cc88003..04e6265 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SupportedModesVoteTest.kt
@@ -18,7 +18,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
-import com.android.server.display.mode.DisplayModeDirector.VoteSummary
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -44,7 +43,7 @@
@Test
fun `adds supported modes if supportedModes in summary is null`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
supportedModesVote.updateSummary(summary)
@@ -53,7 +52,7 @@
@Test
fun `does not add supported modes if summary has empty list of modes`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.supportedModes = ArrayList()
supportedModesVote.updateSummary(summary)
@@ -63,7 +62,7 @@
@Test
fun `filters out modes that does not match vote`() {
- val summary = VoteSummary(/* isDisplayResolutionRangeVotingEnabled= */ true)
+ val summary = createVotesSummary()
summary.supportedModes = ArrayList(listOf(otherMode, supportedModes[0]))
supportedModesVote.updateSummary(summary)
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt
new file mode 100644
index 0000000..910e03c
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/TestUtils.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.mode
+
+internal fun createVotesSummary(
+ isDisplayResolutionRangeVotingEnabled: Boolean = true,
+ vsyncProximityVoteEnabled: Boolean = true,
+ loggingEnabled: Boolean = true,
+ supportsFrameRateOverride: Boolean = true
+): VoteSummary {
+ return VoteSummary(isDisplayResolutionRangeVotingEnabled, vsyncProximityVoteEnabled,
+ loggingEnabled, supportsFrameRateOverride)
+}
\ No newline at end of file
diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
new file mode 100644
index 0000000..d6c8469
--- /dev/null
+++ b/services/tests/displayservicetests/src/com/android/server/display/mode/VoteSummaryTest.kt
@@ -0,0 +1,107 @@
+/*
+ * 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.display.mode
+
+import android.view.Display
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import com.google.testing.junit.testparameterinjector.TestParameter
+import com.google.testing.junit.testparameterinjector.TestParameterInjector
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(TestParameterInjector::class)
+class VoteSummaryTest {
+
+ enum class SupportedModesVoteTestCase(
+ val vsyncProximityVoteEnabled: Boolean,
+ internal val summarySupportedModes: List<SupportedModesVote.SupportedMode>?,
+ val modesToFilter: Array<Display.Mode>,
+ val expectedModeIds: List<Int>
+ ) {
+ HAS_NO_MATCHING_VOTE(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 60f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf()
+ ),
+ HAS_SINGLE_MATCHING_VOTE(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 90f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(3)
+ ),
+ HAS_MULTIPLE_MATCHING_VOTES(true,
+ listOf(SupportedModesVote.SupportedMode(60f, 90f),
+ SupportedModesVote.SupportedMode(90f, 90f)),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 3)
+ ),
+ HAS_NO_SUPPORTED_MODES(true,
+ listOf(),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf()
+ ),
+ HAS_NULL_SUPPORTED_MODES(true,
+ null,
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 2, 3)
+ ),
+ HAS_VSYNC_PROXIMITY_DISABLED(false,
+ listOf(),
+ arrayOf(createMode(1, 90f, 90f),
+ createMode(2, 90f, 60f),
+ createMode(3, 60f, 90f)),
+ listOf(1, 2, 3)
+ ),
+ }
+
+ @Test
+ fun `filters modes for summary supportedModes`(
+ @TestParameter testCase: SupportedModesVoteTestCase
+ ) {
+ val summary = createSummary(testCase.vsyncProximityVoteEnabled)
+ summary.supportedModes = testCase.summarySupportedModes
+
+ val result = summary.filterModes(testCase.modesToFilter)
+
+ assertThat(result.map { it.modeId }).containsExactlyElementsIn(testCase.expectedModeIds)
+ }
+}
+private fun createMode(modeId: Int, refreshRate: Float, vsyncRate: Float): Display.Mode {
+ return Display.Mode(modeId, 600, 800, refreshRate, vsyncRate,
+ FloatArray(0), IntArray(0))
+}
+
+private fun createSummary(vsyncVoteEnabled: Boolean): VoteSummary {
+ val summary = createVotesSummary(vsyncProximityVoteEnabled = vsyncVoteEnabled)
+ summary.width = 600
+ summary.height = 800
+ summary.maxPhysicalRefreshRate = Float.POSITIVE_INFINITY
+ summary.maxRenderFrameRate = Float.POSITIVE_INFINITY
+
+ return summary
+}
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index 21e3b34..b39cd04 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -3397,6 +3397,8 @@
bOptions.getTemporaryAppAllowlistType());
assertEquals(PowerExemptionManager.REASON_TIMEZONE_CHANGED,
bOptions.getTemporaryAppAllowlistReasonCode());
+ assertEquals(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT,
+ bOptions.getDeliveryGroupPolicy());
}
@Test
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java
index 72dc725..4ba9d60 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
@@ -44,6 +43,9 @@
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.internal.util.FrameworkStatsLog;
+import com.android.modules.utils.testing.ExtendedMockitoRule;
import com.android.server.AlarmManagerInternal;
import com.android.server.DropBoxManagerInternal;
import com.android.server.LocalServices;
@@ -85,6 +87,12 @@
public final ApplicationExitInfoTest.ServiceThreadRule
mServiceThreadRule = new ApplicationExitInfoTest.ServiceThreadRule();
+ @Rule
+ public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
+ .spyStatic(FrameworkStatsLog.class)
+ .spyStatic(ProcessList.class)
+ .build();
+
@Mock
AppOpsService mAppOpsService;
@Mock
@@ -140,6 +148,7 @@
realAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper());
realAms.mAtmInternal = spy(realAms.mActivityTaskManager.getAtmInternal());
realAms.mOomAdjuster = spy(realAms.mOomAdjuster);
+ ExtendedMockito.doNothing().when(() -> ProcessList.setOomAdj(anyInt(), anyInt(), anyInt()));
realAms.mPackageManagerInt = mPackageManagerInt;
realAms.mUsageStatsService = mUsageStatsManagerInt;
realAms.mProcessesReady = true;
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
index 2378416..c03799d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java
@@ -79,11 +79,9 @@
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.util.FrameworkStatsLog;
-import com.android.modules.utils.testing.ExtendedMockitoRule;
import org.junit.After;
import org.junit.Before;
-import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
@@ -112,11 +110,6 @@
BroadcastProcessQueue mHead;
- @Rule
- public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
- .spyStatic(FrameworkStatsLog.class)
- .build();
-
@Before
public void setUp() throws Exception {
super.setUp();
diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
index 3364545..918bc5d 100644
--- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java
@@ -1665,7 +1665,8 @@
enqueueBroadcast(makeBroadcastRecord(airplane, callerApp,
List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_RED))));
enqueueBroadcast(makeOrderedBroadcastRecord(timezoneSecond, callerApp,
- List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
+ List.of(makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
+ makeManifestReceiver(PACKAGE_BLUE, CLASS_GREEN)),
resultToSecond, null));
waitForIdle();
@@ -1681,6 +1682,11 @@
anyInt(), anyInt(), any());
// We deliver second broadcast to app
+ timezoneSecond.setClassName(PACKAGE_BLUE, CLASS_BLUE);
+ inOrder.verify(blueThread).scheduleReceiver(
+ argThat(filterAndExtrasEquals(timezoneSecond)), any(), any(),
+ anyInt(), any(), any(), eq(true), eq(false), anyInt(),
+ anyInt(), anyInt(), any());
timezoneSecond.setClassName(PACKAGE_BLUE, CLASS_GREEN);
inOrder.verify(blueThread).scheduleReceiver(
argThat(filterAndExtrasEquals(timezoneSecond)), any(), any(),
@@ -1797,9 +1803,15 @@
waitForIdle();
- verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
- verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
- verifyScheduleRegisteredReceiver(never(), receiverYellowApp, airplane);
+ if (mImpl == Impl.MODERN) {
+ verifyScheduleRegisteredReceiver(times(2), receiverGreenApp, airplane);
+ verifyScheduleRegisteredReceiver(times(2), receiverBlueApp, airplane);
+ verifyScheduleRegisteredReceiver(times(1), receiverYellowApp, airplane);
+ } else {
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
+ verifyScheduleRegisteredReceiver(never(), receiverYellowApp, airplane);
+ }
}
@Test
@@ -1830,6 +1842,39 @@
}
@Test
+ public void testReplacePending_existingDiffReceivers() throws Exception {
+ final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
+ final ProcessRecord receiverGreenApp = makeActiveProcessRecord(PACKAGE_GREEN);
+ final ProcessRecord receiverBlueApp = makeActiveProcessRecord(PACKAGE_BLUE);
+ final BroadcastFilter receiverGreen = makeRegisteredReceiver(receiverGreenApp);
+ final BroadcastFilter receiverBlue = makeRegisteredReceiver(receiverBlueApp);
+
+ final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
+ .addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ final Intent timeTick = new Intent(Intent.ACTION_TIME_TICK);
+
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverGreen, 5))));
+ enqueueBroadcast(makeBroadcastRecord(timeTick, callerApp, List.of(
+ withPriority(receiverGreen, 10),
+ withPriority(receiverBlue, 5))));
+ enqueueBroadcast(makeBroadcastRecord(airplane, callerApp, List.of(
+ withPriority(receiverBlue, 10),
+ withPriority(receiverGreen, 5))));
+
+ waitForIdle();
+
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, timeTick);
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, timeTick);
+ if (mImpl == Impl.MODERN) {
+ verifyScheduleRegisteredReceiver(times(2), receiverGreenApp, airplane);
+ } else {
+ verifyScheduleRegisteredReceiver(times(1), receiverGreenApp, airplane);
+ }
+ verifyScheduleRegisteredReceiver(times(1), receiverBlueApp, airplane);
+ }
+
+ @Test
public void testIdleAndBarrier() throws Exception {
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
final ProcessRecord receiverApp = makeActiveProcessRecord(PACKAGE_GREEN);
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 646f486..79b39b8 100644
--- a/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/appop/AppOpsServiceTest.java
@@ -20,7 +20,9 @@
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_DEVICE_IDENTIFIERS;
import static android.app.AppOpsManager.OP_READ_SMS;
+import static android.app.AppOpsManager.OP_TAKE_AUDIO_FOCUS;
import static android.app.AppOpsManager.OP_WIFI_SCAN;
import static android.app.AppOpsManager.OP_WRITE_SMS;
import static android.os.UserHandle.getAppId;
@@ -49,8 +51,10 @@
import android.app.AppOpsManager;
import android.app.AppOpsManager.OpEntry;
import android.app.AppOpsManager.PackageOps;
+import android.app.SyncNotedAppOp;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.Handler;
import android.os.HandlerThread;
@@ -58,6 +62,7 @@
import android.permission.PermissionManager;
import android.provider.Settings;
import android.util.ArrayMap;
+import android.util.Log;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
@@ -79,7 +84,6 @@
import org.mockito.quality.Strictness;
import java.io.File;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -99,12 +103,15 @@
private static final Context sContext = InstrumentationRegistry.getTargetContext();
private static final String sMyPackageName = sContext.getOpPackageName();
+ private static final String sSdkSandboxPackageName = sContext.getPackageManager()
+ .getSdkSandboxPackageName();
private File mStorageFile;
private File mRecentAccessesFile;
private Handler mHandler;
private AppOpsService mAppOpsService;
private int mMyUid;
+ private int mSdkSandboxPackageUid;
private long mTestStartMillis;
private StaticMockitoSession mMockingSession;
@@ -132,6 +139,7 @@
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mMyUid = Process.myUid();
+ mSdkSandboxPackageUid = resolveSdkSandboxPackageUid();
initializeStaticMocks();
@@ -152,6 +160,39 @@
mMockingSession.finishMocking();
}
+ private static int resolveSdkSandboxPackageUid() {
+ try {
+ return sContext.getPackageManager().getPackageUid(
+ sSdkSandboxPackageName,
+ PackageManager.PackageInfoFlags.of(0)
+ );
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Can't resolve sandbox package uid", e);
+ return Process.INVALID_UID;
+ }
+ }
+
+ private static void mockGetPackage(
+ PackageManagerInternal managerMock,
+ String packageName
+ ) {
+ AndroidPackage packageMock = mock(AndroidPackage.class);
+ when(managerMock.getPackage(packageName)).thenReturn(packageMock);
+ }
+
+ private static void mockGetPackageStateInternal(
+ PackageManagerInternal managerMock,
+ String packageName,
+ int uid
+ ) {
+ PackageStateInternal packageStateInternalMock = mock(PackageStateInternal.class);
+ when(packageStateInternalMock.isPrivileged()).thenReturn(false);
+ when(packageStateInternalMock.getAppId()).thenReturn(uid);
+ when(packageStateInternalMock.getAndroidPackage()).thenReturn(mock(AndroidPackage.class));
+ when(managerMock.getPackageStateInternal(packageName))
+ .thenReturn(packageStateInternalMock);
+ }
+
private void initializeStaticMocks() {
mMockingSession = mockitoSession()
.strictness(Strictness.LENIENT)
@@ -163,16 +204,11 @@
// Mock LocalServices.getService(PackageManagerInternal.class).getPackageStateInternal
// and getPackage dependency needed by AppOpsService
PackageManagerInternal mockPackageManagerInternal = mock(PackageManagerInternal.class);
- AndroidPackage mockMyPkg = mock(AndroidPackage.class);
- when(mockMyPkg.getAttributions()).thenReturn(Collections.emptyList());
- PackageStateInternal mockMyPSInternal = mock(PackageStateInternal.class);
- when(mockMyPSInternal.isPrivileged()).thenReturn(false);
- when(mockMyPSInternal.getAppId()).thenReturn(mMyUid);
- when(mockMyPSInternal.getAndroidPackage()).thenReturn(mockMyPkg);
-
- when(mockPackageManagerInternal.getPackageStateInternal(sMyPackageName))
- .thenReturn(mockMyPSInternal);
- when(mockPackageManagerInternal.getPackage(sMyPackageName)).thenReturn(mockMyPkg);
+ mockGetPackage(mockPackageManagerInternal, sMyPackageName);
+ mockGetPackageStateInternal(mockPackageManagerInternal, sMyPackageName, mMyUid);
+ mockGetPackage(mockPackageManagerInternal, sSdkSandboxPackageName);
+ mockGetPackageStateInternal(mockPackageManagerInternal, sSdkSandboxPackageName,
+ mSdkSandboxPackageUid);
when(mockPackageManagerInternal.getPackageUid(eq(sMyPackageName), anyLong(),
eq(getUserId(mMyUid)))).thenReturn(mMyUid);
doReturn(mockPackageManagerInternal).when(
@@ -233,6 +269,21 @@
assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED);
}
+ @Test
+ public void testNoteOperationFromSdkSandbox() {
+ int sandboxUid = Process.toSdkSandboxUid(mMyUid);
+
+ // Note an op that's allowed.
+ SyncNotedAppOp allowedResult = mAppOpsService.noteOperation(OP_TAKE_AUDIO_FOCUS, sandboxUid,
+ sSdkSandboxPackageName, null, false, null, false);
+ assertThat(allowedResult.getOpMode()).isEqualTo(MODE_ALLOWED);
+
+ // Note another op that's not allowed.
+ SyncNotedAppOp erroredResult = mAppOpsService.noteOperation(OP_READ_DEVICE_IDENTIFIERS,
+ sandboxUid, sSdkSandboxPackageName, null, false, null, false);
+ assertThat(erroredResult.getOpMode()).isEqualTo(MODE_ERRORED);
+ }
+
/**
* Tests the scenario where an operation's permission is controlled by another operation.
* For example the results of a WIFI_SCAN can be used to infer the location of a user, so the
diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
index c84797f..940469f 100644
--- a/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/backup/restore/PerformUnifiedRestoreTaskTest.java
@@ -53,7 +53,6 @@
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.ArrayDeque;
@@ -75,14 +74,10 @@
private static final String SYSTEM_PACKAGE_NAME = "android";
private static final String NON_SYSTEM_PACKAGE_NAME = "package";
- @Mock
- private BackupDataInput mBackupDataInput;
- @Mock
- private BackupDataOutput mBackupDataOutput;
- @Mock
- private UserBackupManagerService mBackupManagerService;
- @Mock
- private TransportConnection mTransportConnection;
+ @Mock private BackupDataInput mBackupDataInput;
+ @Mock private BackupDataOutput mBackupDataOutput;
+ @Mock private UserBackupManagerService mBackupManagerService;
+ @Mock private TransportConnection mTransportConnection;
private Set<String> mExcludedkeys = new HashSet<>();
private Map<String, String> mBackupData = new HashMap<>();
@@ -93,8 +88,8 @@
private PerformUnifiedRestoreTask mRestoreTask;
@Rule
- public TestableDeviceConfig.TestableDeviceConfigRule
- mDeviceConfigRule = new TestableDeviceConfig.TestableDeviceConfigRule();
+ public TestableDeviceConfig.TestableDeviceConfigRule mDeviceConfigRule =
+ new TestableDeviceConfig.TestableDeviceConfigRule();
private Context mContext;
@@ -107,30 +102,21 @@
mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
mBackupDataSource = new ArrayDeque<>(mBackupData.keySet());
- when(mBackupDataInput.readNextHeader()).then(new Answer<Boolean>() {
- @Override
- public Boolean answer(InvocationOnMock invocation) throws Throwable {
- return !mBackupDataSource.isEmpty();
- }
- });
- when(mBackupDataInput.getKey()).then(new Answer<String>() {
- @Override
- public String answer(InvocationOnMock invocation) throws Throwable {
- return mBackupDataSource.poll();
- }
- });
+ when(mBackupDataInput.readNextHeader())
+ .then((Answer<Boolean>) invocation -> !mBackupDataSource.isEmpty());
+ when(mBackupDataInput.getKey())
+ .then((Answer<String>) invocation -> mBackupDataSource.poll());
when(mBackupDataInput.getDataSize()).thenReturn(0);
mBackupDataDump = new HashSet<>();
ArgumentCaptor<String> keyCaptor = ArgumentCaptor.forClass(String.class);
- when(mBackupDataOutput.writeEntityHeader(keyCaptor.capture(), anyInt())).then(
- new Answer<Void>() {
- @Override
- public Void answer(InvocationOnMock invocation) throws Throwable {
- mBackupDataDump.add(keyCaptor.getValue());
- return null;
- }
- });
+ when(mBackupDataOutput.writeEntityHeader(keyCaptor.capture(), anyInt()))
+ .then(
+ (Answer<Void>)
+ invocation -> {
+ mBackupDataDump.add(keyCaptor.getValue());
+ return null;
+ });
mRestoreTask = new PerformUnifiedRestoreTask(mBackupManagerService, mTransportConnection);
}
@@ -148,8 +134,8 @@
@Test
public void testFilterExcludedKeys() throws Exception {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
mRestoreTask.filterExcludedKeys(PACKAGE_NAME, mBackupDataInput, mBackupDataOutput);
@@ -162,46 +148,45 @@
@Test
public void testGetExcludedKeysForPackage_alwaysReturnsLatestKeys() {
Set<String> firstExcludedKeys = new HashSet<>(Collections.singletonList(EXCLUDED_KEY_1));
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- firstExcludedKeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(firstExcludedKeys);
assertEquals(firstExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
-
- Set<String> secondExcludedKeys = new HashSet<>(Arrays.asList(EXCLUDED_KEY_1,
- EXCLUDED_KEY_2));
- when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME))).thenReturn(
- secondExcludedKeys);
+ Set<String> secondExcludedKeys =
+ new HashSet<>(Arrays.asList(EXCLUDED_KEY_1, EXCLUDED_KEY_2));
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(PACKAGE_NAME)))
+ .thenReturn(secondExcludedKeys);
assertEquals(secondExcludedKeys, mRestoreTask.getExcludedKeysForPackage(PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(NON_SYSTEM_PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(NON_SYSTEM_PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForNonSystemPackageWithNoKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
- Collections.emptySet());
+ when(mBackupManagerService.getExcludedRestoreKeys(any()))
+ .thenReturn(Collections.emptySet());
assertTrue(mRestoreTask.shouldStageBackupData(NON_SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_doNotStageForSystemPackageWithNoKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(any())).thenReturn(
- Collections.emptySet());
+ when(mBackupManagerService.getExcludedRestoreKeys(any()))
+ .thenReturn(Collections.emptySet());
assertFalse(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
@Test
public void testStageBackupData_stageForSystemPackageWithKeysToExclude() {
- when(mBackupManagerService.getExcludedRestoreKeys(eq(SYSTEM_PACKAGE_NAME))).thenReturn(
- mExcludedkeys);
+ when(mBackupManagerService.getExcludedRestoreKeys(eq(SYSTEM_PACKAGE_NAME)))
+ .thenReturn(mExcludedkeys);
assertTrue(mRestoreTask.shouldStageBackupData(SYSTEM_PACKAGE_NAME));
}
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 e5291d3..eaf0ffd 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java
@@ -113,7 +113,7 @@
}
@Before
- public void setUp() {
+ public void setUp() throws Exception {
mMockingSession = mockitoSession()
.initMocks(this)
.strictness(Strictness.LENIENT)
@@ -178,6 +178,7 @@
when(mContext.getSystemService(UiModeManager.class)).thenReturn(mock(UiModeManager.class));
mService = new TestJobSchedulerService(mContext);
+ mService.waitOnAsyncLoadingForTesting();
}
@After
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
index 3ba5d1e..d4ef647 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/BatteryControllerTest.java
@@ -109,6 +109,7 @@
mFlexibilityController =
new FlexibilityController(mJobSchedulerService, mock(PrefetchController.class));
mBatteryController = new BatteryController(mJobSchedulerService, mFlexibilityController);
+ mBatteryController.startTrackingLocked();
verify(mContext).registerReceiver(receiverCaptor.capture(),
ArgumentMatchers.argThat(filter ->
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 0659f7e..4fb9472 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
@@ -23,6 +23,7 @@
import static android.app.job.JobInfo.NETWORK_TYPE_NONE;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
@@ -69,6 +70,8 @@
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobStore;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -268,19 +271,19 @@
@Test
public void testOnConstantsUpdated_PercentsToDropConstraintsInvalidValues() {
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(100L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("testPercentsToDropConstraintsConfig", jb);
- js.enqueueTime = 100L;
- assertEquals(150L,
+ js.enqueueTime = JobSchedulerService.sElapsedRealtimeClock.millis();
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "10,20a,030,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "10,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "50,40,10,40");
- assertEquals(150L,
+ assertEquals(js.enqueueTime + HOUR_IN_MILLIS / 2,
mFlexibilityController.getNextConstraintDropTimeElapsedLocked(js));
}
@@ -368,7 +371,7 @@
@Test
public void testCurPercent() {
- long deadline = 1000;
+ long deadline = 100 * MINUTE_IN_MILLIS;
long nowElapsed;
JobInfo.Builder jb = createJob(0).setOverrideDeadline(deadline);
JobStatus js = createJobStatus("time", jb);
@@ -376,17 +379,17 @@
assertEquals(FROZEN_TIME, mFlexibilityController.getLifeCycleBeginningElapsedLocked(js));
assertEquals(deadline + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, FROZEN_TIME));
- nowElapsed = 600 + FROZEN_TIME;
+ nowElapsed = FROZEN_TIME + 60 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(60, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 1400;
+ nowElapsed = FROZEN_TIME + 130 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(100, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 950 + FROZEN_TIME;
+ nowElapsed = FROZEN_TIME + 95 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(95, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
@@ -394,8 +397,8 @@
nowElapsed = FROZEN_TIME;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
- long delay = 100;
- deadline = 1100;
+ long delay = MINUTE_IN_MILLIS;
+ deadline = 101 * MINUTE_IN_MILLIS;
jb = createJob(0).setOverrideDeadline(deadline).setMinimumLatency(delay);
js = createJobStatus("time", jb);
@@ -404,24 +407,84 @@
assertEquals(deadline + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, FROZEN_TIME + delay));
- nowElapsed = 600 + FROZEN_TIME + delay;
+ nowElapsed = FROZEN_TIME + delay + 60 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(60, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 1400;
+ nowElapsed = FROZEN_TIME + 130 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(100, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
- nowElapsed = 950 + FROZEN_TIME + delay;
+ nowElapsed = FROZEN_TIME + delay + 95 * MINUTE_IN_MILLIS;
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(nowElapsed), ZoneOffset.UTC);
assertEquals(95, mFlexibilityController.getCurPercentOfLifecycleLocked(js, nowElapsed));
}
@Test
+ public void testGetLifeCycleBeginningElapsedLocked_Periodic() {
+ // Periodic with lifecycle
+ JobInfo.Builder jbBasic = createJob(0).setPeriodic(HOUR_IN_MILLIS);
+ JobInfo.Builder jbFlex = createJob(0)
+ .setPeriodic(HOUR_IN_MILLIS, 20 * MINUTE_IN_MILLIS);
+ JobStatus jsBasic =
+ createJobStatus("testGetLifeCycleBeginningElapsedLocked_Periodic", jbBasic);
+ JobStatus jsFlex =
+ createJobStatus("testGetLifeCycleBeginningElapsedLocked_Periodic", jbFlex);
+
+ final long nowElapsed = JobSchedulerService.sElapsedRealtimeClock.millis();
+ // Base case, no start adjustment
+ assertEquals(nowElapsed,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 40 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+
+ // Rescheduled with start adjustment
+ final long adjustmentMs = 4 * MINUTE_IN_MILLIS;
+ jsBasic = new JobStatus(jsBasic,
+ // "True" start is nowElapsed + HOUR_IN_MILLIS
+ nowElapsed + HOUR_IN_MILLIS + adjustmentMs,
+ nowElapsed + 2 * HOUR_IN_MILLIS,
+ 0 /* numFailures */, 0 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+ jsFlex = new JobStatus(jsFlex,
+ // "True" start is nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS
+ nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS + adjustmentMs,
+ nowElapsed + 2 * HOUR_IN_MILLIS,
+ 0 /* numFailures */, 0 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+
+ assertEquals(nowElapsed + HOUR_IN_MILLIS + adjustmentMs / 2,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 2 * HOUR_IN_MILLIS - 20 * MINUTE_IN_MILLIS + adjustmentMs / 2,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+
+ // Rescheduled for failure
+ jsBasic = new JobStatus(jsBasic,
+ nowElapsed + 30 * MINUTE_IN_MILLIS,
+ NO_LATEST_RUNTIME,
+ 1 /* numFailures */, 1 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+ jsFlex = new JobStatus(jsFlex,
+ nowElapsed + 30 * MINUTE_IN_MILLIS,
+ NO_LATEST_RUNTIME,
+ 1 /* numFailures */, 1 /* numSystemStops */,
+ JobSchedulerService.sSystemClock.millis() /* lastSuccessfulRunTime */,
+ 0, 0);
+
+ assertEquals(nowElapsed + 30 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsBasic));
+ assertEquals(nowElapsed + 30 * MINUTE_IN_MILLIS,
+ mFlexibilityController.getLifeCycleBeginningElapsedLocked(jsFlex));
+ }
+
+ @Test
public void testGetLifeCycleBeginningElapsedLocked_Prefetch() {
// prefetch with lifecycle
when(mPrefetchController.getLaunchTimeThresholdMs()).thenReturn(700L);
@@ -480,20 +543,20 @@
@Test
public void testGetLifeCycleEndElapsedLocked_NonPrefetch() {
// deadline
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(1000L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("time", jb);
- assertEquals(1000L + FROZEN_TIME,
+ assertEquals(HOUR_IN_MILLIS + FROZEN_TIME,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, 0));
// no deadline
jb = createJob(0);
js = createJobStatus("time", jb);
- assertEquals(100L + DEFAULT_FALLBACK_FLEXIBILITY_DEADLINE_MS,
+ assertEquals(FROZEN_TIME + DEFAULT_FALLBACK_FLEXIBILITY_DEADLINE_MS,
mFlexibilityController.getLifeCycleEndElapsedLocked(js, 100L));
}
@Test
public void testGetLifeCycleEndElapsedLocked_Rescheduled() {
- JobInfo.Builder jb = createJob(0).setOverrideDeadline(1000L);
+ JobInfo.Builder jb = createJob(0).setOverrideDeadline(HOUR_IN_MILLIS);
JobStatus js = createJobStatus("time", jb);
js = new JobStatus(
js, FROZEN_TIME, NO_LATEST_RUNTIME, /* numFailures */ 2, /* numSystemStops */ 0,
@@ -632,6 +695,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testExceptions_ShortWindow() {
JobInfo.Builder jb = createJob(0);
jb.setMinimumLatency(1);
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 92aa982..8397b877 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
@@ -16,6 +16,8 @@
package com.android.server.job.controllers;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
@@ -261,7 +263,7 @@
public void testMediaBackupExemption_lateConstraint() {
final JobInfo triggerContentJob = new JobInfo.Builder(42, TEST_JOB_COMPONENT)
.addTriggerContentUri(new JobInfo.TriggerContentUri(IMAGES_MEDIA_URI, 0))
- .setOverrideDeadline(12)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.build();
when(mJobSchedulerInternal.getCloudMediaProviderPackage(eq(0))).thenReturn(TEST_PACKAGE);
@@ -869,7 +871,7 @@
public void testWouldBeReadyWithConstraint_RequestedOverrideDeadline() {
final JobInfo jobInfo =
new JobInfo.Builder(101, new ComponentName("foo", "bar"))
- .setOverrideDeadline(300_000)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.build();
final JobStatus job = createJobStatus(jobInfo);
@@ -1025,7 +1027,7 @@
final JobInfo jobInfo =
new JobInfo.Builder(101, new ComponentName("foo", "bar"))
.setRequiresCharging(true)
- .setOverrideDeadline(300_000)
+ .setOverrideDeadline(HOUR_IN_MILLIS)
.addTriggerContentUri(new JobInfo.TriggerContentUri(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
index 4329b6f..1a95d66 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/PrefetchControllerTest.java
@@ -158,6 +158,7 @@
ArgumentCaptor<EstimatedLaunchTimeChangedListener> eltListenerCaptor =
ArgumentCaptor.forClass(EstimatedLaunchTimeChangedListener.class);
mPrefetchController = new PrefetchController(mJobSchedulerService);
+ mPrefetchController.startTrackingLocked();
mPcConstants = mPrefetchController.getPcConstants();
setDeviceConfigLong(PcConstants.KEY_LAUNCH_TIME_THRESHOLD_MS, 7 * HOUR_IN_MILLIS);
diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
index 27efcfa..8fb7bd2 100644
--- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/TimeControllerTest.java
@@ -48,6 +48,8 @@
import com.android.server.job.JobSchedulerService;
import com.android.server.job.JobSchedulerService.Constants;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -141,6 +143,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_AlreadySatisfied() {
JobStatus delaySatisfied = createJobStatus(
"testMaybeStartTrackingJobLocked_AlreadySatisfied",
@@ -294,6 +297,7 @@
runTestMaybeStartTrackingJobLocked_DeadlineInOrder();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestMaybeStartTrackingJobLocked_DeadlineInOrder() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -319,6 +323,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_DeadlineInOrder_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -357,6 +362,7 @@
runTestMaybeStartTrackingJobLocked_DeadlineReverseOrder();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestMaybeStartTrackingJobLocked_DeadlineReverseOrder() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -387,6 +393,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testMaybeStartTrackingJobLocked_DeadlineReverseOrder_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -535,6 +542,7 @@
runTestCheckExpiredDeadlinesAndResetAlarm();
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
private void runTestCheckExpiredDeadlinesAndResetAlarm() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -585,6 +593,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testCheckExpiredDeadlinesAndResetAlarm_SomeNotReady() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
@@ -740,6 +749,7 @@
}
@Test
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testEvaluateStateLocked_Deadline() {
final long now = JobSchedulerService.sElapsedRealtimeClock.millis();
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
index 733a433..3e73aa3 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java
@@ -45,6 +45,7 @@
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageInstaller;
@@ -92,6 +93,7 @@
private static final String PACKAGE = "com.example";
private static final String CALLER_PACKAGE = "com.caller";
private static final String INSTALLER_PACKAGE = "com.installer";
+ private static final String INSTALLER_LABEL = "Installer";
private static final Path ICON_PATH = Path.of("icon.png");
@Rule
@@ -198,6 +200,10 @@
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.getResourcesForApplication(eq(PACKAGE))).thenReturn(
mock(Resources.class));
+ ApplicationInfo installerAi = mock(ApplicationInfo.class);
+ when(mComputer.getApplicationInfo(eq(INSTALLER_PACKAGE), anyLong(), anyInt())).thenReturn(
+ installerAi);
+ when(installerAi.loadLabel(any())).thenReturn(INSTALLER_LABEL);
when(mInstallerService.createSessionInternal(any(), any(), any(), anyInt(),
anyInt())).thenReturn(1);
when(mInstallerService.getExistingDraftSessionId(anyInt(), any(), anyInt())).thenReturn(
@@ -222,7 +228,7 @@
Exception e = assertThrows(
SecurityException.class,
() -> mArchiveManager.requestArchive(PACKAGE, "different", mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e).hasMessageThat().isEqualTo(
String.format(
"The UID %s of callerPackageName set by the caller doesn't match the "
@@ -239,7 +245,7 @@
Exception e = assertThrows(
ParcelableException.class,
() -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class);
assertThat(e.getCause()).hasMessageThat().isEqualTo(
String.format("Package %s not found.", PACKAGE));
@@ -249,7 +255,8 @@
public void archiveApp_packageNotInstalledForUser() throws IntentSender.SendIntentException {
mPackageSetting.modifyUserState(UserHandle.CURRENT.getIdentifier()).setInstalled(false);
- mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT);
+ mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT,
+ 0);
rule.mocks().getHandler().flush();
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -279,7 +286,7 @@
Exception e = assertThrows(
ParcelableException.class,
() -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class);
assertThat(e.getCause()).hasMessageThat().isEqualTo("No installer found");
}
@@ -293,7 +300,7 @@
Exception e = assertThrows(
ParcelableException.class,
() -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class);
assertThat(e.getCause()).hasMessageThat().isEqualTo(
"Installer does not support unarchival");
@@ -307,7 +314,7 @@
Exception e = assertThrows(
ParcelableException.class,
() -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class);
assertThat(e.getCause()).hasMessageThat().isEqualTo(
TextUtils.formatSimple("The app %s does not have a main activity.", PACKAGE));
@@ -319,7 +326,8 @@
doThrow(e).when(mArchiveManager).storeIcon(eq(PACKAGE),
any(LauncherActivityInfo.class), eq(mUserId), anyInt(), anyInt());
- mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT);
+ mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT,
+ 0);
rule.mocks().getHandler().flush();
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -342,15 +350,16 @@
Exception e = assertThrows(
ParcelableException.class,
() -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender,
- UserHandle.CURRENT));
+ UserHandle.CURRENT, 0));
assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class);
assertThat(e.getCause()).hasMessageThat().isEqualTo(
TextUtils.formatSimple("The app %s is opted out of archiving.", PACKAGE));
}
@Test
- public void archiveApp_success() {
- mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT);
+ public void archiveApp_withNoAdditionalFlags_success() {
+ mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT,
+ 0);
rule.mocks().getHandler().flush();
verify(mInstallerService).uninstall(
@@ -363,6 +372,23 @@
}
@Test
+ public void archiveApp_withAdditionalFlags_success() {
+ mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT,
+ PackageManager.DELETE_SHOW_DIALOG);
+ rule.mocks().getHandler().flush();
+
+ verify(mInstallerService).uninstall(
+ eq(new VersionedPackage(PACKAGE, PackageManager.VERSION_CODE_HIGHEST)),
+ eq(CALLER_PACKAGE),
+ eq(DELETE_ARCHIVE | DELETE_KEEP_DATA | PackageManager.DELETE_SHOW_DIALOG),
+ eq(mIntentSender),
+ eq(UserHandle.CURRENT.getIdentifier()), anyInt());
+ assertThat(mPackageSetting.readUserState(
+ UserHandle.CURRENT.getIdentifier()).getArchiveState()).isEqualTo(
+ createArchiveState());
+ }
+
+ @Test
public void isAppArchivable_success() throws PackageManager.NameNotFoundException {
assertThat(mArchiveManager.isAppArchivable(PACKAGE, UserHandle.CURRENT)).isTrue();
}
@@ -545,7 +571,7 @@
ICON_PATH, null);
activityInfos.add(activityInfo);
}
- return new ArchiveState(activityInfos, INSTALLER_PACKAGE);
+ return new ArchiveState(activityInfos, INSTALLER_LABEL);
}
private static List<LauncherActivityInfo> createLauncherActivities() {
diff --git a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
index 8e328ca..0e815d0 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/LowPowerStandbyControllerTest.java
@@ -49,8 +49,11 @@
import android.app.AlarmManager;
import android.app.IActivityManager;
import android.app.IForegroundServiceObserver;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
@@ -68,7 +71,7 @@
import android.test.mock.MockContentResolver;
import android.util.ArraySet;
-import androidx.test.InstrumentationRegistry;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.FakeSettingsProvider;
@@ -85,9 +88,11 @@
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.File;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -145,7 +150,8 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mContextSpy = spy(new BroadcastInterceptingContext(InstrumentationRegistry.getContext()));
+ mContextSpy = spy(new BroadcastInterceptingContext(InstrumentationRegistry
+ .getInstrumentation().getTargetContext()));
when(mContextSpy.getPackageManager()).thenReturn(mPackageManagerMock);
when(mContextSpy.getSystemService(AlarmManager.class)).thenReturn(mAlarmManagerMock);
when(mContextSpy.getSystemService(UserManager.class)).thenReturn(mUserManagerMock);
@@ -395,26 +401,65 @@
setLowPowerStandbySupportedConfig(true);
mController.systemReady();
+ TestReceiver receiver = new TestReceiver();
+ mContextSpy.registerReceiver(receiver,
+ new IntentFilter(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED));
+
BroadcastInterceptingContext.FutureIntent futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(false);
futureIntent.assertNotReceived();
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(true);
assertThat(futureIntent.get(1, TimeUnit.SECONDS)).isNotNull();
+ assertThat(receiver.receivedCount).isEqualTo(1);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
mController.setEnabled(true);
futureIntent.assertNotReceived();
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
futureIntent = mContextSpy.nextBroadcastIntent(
PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED);
-
mController.setEnabled(false);
assertThat(futureIntent.get(1, TimeUnit.SECONDS)).isNotNull();
+ assertThat(receiver.receivedCount).isEqualTo(1);
+ receiver.reset();
+ }
+
+ @Test
+ public void testLowPowerStandbyEnabled_EnabledChangedExplicitBroadcastSent() throws Exception {
+ setLowPowerStandbySupportedConfig(true);
+ List<PackageInfo> packagesHoldingPermission = new ArrayList<>();
+
+ when(mPackageManagerMock.getPackagesHoldingPermissions(Mockito.any(),
+ Mockito.anyInt())).thenReturn(packagesHoldingPermission);
+
+ PackageInfo testInfo = new PackageInfo();
+ testInfo.packageName = mContextSpy.getPackageName();
+ packagesHoldingPermission.add(testInfo);
+ mController.systemReady();
+ TestReceiver receiver = new TestReceiver();
+ mContextSpy.registerReceiver(receiver,
+ new IntentFilter(PowerManager.ACTION_LOW_POWER_STANDBY_ENABLED_CHANGED));
+
+ mController.setEnabled(false);
+ assertThat(receiver.receivedCount).isEqualTo(0);
+ receiver.reset();
+
+ mController.setEnabled(true);
+ // Since we added a package manually to the packages that are allowed to
+ // manage LPS, the interceptor should have intercepted two broadcasts, one
+ // implicit via registration and one explicit to the package added above.
+ assertThat(receiver.receivedCount).isEqualTo(2);
+ receiver.reset();
}
@Test
@@ -906,4 +951,19 @@
LocalServices.removeServiceForTest(clazz);
LocalServices.addService(clazz, mock);
}
+
+ public static class TestReceiver extends BroadcastReceiver {
+ public int receivedCount = 0;
+
+ /**
+ * Resets the count of this receiver
+ */
+ public void reset() {
+ receivedCount = 0;
+ }
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ receivedCount++;
+ }
+ }
}
diff --git a/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java b/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
index 2d1b545..62075b8 100644
--- a/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
+++ b/services/tests/powerservicetests/src/com/android/server/power/ShutdownThreadTest.java
@@ -51,31 +51,31 @@
private static final String WAVEFORM_VIB_10MS_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<waveform-effect>
<waveform-entry durationMs="10" amplitude="100"/>
</waveform-effect>
- </vibration>
+ </vibration-effect>
""";
private static final VibrationEffect WAVEFORM_VIB_10MS = VibrationEffect.createOneShot(10, 100);
private static final String REPEATING_VIB_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<waveform-effect>
<repeating>
<waveform-entry durationMs="10" amplitude="100"/>
</repeating>
</waveform-effect>
- </vibration>
+ </vibration-effect>
""";
private static final String CLICK_VIB_SERIALIZATION =
"""
- <vibration>
+ <vibration-effect>
<predefined-effect name="click"/>
- </vibration>
+ </vibration-effect>
""";
private static final VibrationEffect CLILCK_VIB =
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
index 3b39160..9114027 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
@@ -588,6 +588,38 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ public void testTwoFingerTap_StateIsActivated_shouldInDelegating() {
+ assumeTrue(mMgh.mIsSinglePanningEnabled);
+ mMgh.setSinglePanningEnabled(false);
+ goFromStateIdleTo(STATE_ACTIVATED);
+ allowEventDelegation();
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
+ send(upEvent());
+ fastForward(ViewConfiguration.getDoubleTapTimeout());
+
+ assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
+ public void testTwoFingerTap_StateIsIdle_shouldInDelegating() {
+ assumeTrue(mMgh.mIsSinglePanningEnabled);
+ mMgh.setSinglePanningEnabled(false);
+ goFromStateIdleTo(STATE_IDLE);
+ allowEventDelegation();
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, DEFAULT_X * 2, DEFAULT_Y));
+ send(upEvent());
+ fastForward(ViewConfiguration.getDoubleTapTimeout());
+
+ assertTrue(mMgh.mCurrentState == mMgh.mDelegatingState);
+ }
+
+ @Test
public void testMultiTap_outOfDistanceSlop_shouldInIdle() {
// All delay motion events should be sent, if multi-tap with out of distance slop.
// STATE_IDLE will check if tapCount() < 2.
@@ -719,6 +751,20 @@
}
@Test
+ public void testTwoFingerDown_twoPointerDownAndActivatedState_panningState() {
+ goFromStateIdleTo(STATE_ACTIVATED);
+ PointF pointer1 = DEFAULT_POINT;
+ PointF pointer2 = new PointF(DEFAULT_X * 1.5f, DEFAULT_Y);
+
+ send(downEvent());
+ send(pointerEvent(ACTION_POINTER_DOWN, new PointF[] {pointer1, pointer2}, 1));
+ fastForward(ViewConfiguration.getTapTimeout());
+ assertIn(STATE_PANNING);
+
+ returnToNormalFrom(STATE_PANNING);
+ }
+
+ @Test
public void testActivatedWithTripleTap_invokeShowWindowPromptAction() {
goFromStateIdleTo(STATE_ACTIVATED);
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 4375105..1b9e6fb 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
@@ -179,6 +179,29 @@
}
@Test
+ public void testSubscribesToFoldState() throws RemoteException {
+ final List<Integer> actual = new ArrayList<>();
+ final List<Integer> expected = List.of(FoldState.FULLY_CLOSED, FoldState.FULLY_OPENED,
+ FoldState.UNKNOWN, FoldState.HALF_OPENED);
+ mProvider.subscribe(mOpContext, ctx -> {
+ assertThat(ctx).isSameInstanceAs(mOpContext.toAidlContext());
+ assertThat(mProvider.getFoldState()).isEqualTo(ctx.foldState);
+ actual.add(ctx.foldState);
+ });
+
+ for (int v : expected) {
+ mListener.onFoldChanged(v);
+ }
+
+ assertThat(actual).containsExactly(
+ FoldState.FULLY_CLOSED,
+ FoldState.FULLY_OPENED,
+ FoldState.UNKNOWN,
+ FoldState.HALF_OPENED
+ ).inOrder();
+ }
+
+ @Test
public void testSubscribesToDisplayState() throws RemoteException {
final List<Integer> actual = new ArrayList<>();
final List<Integer> expected = List.of(AuthenticateOptions.DISPLAY_STATE_AOD,
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 1726ec1..a33f35a 100644
--- a/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/BiasSchedulingTest.java
@@ -29,6 +29,8 @@
import com.android.server.job.MockBiasJobService.TestEnvironment;
import com.android.server.job.MockBiasJobService.TestEnvironment.Event;
+import libcore.junit.util.compat.CoreCompatChangeRule;
+
import java.util.ArrayList;
@TargetApi(24)
@@ -61,6 +63,7 @@
}
@FlakyTest(bugId = 293589359)
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testLowerBiasJobPreempted() throws Exception {
for (int i = 0; i < JobConcurrencyManager.MAX_CONCURRENCY_LIMIT; ++i) {
JobInfo job = new JobInfo.Builder(100 + i, sJobServiceComponent)
@@ -92,6 +95,7 @@
assertTrue("Lower bias jobs were not preempted.", wasJobHigherExecuted);
}
+ @CoreCompatChangeRule.DisableCompatChanges({JobInfo.ENFORCE_MINIMUM_TIME_WINDOWS})
public void testHigherBiasJobNotPreempted() throws Exception {
for (int i = 0; i < JobConcurrencyManager.DEFAULT_CONCURRENCY_LIMIT; ++i) {
JobInfo job = new JobInfo.Builder(100 + i, sJobServiceComponent)
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 46ead85..3069b67 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -3,6 +3,7 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_IMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_OEM_PAID;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static com.android.server.job.JobStore.JOB_FILE_SPLIT_PREFIX;
@@ -141,7 +142,7 @@
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(4 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -194,7 +195,7 @@
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(3 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -224,7 +225,7 @@
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(5 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -330,7 +331,6 @@
@Test
public void testMaybeWriteStatusToDisk() throws Exception {
int taskId = 5;
- long runByMillis = 20000L; // 20s
long runFromMillis = 2000L; // 2s
long initialBackoff = 10000L; // 10s
@@ -338,7 +338,7 @@
.setRequiresCharging(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
.setBackoffCriteria(initialBackoff, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
- .setOverrideDeadline(runByMillis)
+ .setOverrideDeadline(6 * HOUR_IN_MILLIS)
.setMinimumLatency(runFromMillis)
.setPersisted(true)
.build();
@@ -379,7 +379,7 @@
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
.setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
- .setOverrideDeadline(30000L)
+ .setOverrideDeadline(7 * HOUR_IN_MILLIS)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setPersisted(true)
.build();
@@ -542,7 +542,7 @@
@Test
public void testBiasPersisted() throws Exception {
JobInfo.Builder b = new Builder(92, mComponent)
- .setOverrideDeadline(5000)
+ .setOverrideDeadline(8 * HOUR_IN_MILLIS)
.setBias(42)
.setPersisted(true);
final JobStatus js = JobStatus.createFromJobInfo(b.build(), SOME_UID, null, -1, null, null);
@@ -613,7 +613,7 @@
@Test
public void testPriorityPersisted() throws Exception {
final JobInfo job = new Builder(92, mComponent)
- .setOverrideDeadline(5000)
+ .setOverrideDeadline(9 * HOUR_IN_MILLIS)
.setPriority(JobInfo.PRIORITY_MIN)
.setPersisted(true)
.build();
@@ -634,13 +634,13 @@
@Test
public void testNonPersistedTaskIsNotPersisted() throws Exception {
JobInfo.Builder b = new Builder(42, mComponent)
- .setOverrideDeadline(10000)
+ .setOverrideDeadline(10 * HOUR_IN_MILLIS)
.setPersisted(false);
JobStatus jsNonPersisted = JobStatus.createFromJobInfo(b.build(),
SOME_UID, null, -1, null, null);
mTaskStoreUnderTest.add(jsNonPersisted);
b = new Builder(43, mComponent)
- .setOverrideDeadline(10000)
+ .setOverrideDeadline(11 * HOUR_IN_MILLIS)
.setPersisted(true);
JobStatus jsPersisted = JobStatus.createFromJobInfo(b.build(),
SOME_UID, null, -1, null, null);
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
index c7d80ed..8933c6c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerTest.java
@@ -23,6 +23,7 @@
import static org.junit.Assume.assumeTrue;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertThrows;
+import static org.testng.Assert.assertTrue;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
@@ -31,6 +32,7 @@
import android.content.pm.UserInfo;
import android.content.pm.UserProperties;
import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
@@ -219,6 +221,8 @@
.isEqualTo(cloneUserProperties.isCredentialShareableWithParent());
assertThrows(SecurityException.class, cloneUserProperties::getDeleteAppWithParent);
assertThrows(SecurityException.class, cloneUserProperties::getAlwaysVisible);
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
// Verify clone user parent
assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
@@ -335,7 +339,8 @@
.isEqualTo(privateProfileUserProperties
.isAuthAlwaysRequiredToDisableQuietMode());
assertThrows(SecurityException.class, privateProfileUserProperties::getDeleteAppWithParent);
-
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
// Verify private profile parent
assertThat(mUserManager.getProfileParent(mainUserId)).isNull();
UserInfo parentProfileInfo = mUserManager.getProfileParent(userInfo.id);
@@ -955,6 +960,8 @@
.isEqualTo(userTypeDetails.getBadgeNoBackground());
assertThat(mUserManager.getUserStatusBarIconResId(userId))
.isEqualTo(userTypeDetails.getStatusBarIcon());
+ compareDrawables(mUserManager.getUserBadge(),
+ Resources.getSystem().getDrawable(userTypeDetails.getBadgePlain()));
final int badgeIndex = userInfo.profileBadge;
assertThat(mUserManager.getUserBadgeColor(userId)).isEqualTo(
@@ -1762,4 +1769,10 @@
.getBoolean(com.android.internal.R.bool.config_isMainUserPermanentAdmin);
}
+ private void compareDrawables(Drawable actual, Drawable expected){
+ assertEquals(actual.getIntrinsicWidth(), expected.getIntrinsicWidth());
+ assertEquals(actual.getIntrinsicHeight(), expected.getIntrinsicHeight());
+ assertEquals(actual.getLevel(), expected.getLevel());
+ }
+
}
diff --git a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
index 44dad59..32bbc7a 100644
--- a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java
@@ -482,6 +482,35 @@
}
@Test
+ public void testGetThermalHeadroomThresholdsOnDefaultHalResult() throws Exception {
+ TemperatureWatcher watcher = mService.mTemperatureWatcher;
+ ArrayList<TemperatureThreshold> thresholds = new ArrayList<>();
+ mFakeHal.mTemperatureThresholdList = thresholds;
+ watcher.updateThresholds();
+ synchronized (watcher.mSamples) {
+ assertArrayEquals(
+ new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN,
+ Float.NaN},
+ watcher.mHeadroomThresholds, 0.01f);
+ }
+ TemperatureThreshold nanThresholds = new TemperatureThreshold();
+ nanThresholds.name = "nan";
+ nanThresholds.type = Temperature.TYPE_SKIN;
+ nanThresholds.hotThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1];
+ nanThresholds.coldThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1];
+ Arrays.fill(nanThresholds.hotThrottlingThresholds, Float.NaN);
+ Arrays.fill(nanThresholds.coldThrottlingThresholds, Float.NaN);
+ thresholds.add(nanThresholds);
+ watcher.updateThresholds();
+ synchronized (watcher.mSamples) {
+ assertArrayEquals(
+ new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN,
+ Float.NaN},
+ watcher.mHeadroomThresholds, 0.01f);
+ }
+ }
+
+ @Test
public void testTemperatureWatcherGetSlopeOf() throws RemoteException {
TemperatureWatcher watcher = mService.mTemperatureWatcher;
List<TemperatureWatcher.Sample> samples = new ArrayList<>();
diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
index d09aa89..ffb3bce 100644
--- a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java
@@ -44,6 +44,7 @@
import android.os.IHintSession;
import android.os.PerformanceHintManager;
import android.os.Process;
+import android.os.WorkDuration;
import android.util.Log;
import com.android.server.FgThread;
@@ -89,6 +90,11 @@
private static final long[] DURATIONS_ZERO = new long[] {};
private static final long[] TIMESTAMPS_ZERO = new long[] {};
private static final long[] TIMESTAMPS_TWO = new long[] {1L, 2L};
+ private static final WorkDuration[] WORK_DURATIONS_THREE = new WorkDuration[] {
+ new WorkDuration(1L, 11L, 8L, 4L, 1L),
+ new WorkDuration(2L, 13L, 8L, 6L, 2L),
+ new WorkDuration(3L, 333333333L, 8L, 333333333L, 3L),
+ };
@Mock private Context mContext;
@Mock private HintManagerService.NativeWrapper mNativeWrapperMock;
@@ -593,4 +599,56 @@
}
a.close();
}
+
+ @Test
+ public void testReportActualWorkDuration2() throws Exception {
+ HintManagerService service = createService();
+ IBinder token = new Binder();
+
+ AppHintSession a = (AppHintSession) service.getBinderServiceInstance()
+ .createHintSession(token, SESSION_TIDS_A, DEFAULT_TARGET_DURATION);
+
+ a.updateTargetWorkDuration(100L);
+ a.reportActualWorkDuration2(WORK_DURATIONS_THREE);
+ verify(mNativeWrapperMock, times(1)).halReportActualWorkDuration(anyLong(),
+ eq(WORK_DURATIONS_THREE));
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(
+ new WorkDuration[] {new WorkDuration(-1L, 11L, 8L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 0L, 8L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 11L, 0L, 4L, 1L)});
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ a.reportActualWorkDuration2(
+ new WorkDuration[] {new WorkDuration(1L, 11L, 8L, -1L, 1L)});
+ });
+
+ reset(mNativeWrapperMock);
+ // Set session to background, then the duration would not be updated.
+ service.mUidObserver.onUidStateChanged(
+ a.mUid, ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0, 0);
+
+ // Using CountDownLatch to ensure above onUidStateChanged() job was digested.
+ final CountDownLatch latch = new CountDownLatch(1);
+ FgThread.getHandler().post(() -> {
+ latch.countDown();
+ });
+ latch.await();
+
+ assertFalse(service.mUidObserver.isUidForeground(a.mUid));
+ a.reportActualWorkDuration2(WORK_DURATIONS_THREE);
+ verify(mNativeWrapperMock, never()).halReportActualWorkDuration(anyLong(), any(), any());
+ }
}
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java
index 337dd22..44dbe385 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationVisitUrisTest.java
@@ -20,6 +20,7 @@
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.truth.Truth.assertThat;
+import android.app.Flags;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Person;
@@ -33,6 +34,7 @@
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -42,6 +44,7 @@
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
+import com.android.internal.config.sysui.SystemUiSystemPropertiesFlags;
import com.android.server.UiServiceTestCase;
import com.google.common.base.Strings;
@@ -54,6 +57,7 @@
import com.google.common.collect.Multimap;
import com.google.common.truth.Expect;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -72,6 +76,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -83,15 +88,16 @@
@RunWith(AndroidJUnit4.class)
public class NotificationVisitUrisTest extends UiServiceTestCase {
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String TAG = "VisitUrisTest";
// Methods that are known to add Uris that are *NOT* verified.
- // This list should be emptied! Items can be removed as bugs are fixed.
+ // This list should only be used temporarily if needed, and any element in this list should
+ // have a tracking bug associated.
private static final Multimap<Class<?>, String> KNOWN_BAD =
- ImmutableMultimap.<Class<?>, String>builder()
- .put(Person.Builder.class, "setUri") // TODO: b/281044385
- .build();
+ ImmutableMultimap.<Class<?>, String>builder().build();
// Types that we can't really produce. No methods receiving these parameters will be invoked.
private static final ImmutableSet<Class<?>> UNUSABLE_TYPES =
@@ -155,6 +161,12 @@
@Before
public void setUp() {
mContext = InstrumentationRegistry.getInstrumentation().getContext();
+ mSetFlagsRule.enableFlags(Flags.FLAG_VISIT_RISKY_URIS);
+ }
+
+ @After
+ public void tearDown() {
+ SystemUiSystemPropertiesFlags.TEST_RESOLVER = null;
}
@Test // This is a meta-test, checks that the generators are not broken.
@@ -229,13 +241,12 @@
notification.visitUris(visitor);
Mockito.verify(visitor, Mockito.atLeastOnce()).accept(visitedUriCaptor.capture());
- List<Uri> visitedUris = new ArrayList<>(visitedUriCaptor.getAllValues());
+ Set<Uri> visitedUris = new HashSet<>(visitedUriCaptor.getAllValues());
visitedUris.remove(null);
expect.withMessage(notificationTypeMessage)
.that(visitedUris)
- .containsAtLeastElementsIn(includedUris);
- expect.that(KNOWN_BAD).isNotEmpty(); // Once empty, switch to containsExactlyElementsIn()
+ .containsExactlyElementsIn(includedUris);
}
private static Generated<Notification> buildNotification(Context context,
@@ -520,7 +531,7 @@
&& !EXCLUDED_SETTERS.containsEntry(clazz, method.getName())
&& !EXCLUDED_SETTERS_OVERLOADS.containsEntry(clazz, method)
&& Arrays.stream(method.getParameterTypes())
- .noneMatch(excludingParameterTypes::contains)) {
+ .noneMatch(excludingParameterTypes::contains)) {
methods.put(method.getName(), method);
}
}
@@ -535,14 +546,14 @@
List<Method> excludedSetters = setters.stream().filter(
m1 -> m1.getName().startsWith("set")
&& setters.stream().anyMatch(
- m2 -> {
- Class<?> param1 = m1.getParameterTypes()[0];
- Class<?> param2 = m2.getParameterTypes()[0];
- return m2.getName().startsWith("add")
- && param1.isArray()
- && !param2.isArray() && !param2.isPrimitive()
- && param1.getComponentType().equals(param2);
- })).toList();
+ m2 -> {
+ Class<?> param1 = m1.getParameterTypes()[0];
+ Class<?> param2 = m2.getParameterTypes()[0];
+ return m2.getName().startsWith("add")
+ && param1.isArray()
+ && !param2.isArray() && !param2.isPrimitive()
+ && param1.getComponentType().equals(param2);
+ })).toList();
setters.removeAll(excludedSetters);
return setters;
@@ -597,9 +608,8 @@
private static class SpecialParameterGenerator {
private static final ImmutableSet<Class<?>> INTERESTING_CLASSES =
- ImmutableSet.of(
- Person.class, Uri.class, Icon.class, Intent.class, PendingIntent.class,
- RemoteViews.class);
+ ImmutableSet.of(Person.class, Uri.class, Icon.class, Intent.class,
+ PendingIntent.class, RemoteViews.class);
private static final ImmutableSet<Class<?>> MOCKED_CLASSES = ImmutableSet.of();
private static final ImmutableMap<Class<?>, Object> PRIMITIVE_VALUES =
@@ -623,7 +633,7 @@
}
static boolean canGenerate(Class<?> clazz) {
- return (INTERESTING_CLASSES.contains(clazz) && !clazz.equals(Person.class))
+ return INTERESTING_CLASSES.contains(clazz)
|| MOCKED_CLASSES.contains(clazz)
|| clazz.equals(Context.class)
|| clazz.equals(Bundle.class)
@@ -658,6 +668,17 @@
return Icon.createWithContentUri(iconUri);
}
+ if (clazz == Person.class) {
+ // TODO(b/310189261): Person.setUri takes a string instead of a URI. We should
+ // find a way to use the SpecialParameterGenerator instead of this custom one.
+ Uri personUri = generateUri(
+ where.plus(Person.Builder.class).plus("setUri", String.class));
+ Uri iconUri = generateUri(where.plus(Person.Builder.class).plus("setIcon",
+ Icon.class).plus(Icon.class).plus("createWithContentUri", Uri.class));
+ return new Person.Builder().setUri(personUri.toString()).setIcon(
+ Icon.createWithContentUri(iconUri)).setName("John Doe").build();
+ }
+
if (clazz == Intent.class) {
// TODO(b/281044385): Are Intent Uris (new Intent(String,Uri)) relevant?
return new Intent("action");
@@ -717,9 +738,12 @@
private static class Location {
private static class Item {
- @Nullable private final Class<?> mMaybeClass;
- @Nullable private final Executable mMaybeMethod;
- @Nullable private final String mExtra;
+ @Nullable
+ private final Class<?> mMaybeClass;
+ @Nullable
+ private final Executable mMaybeMethod;
+ @Nullable
+ private final String mExtra;
Item(@NonNull Class<?> clazz) {
mMaybeClass = checkNotNull(clazz);
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 97b6b98..4d25eaa 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeHelperTest.java
@@ -524,7 +524,7 @@
mZenModeHelper.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0, 0);
mZenModeHelper.applyRestrictions();
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
if (usage == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) {
// only mute audio, not vibrations
verify(mAppOps, atLeastOnce()).setRestriction(eq(AppOpsManager.OP_PLAY_AUDIO),
@@ -546,7 +546,7 @@
mZenModeHelper.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0, 0);
mZenModeHelper.applyRestrictions();
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
verify(mAppOps).setRestriction(
eq(AppOpsManager.OP_PLAY_AUDIO), eq(usage), anyInt(), eq(new String[]{PKG_O}));
verify(mAppOps).setRestriction(
@@ -561,7 +561,7 @@
mZenModeHelper.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0, 0);
mZenModeHelper.applyRestrictions();
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
verify(mAppOps).setRestriction(
eq(AppOpsManager.OP_PLAY_AUDIO), eq(usage), anyInt(), eq(null));
verify(mAppOps).setRestriction(
@@ -576,7 +576,7 @@
mZenModeHelper.mConsolidatedPolicy = new Policy(0, 0, 0, 0, 0, 0);
mZenModeHelper.applyRestrictions();
- for (int usage : AudioAttributes.SDK_USAGES) {
+ for (int usage : AudioAttributes.getSdkUsages()) {
verify(mAppOps).setRestriction(
eq(AppOpsManager.OP_PLAY_AUDIO), eq(usage), anyInt(), eq(null));
verify(mAppOps).setRestriction(
@@ -1052,6 +1052,88 @@
}
@Test
+ public void testProtoWithAutoRuleCustomPolicy_classic() throws Exception {
+ setupZenConfig();
+ // clear any automatic rules just to make sure
+ mZenModeHelper.mConfig.automaticRules = new ArrayMap<>();
+
+ // Add an automatic rule with a custom policy
+ ZenRule rule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS, CUSTOM_RULE_ID);
+ rule.zenPolicy = new ZenPolicy.Builder()
+ .allowAlarms(true)
+ .allowRepeatCallers(false)
+ .allowCalls(PEOPLE_TYPE_STARRED)
+ .build();
+ mZenModeHelper.mConfig.automaticRules.put(rule.id, rule);
+ List<StatsEvent> events = new LinkedList<>();
+ mZenModeHelper.pullRules(events);
+
+ boolean foundCustomEvent = false;
+ for (StatsEvent ev : events) {
+ AtomsProto.Atom atom = StatsEventTestUtils.convertToAtom(ev);
+ assertTrue(atom.hasDndModeRule());
+ DNDModeProto cfg = atom.getDndModeRule();
+ if (cfg.getUid() == CUSTOM_PKG_UID) {
+ foundCustomEvent = true;
+ // Check that the pieces of the policy are applied.
+ assertThat(cfg.hasPolicy()).isTrue();
+ DNDPolicyProto policy = cfg.getPolicy();
+ assertThat(policy.getAlarms().getNumber()).isEqualTo(DNDProtoEnums.STATE_ALLOW);
+ assertThat(policy.getRepeatCallers().getNumber())
+ .isEqualTo(DNDProtoEnums.STATE_DISALLOW);
+ assertThat(policy.getCalls().getNumber()).isEqualTo(DNDProtoEnums.STATE_ALLOW);
+ assertThat(policy.getAllowCallsFrom().getNumber())
+ .isEqualTo(DNDProtoEnums.PEOPLE_STARRED);
+ }
+ }
+ assertTrue("couldn't find custom rule", foundCustomEvent);
+ }
+
+ @Test
+ public void testProtoWithAutoRuleCustomPolicy() throws Exception {
+ // allowChannels is only valid under modes_api.
+ mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
+
+ setupZenConfig();
+ // clear any automatic rules just to make sure
+ mZenModeHelper.mConfig.automaticRules = new ArrayMap<>();
+
+ // Add an automatic rule with a custom policy
+ ZenRule rule = createCustomAutomaticRule(ZEN_MODE_IMPORTANT_INTERRUPTIONS, CUSTOM_RULE_ID);
+ rule.zenPolicy = new ZenPolicy.Builder()
+ .allowAlarms(true)
+ .allowRepeatCallers(false)
+ .allowCalls(PEOPLE_TYPE_STARRED)
+ .allowChannels(ZenPolicy.CHANNEL_TYPE_NONE)
+ .build();
+ mZenModeHelper.mConfig.automaticRules.put(rule.id, rule);
+ List<StatsEvent> events = new LinkedList<>();
+ mZenModeHelper.pullRules(events);
+
+ boolean foundCustomEvent = false;
+ for (StatsEvent ev : events) {
+ AtomsProto.Atom atom = StatsEventTestUtils.convertToAtom(ev);
+ assertTrue(atom.hasDndModeRule());
+ DNDModeProto cfg = atom.getDndModeRule();
+ if (cfg.getUid() == CUSTOM_PKG_UID) {
+ foundCustomEvent = true;
+ // Check that the pieces of the policy are applied.
+ assertThat(cfg.hasPolicy()).isTrue();
+ DNDPolicyProto policy = cfg.getPolicy();
+ assertThat(policy.getAlarms().getNumber()).isEqualTo(DNDProtoEnums.STATE_ALLOW);
+ assertThat(policy.getRepeatCallers().getNumber())
+ .isEqualTo(DNDProtoEnums.STATE_DISALLOW);
+ assertThat(policy.getCalls().getNumber()).isEqualTo(DNDProtoEnums.STATE_ALLOW);
+ assertThat(policy.getAllowCallsFrom().getNumber())
+ .isEqualTo(DNDProtoEnums.PEOPLE_STARRED);
+ assertThat(policy.getAllowChannels().getNumber())
+ .isEqualTo(DNDProtoEnums.CHANNEL_TYPE_NONE);
+ }
+ }
+ assertTrue("couldn't find custom rule", foundCustomEvent);
+ }
+
+ @Test
public void ruleUidsCached() throws Exception {
setupZenConfig();
// one enabled automatic rule
@@ -2722,6 +2804,55 @@
}
@Test
+ public void testZenModeEventLog_policyAllowChannels() {
+ // when modes_api flag is on, ensure that any change in allow_channels gets logged,
+ // even when there are no other changes.
+ mTestFlagResolver.setFlagOverride(LOG_DND_STATE_EVENTS, true);
+ mSetFlagsRule.enableFlags(Flags.FLAG_MODES_API);
+
+ // Default zen config has allow channels = priority (aka on)
+ setupZenConfig();
+
+ // First just turn zen mode on
+ mZenModeHelper.setManualZenMode(ZEN_MODE_IMPORTANT_INTERRUPTIONS, null, null, "",
+ Process.SYSTEM_UID, true);
+
+ // Now change only the channels part of the policy; want to confirm that this'll be
+ // reflected in the logs
+ ZenModeConfig newConfig = mZenModeHelper.mConfig.copy();
+ newConfig.allowPriorityChannels = false;
+ mZenModeHelper.setNotificationPolicy(newConfig.toNotificationPolicy(), Process.SYSTEM_UID,
+ true);
+
+ // Total events: one for turning on, one for changing policy
+ assertThat(mZenModeEventLogger.numLoggedChanges()).isEqualTo(2);
+
+ // The first event is just turning DND on; make sure the policy is what we expect there
+ // before it changes in the next stage
+ assertThat(mZenModeEventLogger.getEventId(0))
+ .isEqualTo(ZenModeEventLogger.ZenStateChangedEvent.DND_TURNED_ON.getId());
+ DNDPolicyProto origDndProto = mZenModeEventLogger.getPolicyProto(0);
+ checkDndProtoMatchesSetupZenConfig(origDndProto);
+ assertThat(origDndProto.getAllowChannels().getNumber())
+ .isEqualTo(DNDProtoEnums.CHANNEL_TYPE_PRIORITY);
+
+ // Second message where we change the policy:
+ // - DND_POLICY_CHANGED (indicates only the policy changed and nothing else)
+ // - rule type: unknown (it's a policy change, not a rule change)
+ // - user action (because it comes from a "system" uid)
+ // - change is in allow channels, and final policy
+ assertThat(mZenModeEventLogger.getEventId(1))
+ .isEqualTo(ZenModeEventLogger.ZenStateChangedEvent.DND_POLICY_CHANGED.getId());
+ assertThat(mZenModeEventLogger.getChangedRuleType(1))
+ .isEqualTo(DNDProtoEnums.UNKNOWN_RULE);
+ assertThat(mZenModeEventLogger.getIsUserAction(1)).isTrue();
+ assertThat(mZenModeEventLogger.getPackageUid(1)).isEqualTo(Process.SYSTEM_UID);
+ DNDPolicyProto dndProto = mZenModeEventLogger.getPolicyProto(1);
+ assertThat(dndProto.getAllowChannels().getNumber())
+ .isEqualTo(DNDProtoEnums.CHANNEL_TYPE_NONE);
+ }
+
+ @Test
public void testUpdateConsolidatedPolicy_defaultRulesOnly() {
setupZenConfig();
@@ -3416,6 +3547,7 @@
return rule;
}
+ // TODO: b/310620812 - Update setup methods to include allowChannels() when MODES_API is inlined
private void setupZenConfig() {
mZenModeHelper.mZenMode = ZEN_MODE_OFF;
mZenModeHelper.mConfig.allowAlarms = false;
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
index 04158c4..2b23b18 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/HapticFeedbackCustomizationTest.java
@@ -56,22 +56,22 @@
@Rule public MockitoRule rule = MockitoJUnit.rule();
// Pairs of valid vibration XML along with their equivalent VibrationEffect.
- private static final String COMPOSITION_VIBRATION_XML = "<vibration>"
+ private static final String COMPOSITION_VIBRATION_XML = "<vibration-effect>"
+ "<primitive-effect name=\"tick\" scale=\"0.2497\"/>"
- + "</vibration>";
+ + "</vibration-effect>";
private static final VibrationEffect COMPOSITION_VIBRATION =
VibrationEffect.startComposition().addPrimitive(PRIMITIVE_TICK, 0.2497f).compose();
private static final String PREDEFINED_VIBRATION_XML =
- "<vibration><predefined-effect name=\"click\"/></vibration>";
+ "<vibration-effect><predefined-effect name=\"click\"/></vibration-effect>";
private static final VibrationEffect PREDEFINED_VIBRATION =
VibrationEffect.createPredefined(EFFECT_CLICK);
- private static final String WAVEFORM_VIBRATION_XML = "<vibration>"
+ private static final String WAVEFORM_VIBRATION_XML = "<vibration-effect>"
+ "<waveform-effect>"
+ "<waveform-entry durationMs=\"123\" amplitude=\"254\"/>"
+ "</waveform-effect>"
- + "</vibration>";
+ + "</vibration-effect>";
private static final VibrationEffect WAVEFORM_VIBARTION =
VibrationEffect.createWaveform(new long[] {123}, new int[] {254}, -1);
@@ -259,13 +259,13 @@
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration>"
+ + "<vibration-effect>"
+ "<waveform-effect>"
+ "<repeating>"
+ "<waveform-entry durationMs=\"10\" amplitude=\"100\"/>"
+ "</repeating>"
+ "</waveform-effect>"
- + "</vibration>"
+ + "</vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
}
@@ -339,14 +339,14 @@
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<bad-vibration></bad-vibration>"
+ + "<bad-vibration-effect></bad-vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
@@ -354,14 +354,14 @@
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
+ "<vibration-select>"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</constant>"
+ "</haptic-feedback-constants>");
assertParseCustomizationsFails(
"<haptic-feedback-constants>"
+ "<constant id=\"10\">"
- + "<vibration><predefined-effect name=\"bad-effect-name\"/></vibration>"
+ + "<vibration-effect><predefined-effect name=\"bad-effect\"/></vibration-effect>"
+ "</vibration-select>"
+ "</constant>"
+ "</haptic-feedback-constants>");
diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml
index c3074bb..a8d3fa1 100644
--- a/services/tests/wmtests/AndroidManifest.xml
+++ b/services/tests/wmtests/AndroidManifest.xml
@@ -99,7 +99,7 @@
android:theme="@style/WhiteBackgroundTheme"
android:exported="true"/>
- <activity android:name="com.android.server.wm.TrustedPresentationCallbackTest$TestActivity"
+ <activity android:name="com.android.server.wm.TrustedPresentationListenerTest$TestActivity"
android:exported="true"
android:showWhenLocked="true"
android:turnScreenOn="true" />
diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
index 360fdf3..6853c4c 100644
--- a/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutLoggingTests.java
@@ -30,13 +30,13 @@
import com.android.internal.annotations.Keep;
import com.android.server.input.KeyboardMetricsCollector.KeyboardLogEvent;
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import junitparams.JUnitParamsRunner;
-import junitparams.Parameters;
-
@Presubmit
@MediumTest
@RunWith(JUnitParamsRunner.class)
@@ -44,6 +44,7 @@
private static final int VENDOR_ID = 0x123;
private static final int PRODUCT_ID = 0x456;
+ private static final int DEVICE_BUS = 0x789;
private static final int META_KEY = KeyEvent.KEYCODE_META_LEFT;
private static final int META_ON = MODIFIER.get(KeyEvent.KEYCODE_META_LEFT);
private static final int ALT_KEY = KeyEvent.KEYCODE_ALT_LEFT;
@@ -71,8 +72,8 @@
KeyboardLogEvent.RECENT_APPS, KeyEvent.KEYCODE_TAB, ALT_ON},
{"BACK key -> Go back", new int[]{KeyEvent.KEYCODE_BACK}, KeyboardLogEvent.BACK,
KeyEvent.KEYCODE_BACK, 0},
- {"Meta + `(grave) -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_GRAVE},
- KeyboardLogEvent.BACK, KeyEvent.KEYCODE_GRAVE, META_ON},
+ {"Meta + Escape -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_ESCAPE},
+ KeyboardLogEvent.BACK, KeyEvent.KEYCODE_ESCAPE, META_ON},
{"Meta + Left arrow -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DPAD_LEFT},
KeyboardLogEvent.BACK, KeyEvent.KEYCODE_DPAD_LEFT, META_ON},
{"Meta + Del -> Go back", new int[]{META_KEY, KeyEvent.KEYCODE_DEL},
@@ -291,7 +292,7 @@
@Before
public void setUp() {
setUpPhoneWindowManager(/*supportSettingsUpdate*/ true);
- mPhoneWindowManager.overrideKeyEventSource(VENDOR_ID, PRODUCT_ID);
+ mPhoneWindowManager.overrideKeyEventSource(VENDOR_ID, PRODUCT_ID, DEVICE_BUS);
mPhoneWindowManager.overrideLaunchHome();
mPhoneWindowManager.overrideSearchKeyBehavior(
PhoneWindowManager.SEARCH_BEHAVIOR_TARGET_ACTIVITY);
@@ -311,7 +312,8 @@
int expectedKey, int expectedModifierState) {
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -321,7 +323,8 @@
mPhoneWindowManager.overrideLongPressOnHomeBehavior(longPressOnHomeBehavior);
sendLongPressKeyCombination(testKeys);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -333,7 +336,8 @@
sendKeyCombination(testKeys, 0 /* duration */);
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
@Test
@@ -344,6 +348,7 @@
mPhoneWindowManager.overrideShortPressOnSettingsBehavior(shortPressOnSettingsBehavior);
sendKeyCombination(testKeys, 0 /* duration */);
mPhoneWindowManager.assertShortcutLogged(VENDOR_ID, PRODUCT_ID, expectedLogEvent,
- expectedKey, expectedModifierState, "Failed while executing " + testName);
+ expectedKey, expectedModifierState, DEVICE_BUS,
+ "Failed while executing " + testName);
}
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index 7788b33..43c4745 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -483,10 +483,15 @@
doReturn(mPackageManager).when(mContext).getPackageManager();
}
- void overrideKeyEventSource(int vendorId, int productId) {
- InputDevice device = new InputDevice.Builder().setId(1).setVendorId(vendorId).setProductId(
- productId).setSources(InputDevice.SOURCE_KEYBOARD).setKeyboardType(
- InputDevice.KEYBOARD_TYPE_ALPHABETIC).build();
+ void overrideKeyEventSource(int vendorId, int productId, int deviceBus) {
+ InputDevice device = new InputDevice.Builder()
+ .setId(1)
+ .setVendorId(vendorId)
+ .setProductId(productId)
+ .setDeviceBus(deviceBus)
+ .setSources(InputDevice.SOURCE_KEYBOARD)
+ .setKeyboardType(InputDevice.KEYBOARD_TYPE_ALPHABETIC)
+ .build();
doReturn(mInputManager).when(mContext).getSystemService(eq(InputManager.class));
doReturn(device).when(mInputManager).getInputDevice(anyInt());
}
@@ -682,11 +687,11 @@
}
void assertShortcutLogged(int vendorId, int productId, KeyboardLogEvent logEvent,
- int expectedKey, int expectedModifierState, String errorMsg) {
+ int expectedKey, int expectedModifierState, int deviceBus, String errorMsg) {
mTestLooper.dispatchAll();
verify(() -> FrameworkStatsLog.write(FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED,
vendorId, productId, logEvent.getIntValue(), new int[]{expectedKey},
- expectedModifierState), description(errorMsg));
+ expectedModifierState, deviceBus), description(errorMsg));
}
void assertSwitchToRecent(int persistentId) throws RemoteException {
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 f2e54bc..7aa46a6 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -3727,6 +3727,24 @@
verify(task).moveTaskToBack(any());
}
+ /**
+ * Verifies the {@link ActivityRecord#moveFocusableActivityToTop} returns {@code false} if
+ * there's a PIP task on top.
+ */
+ @Test
+ public void testMoveFocusableActivityToTop() {
+ // Create a Task
+ final Task task = createTask(mDisplayContent);
+ final ActivityRecord ar = createActivityRecord(task);
+
+ // Create a PIP Task on top
+ final Task pipTask = createTask(mDisplayContent);
+ doReturn(true).when(pipTask).inPinnedWindowingMode();
+
+ // Verifies that the Task is not moving-to-top.
+ assertFalse(ar.moveFocusableActivityToTop("test"));
+ }
+
private ICompatCameraControlCallback getCompatCameraControlCallback() {
return new ICompatCameraControlCallback.Stub() {
@Override
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index acce2e2..71d2504 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -2086,15 +2086,17 @@
@Test
public void testShellTransitRotation() {
- DisplayContent dc = createNewDisplay();
- dc.setLastHasContent();
+ final DisplayContent dc = mDisplayContent;
+ // Create 2 visible activities to verify that they can both receive the new configuration.
+ final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build();
+ doReturn(true).when(activity1).isSyncFinished(any());
+ doReturn(true).when(activity2).isSyncFinished(any());
final TestTransitionPlayer testPlayer = registerTestTransitionPlayer();
final DisplayRotation dr = dc.getDisplayRotation();
- doCallRealMethod().when(dr).updateRotationUnchecked(anyBoolean());
- // Rotate 180 degree so the display doesn't have configuration change. This condition is
- // used for the later verification of stop-freezing (without setting mWaitingForConfig).
- doReturn((dr.getRotation() + 2) % 4).when(dr).rotationForOrientation(anyInt(), anyInt());
+ spyOn(dr);
+ doReturn((dr.getRotation() + 1) % 4).when(dr).rotationForOrientation(anyInt(), anyInt());
mWm.mDisplayChangeController =
new IDisplayChangeWindowController.Stub() {
@Override
@@ -2109,11 +2111,8 @@
}
};
- // kill any existing rotation animation (vestigial from test setup).
- dc.setRotationAnimation(null);
-
final int origRot = dc.getConfiguration().windowConfiguration.getRotation();
-
+ dc.setLastHasContent();
mWm.updateRotation(true /* alwaysSendConfiguration */, false /* forceRelayout */);
// Should create a transition request without performing rotation
assertNotNull(testPlayer.mLastRequest);
@@ -2122,6 +2121,10 @@
// Once transition starts, rotation is applied and transition shows DC rotating.
testPlayer.startTransition();
waitUntilHandlersIdle();
+ verify(activity1).ensureActivityConfiguration(anyInt(), anyBoolean(), anyBoolean(),
+ anyBoolean());
+ verify(activity2).ensureActivityConfiguration(anyInt(), anyBoolean(), anyBoolean(),
+ anyBoolean());
assertNotEquals(origRot, dc.getConfiguration().windowConfiguration.getRotation());
assertNotNull(testPlayer.mLastReady);
assertTrue(testPlayer.mController.isPlaying());
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 5a43498..0608cf4 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -362,6 +362,8 @@
// Ensure a task has moved over.
ensureTaskPlacement(task, activity);
assertTrue(task.inPinnedWindowingMode());
+ assertFalse("Entering PiP activity must not affect SysUiFlags",
+ activity.canAffectSystemUiFlags());
// The activity with fixed orientation should not apply letterbox when entering PiP.
final int requestedOrientation = task.getConfiguration().orientation
diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
index 3b9ed26..ef427bb 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceControlViewHostTests.java
@@ -137,7 +137,7 @@
wasVisible = waitForWindowVisible(mView2);
if (!wasVisible) {
- dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows");
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-not visible");
}
assertTrue("Failed to wait for view2", wasVisible);
@@ -145,11 +145,21 @@
WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(window,
mScvh1.getInputTransferToken(), true);
- assertTrue("Failed to gain focus for view1", waitForWindowFocus(mView1, true));
+
+ boolean gainedFocus = waitForWindowFocus(mView1, true);
+ if (!gainedFocus) {
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-view1 not focus");
+ }
+ assertTrue("Failed to gain focus for view1", gainedFocus);
WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(window,
mScvh2.getInputTransferToken(), true);
- assertTrue("Failed to gain focus for view2", waitForWindowFocus(mView2, true));
+
+ gainedFocus = waitForWindowFocus(mView2, true);
+ if (!gainedFocus) {
+ dumpWindowsOnScreen(TAG, "requestFocusWithMultipleWindows-view2 not focus");
+ }
+ assertTrue("Failed to gain focus for view2", gainedFocus);
}
private static class TestWindowlessWindowManager extends WindowlessWindowManager {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java
index 267bec9..c876663 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java
@@ -40,6 +40,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.graphics.Color;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
@@ -167,7 +168,7 @@
@Presubmit
public void testTaskDescriptionChanged() throws Exception {
final Object[] params = new Object[2];
- final CountDownLatch latch = new CountDownLatch(1);
+ final CountDownLatch latch = new CountDownLatch(2);
registerTaskStackChangedListener(new TaskStackListener() {
int mTaskId = -1;
@@ -510,6 +511,8 @@
protected void onPostResume() {
super.onPostResume();
setTaskDescription(new TaskDescription("Test Label"));
+ // Sets the color of the status-bar should update the TaskDescription again.
+ getWindow().setStatusBarColor(Color.RED);
synchronized (sLock) {
// Hold the lock to ensure no one is trying to access fields of this Activity in
// this test.
diff --git a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java
deleted file mode 100644
index c5dd447..0000000
--- a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationCallbackTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.wm;
-
-import static android.server.wm.ActivityManagerTestBase.createFullscreenActivityScenarioRule;
-import static android.server.wm.BuildUtils.HW_TIMEOUT_MULTIPLIER;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.app.Activity;
-import android.platform.test.annotations.Presubmit;
-import android.server.wm.CtsWindowInfoUtils;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.TrustedPresentationThresholds;
-
-import androidx.annotation.GuardedBy;
-import androidx.test.ext.junit.rules.ActivityScenarioRule;
-
-import com.android.server.wm.utils.CommonUtils;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
-
-import java.util.function.Consumer;
-
-/**
- * TODO (b/287076178): Move these tests to
- * {@link android.view.surfacecontrol.cts.TrustedPresentationCallbackTest} when API is made public
- */
-@Presubmit
-public class TrustedPresentationCallbackTest {
- private static final String TAG = "TrustedPresentationCallbackTest";
- private static final int STABILITY_REQUIREMENT_MS = 500;
- private static final long WAIT_TIME_MS = HW_TIMEOUT_MULTIPLIER * 2000L;
-
- private static final float FRACTION_VISIBLE = 0.1f;
-
- private final Object mResultsLock = new Object();
- @GuardedBy("mResultsLock")
- private boolean mResult;
- @GuardedBy("mResultsLock")
- private boolean mReceivedResults;
-
- @Rule
- public TestName mName = new TestName();
-
- @Rule
- public ActivityScenarioRule<TestActivity> mActivityRule = createFullscreenActivityScenarioRule(
- TestActivity.class);
-
- private TestActivity mActivity;
-
- @Before
- public void setup() {
- mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
- }
-
- @After
- public void tearDown() {
- CommonUtils.waitUntilActivityRemoved(mActivity);
- }
-
- @Test
- public void testAddTrustedPresentationListenerOnWindow() throws InterruptedException {
- TrustedPresentationThresholds thresholds = new TrustedPresentationThresholds(
- 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- mActivity.getWindow().getRootSurfaceControl().addTrustedPresentationCallback(t, thresholds,
- Runnable::run, inTrustedPresentationState -> {
- synchronized (mResultsLock) {
- mResult = inTrustedPresentationState;
- mReceivedResults = true;
- mResultsLock.notify();
- }
- });
- t.apply();
- synchronized (mResultsLock) {
- assertResults();
- }
- }
-
- @Test
- public void testRemoveTrustedPresentationListenerOnWindow() throws InterruptedException {
- TrustedPresentationThresholds thresholds = new TrustedPresentationThresholds(
- 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
- Consumer<Boolean> trustedPresentationCallback = inTrustedPresentationState -> {
- synchronized (mResultsLock) {
- mResult = inTrustedPresentationState;
- mReceivedResults = true;
- mResultsLock.notify();
- }
- };
- SurfaceControl.Transaction t = new SurfaceControl.Transaction();
- mActivity.getWindow().getRootSurfaceControl().addTrustedPresentationCallback(t, thresholds,
- Runnable::run, trustedPresentationCallback);
- t.apply();
-
- synchronized (mResultsLock) {
- if (!mReceivedResults) {
- mResultsLock.wait(WAIT_TIME_MS);
- }
- assertResults();
- // reset the state
- mReceivedResults = false;
- }
-
- mActivity.getWindow().getRootSurfaceControl().removeTrustedPresentationCallback(t,
- trustedPresentationCallback);
- t.apply();
-
- synchronized (mResultsLock) {
- if (!mReceivedResults) {
- mResultsLock.wait(WAIT_TIME_MS);
- }
- // Ensure we waited the full time and never received a notify on the result from the
- // callback.
- assertFalse("Should never have received a callback", mReceivedResults);
- // results shouldn't have changed.
- assertTrue(mResult);
- }
- }
-
- @GuardedBy("mResultsLock")
- private void assertResults() throws InterruptedException {
- mResultsLock.wait(WAIT_TIME_MS);
-
- if (!mReceivedResults) {
- CtsWindowInfoUtils.dumpWindowsOnScreen(TAG, "test " + mName.getMethodName());
- }
- // Make sure we received the results and not just timed out
- assertTrue("Timed out waiting for results", mReceivedResults);
- assertTrue(mResult);
- }
-
- public static class TestActivity extends Activity {
- }
-}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java
new file mode 100644
index 0000000..96b66bf
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/TrustedPresentationListenerTest.java
@@ -0,0 +1,267 @@
+/*
+ * 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.wm;
+
+import static android.server.wm.ActivityManagerTestBase.createFullscreenActivityScenarioRule;
+import static android.server.wm.BuildUtils.HW_TIMEOUT_MULTIPLIER;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.fail;
+
+import android.app.Activity;
+import android.os.SystemClock;
+import android.platform.test.annotations.Presubmit;
+import android.server.wm.CtsWindowInfoUtils;
+import android.util.AndroidRuntimeException;
+import android.util.Log;
+import android.view.SurfaceControl;
+import android.view.SurfaceControlViewHost;
+import android.view.View;
+import android.view.WindowManager;
+import android.window.TrustedPresentationThresholds;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
+
+import com.android.server.wm.utils.CommonUtils;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+/**
+ * TODO (b/287076178): Move these tests to
+ * {@link android.view.surfacecontrol.cts.TrustedPresentationListenerTest} when API is made public
+ */
+@Presubmit
+public class TrustedPresentationListenerTest {
+ private static final String TAG = "TrustedPresentationListenerTest";
+ private static final int STABILITY_REQUIREMENT_MS = 500;
+ private static final long WAIT_TIME_MS = HW_TIMEOUT_MULTIPLIER * 2000L;
+
+ private static final float FRACTION_VISIBLE = 0.1f;
+
+ private final List<Boolean> mResults = Collections.synchronizedList(new ArrayList<>());
+ private CountDownLatch mReceivedResults = new CountDownLatch(1);
+
+ private TrustedPresentationThresholds mThresholds = new TrustedPresentationThresholds(
+ 1 /* minAlpha */, FRACTION_VISIBLE, STABILITY_REQUIREMENT_MS);
+
+ @Rule
+ public TestName mName = new TestName();
+
+ @Rule
+ public ActivityScenarioRule<TestActivity> mActivityRule = createFullscreenActivityScenarioRule(
+ TestActivity.class);
+
+ private TestActivity mActivity;
+
+ private SurfaceControlViewHost.SurfacePackage mSurfacePackage = null;
+
+ @Before
+ public void setup() {
+ mActivityRule.getScenario().onActivity(activity -> mActivity = activity);
+ mDefaultListener = new Listener(mReceivedResults);
+ }
+
+ @After
+ public void tearDown() {
+ if (mSurfacePackage != null) {
+ new SurfaceControl.Transaction().remove(mSurfacePackage.getSurfaceControl()).apply(
+ true);
+ mSurfacePackage.release();
+ }
+ CommonUtils.waitUntilActivityRemoved(mActivity);
+
+ }
+
+ private class Listener implements Consumer<Boolean> {
+ final CountDownLatch mLatch;
+
+ Listener(CountDownLatch latch) {
+ mLatch = latch;
+ }
+
+ @Override
+ public void accept(Boolean inTrustedPresentationState) {
+ Log.d(TAG, "onTrustedPresentationChanged " + inTrustedPresentationState);
+ mResults.add(inTrustedPresentationState);
+ mLatch.countDown();
+ }
+ }
+
+ private Consumer<Boolean> mDefaultListener;
+
+ @Test
+ public void testAddTrustedPresentationListenerOnWindow() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds, Runnable::run,
+ mDefaultListener);
+ assertResults(List.of(true));
+ }
+
+ @Test
+ public void testRemoveTrustedPresentationListenerOnWindow() throws InterruptedException {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds, Runnable::run,
+ mDefaultListener);
+ assertResults(List.of(true));
+ // reset the latch
+ mReceivedResults = new CountDownLatch(1);
+
+ windowManager.unregisterTrustedPresentationListener(mDefaultListener);
+ mReceivedResults.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS);
+ // Ensure we waited the full time and never received a notify on the result from the
+ // callback.
+ assertEquals("Should never have received a callback", mReceivedResults.getCount(), 1);
+ // results shouldn't have changed.
+ assertEquals(mResults, List.of(true));
+ }
+
+ @Test
+ public void testRemovingUnknownListenerIsANoop() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ assertNotNull(windowManager);
+ windowManager.unregisterTrustedPresentationListener(mDefaultListener);
+ }
+
+ @Test
+ public void testAddDuplicateListenerThrowsException() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ assertNotNull(windowManager);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener);
+ assertThrows(AndroidRuntimeException.class,
+ () -> windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener));
+ }
+
+ @Test
+ public void testAddDuplicateThresholds() {
+ mReceivedResults = new CountDownLatch(2);
+ mDefaultListener = new Listener(mReceivedResults);
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mDefaultListener);
+
+ Consumer<Boolean> mNewListener = new Listener(mReceivedResults);
+
+ windowManager.registerTrustedPresentationListener(
+ mActivity.getWindow().getDecorView().getWindowToken(), mThresholds,
+ Runnable::run, mNewListener);
+ assertResults(List.of(true, true));
+ }
+
+ private void waitForViewAttach(View view) {
+ final CountDownLatch viewAttached = new CountDownLatch(1);
+ view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(@NonNull View v) {
+ viewAttached.countDown();
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(@NonNull View v) {
+
+ }
+ });
+ try {
+ viewAttached.await(2000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ if (!wait(viewAttached, 2000 /* waitTimeMs */)) {
+ fail("Couldn't attach view=" + view);
+ }
+ }
+
+ @Test
+ public void testAddListenerToScvh() {
+ WindowManager windowManager = mActivity.getSystemService(WindowManager.class);
+
+ var embeddedView = new View(mActivity);
+ mActivityRule.getScenario().onActivity(activity -> {
+ var attachedSurfaceControl =
+ mActivity.getWindow().getDecorView().getRootSurfaceControl();
+ var scvh = new SurfaceControlViewHost(mActivity, mActivity.getDisplay(),
+ attachedSurfaceControl.getHostToken());
+ mSurfacePackage = scvh.getSurfacePackage();
+ scvh.setView(embeddedView, mActivity.getWindow().getDecorView().getWidth(),
+ mActivity.getWindow().getDecorView().getHeight());
+ attachedSurfaceControl.buildReparentTransaction(
+ mSurfacePackage.getSurfaceControl());
+ });
+
+ waitForViewAttach(embeddedView);
+ windowManager.registerTrustedPresentationListener(embeddedView.getWindowToken(),
+ mThresholds,
+ Runnable::run, mDefaultListener);
+
+ assertResults(List.of(true));
+ }
+
+ private boolean wait(CountDownLatch latch, long waitTimeMs) {
+ while (true) {
+ long now = SystemClock.uptimeMillis();
+ try {
+ return latch.await(waitTimeMs, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ long elapsedTime = SystemClock.uptimeMillis() - now;
+ waitTimeMs = Math.max(0, waitTimeMs - elapsedTime);
+ }
+ }
+
+ }
+
+ @GuardedBy("mResultsLock")
+ private void assertResults(List<Boolean> results) {
+ if (!wait(mReceivedResults, WAIT_TIME_MS)) {
+ try {
+ CtsWindowInfoUtils.dumpWindowsOnScreen(TAG, "test " + mName.getMethodName());
+ } catch (InterruptedException e) {
+ Log.d(TAG, "Couldn't dump windows", e);
+ }
+ Assert.fail("Timed out waiting for results mReceivedResults.count="
+ + mReceivedResults.getCount() + "mReceivedResults=" + mReceivedResults);
+ }
+
+ // Make sure we received the results
+ assertEquals(results.toArray(), mResults.toArray());
+ }
+
+ public static class TestActivity extends Activity {
+ }
+}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
index b098e82..dc8b5a1 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordDetectionConnection.java
@@ -179,6 +179,31 @@
private final SparseArray<DetectorSession> mDetectorSessions =
new SparseArray<>();
+ /** Listens to changes to voice activation op. */
+ private final AppOpsManager.OnOpChangedListener mOnOpChangedListener =
+ new AppOpsManager.OnOpChangedListener() {
+ @Override
+ public void onOpChanged(String op, String packageName) {
+ if (op.equals(AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO)) {
+ AppOpsManager appOpsManager =
+ mContext.getSystemService(AppOpsManager.class);
+ synchronized (mLock) {
+ int checkOp = appOpsManager.unsafeCheckOpNoThrow(
+ AppOpsManager.OPSTR_RECEIVE_SANDBOX_TRIGGER_AUDIO,
+ mVoiceInteractorIdentity.uid,
+ mVoiceInteractorIdentity.packageName);
+ // Voice activation app op disabled, safely shutdown hotword detection.
+ if (checkOp == AppOpsManager.MODE_ERRORED) {
+ Slog.i(TAG, "Shutdown hotword detection service on voice "
+ + "activation op disabled.");
+ safelyShutdownHotwordDetectionOnVoiceActivationDisabledLocked();
+ }
+ }
+ }
+ }
+ };
+
+
HotwordDetectionConnection(Object lock, Context context, int voiceInteractionServiceUid,
Identity voiceInteractorIdentity, ComponentName hotwordDetectionServiceName,
ComponentName visualQueryDetectionServiceName, int userId,
@@ -216,6 +241,10 @@
mLastRestartInstant = Instant.now();
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ appOpsManager.startWatchingMode(AppOpsManager.OP_RECEIVE_SANDBOX_TRIGGER_AUDIO,
+ mVoiceInteractorIdentity.packageName, mOnOpChangedListener);
+
if (mReStartPeriodSeconds <= 0) {
mCancellationTaskFuture = null;
} else {
@@ -299,7 +328,11 @@
}
if (mAudioFlinger != null) {
mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+ mAudioFlinger = null;
}
+ // Unregister the on op mode changed listener.
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ appOpsManager.stopWatchingMode(mOnOpChangedListener);
}
@SuppressWarnings("GuardedBy")
@@ -553,6 +586,51 @@
}
}
+ /**
+ * Shutdowns down hotword detection service, swallowing exceptions.
+ *
+ * Called when voice activation app-op has been disabled.
+ */
+ @SuppressWarnings("GuardedBy")
+ void safelyShutdownHotwordDetectionOnVoiceActivationDisabledLocked() {
+ Slog.v(TAG, "safelyShutdownHotwordDetectionOnVoiceActivationDisabled");
+ try {
+ clearDebugHotwordLoggingTimeoutLocked();
+ mRemoteExceptionListener = null;
+ runForEachDetectorSessionLocked((session) -> {
+ if (!(session instanceof VisualQueryDetectorSession)) {
+ // Inform all detector sessions that they got destroyed due to voice activation
+ // op being disabled.
+ session.reportErrorLocked(
+ new HotwordDetectionServiceFailure(
+ HotwordDetectionServiceFailure
+ .ERROR_CODE_SHUTDOWN_HDS_ON_VOICE_ACTIVATION_OP_DISABLED,
+ "Shutdown hotword detection service on voice "
+ + "activation op disabled!"));
+ session.destroyLocked();
+ }
+ });
+
+ // Remove hotword detection sessions.
+ mDetectorSessions.delete(HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_DSP);
+ mDetectorSessions.delete(HotwordDetector.DETECTOR_TYPE_TRUSTED_HOTWORD_SOFTWARE);
+
+ mDebugHotwordLogging = false;
+ unbindHotwordDetectionService();
+ if (mCancellationTaskFuture != null) {
+ mCancellationTaskFuture.cancel(/* mayInterruptIfRunning= */ true);
+ }
+ if (mAudioFlinger != null) {
+ mAudioFlinger.unlinkToDeath(mAudioServerDeathRecipient, /* flags= */ 0);
+ mAudioFlinger = null;
+ }
+ } catch (Exception e) {
+ Slog.e(TAG, "Swallowing error while shutting down hotword detection."
+ + "Error message: " + e.getMessage());
+ }
+ }
+
+
static final class SoundTriggerCallback extends IRecognitionStatusCallback.Stub {
private final HotwordDetectionConnection mHotwordDetectionConnection;
private final IHotwordRecognitionStatusCallback mExternalCallback;
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index ede4885..1e68687 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -252,6 +252,7 @@
*
* The default value is true.
*/
+ @FlaggedApi(Flags.FLAG_SHOW_CALL_ID_AND_CALL_WAITING_IN_ADDITIONAL_SETTINGS_MENU)
public static final String KEY_ADDITIONAL_SETTINGS_CALLER_ID_VISIBILITY_BOOL =
"additional_settings_caller_id_visibility_bool";
@@ -261,6 +262,7 @@
*
* The default value is true.
*/
+ @FlaggedApi(Flags.FLAG_SHOW_CALL_ID_AND_CALL_WAITING_IN_ADDITIONAL_SETTINGS_MENU)
public static final String KEY_ADDITIONAL_SETTINGS_CALL_WAITING_VISIBILITY_BOOL =
"additional_settings_call_waiting_visibility_bool";
@@ -3349,12 +3351,42 @@
/**
* Determines whether we should show a notification when the phone established a data
* connection in roaming network, to warn users about possible roaming charges.
+ *
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY
* @hide
*/
public static final String KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL =
"show_data_connected_roaming_notification";
/**
+ * Determines what MCCs are exceptions for the value of
+ * {@link #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL}.
+ * An empty list indicates that there are no exceptions.
+ *
+ * @see #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY
+ * @hide
+ */
+ public static final String
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY =
+ "data_connected_roaming_notification_excluded_mccs_string_array";
+
+ /**
+ * Determines what MCC+MNCs are exceptions for the MCCs specified in
+ * {@link #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY}, meaning the
+ * value for the MCC+MNC is {@link #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL}.
+ * An empty list indicates that there are no MNC-specific exceptions.
+ *
+ * @see #KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL
+ * @see #KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY
+ * @hide
+ */
+ public static final String
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY =
+ "data_connected_roaming_notification_included_mcc_mncs_string_array";
+
+ /**
* A list of 4 LTE RSRP thresholds above which a signal level is considered POOR,
* MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting.
*
@@ -10336,6 +10368,11 @@
sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false);
sDefaults.putBoolean(KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL, false);
+ sDefaults.putStringArray(KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_EXCLUDED_MCCS_STRING_ARRAY,
+ new String[0]);
+ sDefaults.putStringArray(
+ KEY_DATA_CONNECTED_ROAMING_NOTIFICATION_INCLUDED_MCC_MNCS_STRING_ARRAY,
+ new String[0]);
sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY,
// Boundaries: [-140 dBm, -44 dBm]
new int[] {
diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java
index b528866..54ceaed 100644
--- a/telephony/java/android/telephony/ims/RegistrationManager.java
+++ b/telephony/java/android/telephony/ims/RegistrationManager.java
@@ -18,6 +18,7 @@
import android.Manifest;
import android.annotation.CallbackExecutor;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,6 +35,8 @@
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;
+import com.android.internal.telephony.flags.Flags;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Map;
@@ -77,9 +80,11 @@
/** @hide */
@IntDef(prefix = {"SUGGESTED_ACTION_"},
value = {
- SUGGESTED_ACTION_NONE,
- SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK,
- SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT
+ SUGGESTED_ACTION_NONE,
+ SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK,
+ SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT,
+ SUGGESTED_ACTION_TRIGGER_RAT_BLOCK,
+ SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK
})
@Retention(RetentionPolicy.SOURCE)
public @interface SuggestedAction {}
@@ -109,6 +114,27 @@
@SystemApi
public static final int SUGGESTED_ACTION_TRIGGER_PLMN_BLOCK_WITH_TIMEOUT = 2;
+ /**
+ * Indicates that the IMS registration on current RAT failed multiple times.
+ * The radio shall block the current RAT and search for other available RATs in the
+ * background. If no other RAT is available that meets the carrier requirements, the
+ * radio may remain on the current RAT for internet service. The radio clears all
+ * RATs marked as unavailable if the IMS service is registered to the carrier network.
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(Flags.FLAG_ADD_RAT_RELATED_SUGGESTED_ACTION_TO_IMS_REGISTRATION)
+ int SUGGESTED_ACTION_TRIGGER_RAT_BLOCK = 3;
+
+ /**
+ * Indicates that the radio clears all RATs marked as unavailable and tries to find
+ * an available RAT that meets the carrier requirements.
+ * @hide
+ */
+ @SystemApi
+ @FlaggedApi(Flags.FLAG_ADD_RAT_RELATED_SUGGESTED_ACTION_TO_IMS_REGISTRATION)
+ int SUGGESTED_ACTION_TRIGGER_CLEAR_RAT_BLOCK = 4;
+
/**@hide*/
// Translate ImsRegistrationImplBase API to new AccessNetworkConstant because WLAN
// and WWAN are more accurate constants.
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index 22320fd..2ff7413 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -54,6 +54,29 @@
dist_group: "android",
}
+java_library {
+ name: "android.test.mock.ravenwood",
+ srcs: [":android-test-mock-sources"],
+ visibility: [
+ "//frameworks/base",
+ ],
+}
+
+android_ravenwood_test {
+ name: "android.test.mock.ravenwood.tests",
+ libs: [
+ "android.test.mock.ravenwood",
+ ],
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ ],
+ srcs: [
+ "tests/**/*.java",
+ ],
+ auto_gen_config: true,
+}
+
// Make the current.txt available for use by the cts/tests/signature tests.
// ========================================================================
filegroup {
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt b/test-mock/tests/src/android/test/mock/MockContextTest.java
similarity index 69%
copy from packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
copy to test-mock/tests/src/android/test/mock/MockContextTest.java
index f4feee1..6e28267 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/deviceentry/data/repository/FakeDeviceEntryDataLayerModule.kt
+++ b/test-mock/tests/src/android/test/mock/MockContextTest.java
@@ -13,8 +13,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.systemui.deviceentry.data.repository
-import dagger.Module
+package android.test.mock;
-@Module(includes = [FakeDeviceEntryRepositoryModule::class]) object FakeDeviceEntryDataLayerModule
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MockContextTest {
+ @Test
+ public void testConstructor() {
+ new MockContext();
+ }
+}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt b/test-mock/tests/src/android/test/mock/MockPackageManagerTest.java
similarity index 68%
copy from packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
copy to test-mock/tests/src/android/test/mock/MockPackageManagerTest.java
index 4098987..5b860f1 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/settingsprovider/SettingsGlobalChangeRepository.kt
+++ b/test-mock/tests/src/android/test/mock/MockPackageManagerTest.java
@@ -14,10 +14,17 @@
* limitations under the License.
*/
-package com.android.settingslib.spaprivileged.settingsprovider
+package android.test.mock;
-import android.content.Context
-import kotlinx.coroutines.flow.Flow
+import androidx.test.runner.AndroidJUnit4;
-fun Context.settingsGlobalChangeFlow(name: String, sendInitialValue: Boolean = true): Flow<Unit> =
- settingsGlobalFlow(name, sendInitialValue) { }
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class MockPackageManagerTest {
+ @Test
+ public void testConstructor() {
+ new MockPackageManager();
+ }
+}
diff --git a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
index 1e5f33f..60b5ce7 100644
--- a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
+++ b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/GraphicsActivity.java
@@ -235,13 +235,17 @@
}
public int setFrameRate(float frameRate) {
+ return setFrameRate(frameRate, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);
+ }
+
+ public int setFrameRate(
+ float frameRate, @Surface.FrameRateCompatibility int compatibility) {
Log.i(TAG,
String.format("Setting frame rate for %s: frameRate=%.2f", mName, frameRate));
int rc = 0;
try (SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()) {
- transaction.setFrameRate(
- mSurfaceControl, frameRate, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT);
+ transaction.setFrameRate(mSurfaceControl, frameRate, compatibility);
transaction.apply();
}
return rc;
@@ -668,12 +672,34 @@
}
}
- private void testSurfaceControlFrameRateCategoryInternal(int category)
- throws InterruptedException {
+ private void testSurfaceControlFrameRateCompatibilityInternal(
+ @Surface.FrameRateCompatibility int compatibility) throws InterruptedException {
+ runOneSurfaceTest((TestSurface surface) -> {
+ Log.i(TAG,
+ "**** Running testSurfaceControlFrameRateCompatibility with compatibility "
+ + compatibility);
+
+ float expectedFrameRate = getExpectedFrameRateForCompatibility(compatibility);
+ int initialNumEvents = mModeChangedEvents.size();
+ surface.setFrameRate(30.f, compatibility);
+ verifyExactAndStableFrameRate(expectedFrameRate, surface);
+ verifyModeSwitchesDontChangeResolution(initialNumEvents, mModeChangedEvents.size());
+ });
+ }
+
+ public void testSurfaceControlFrameRateCompatibility(
+ @Surface.FrameRateCompatibility int compatibility) throws InterruptedException {
+ runTestsWithPreconditions(
+ () -> testSurfaceControlFrameRateCompatibilityInternal(compatibility),
+ "frame rate compatibility=" + compatibility);
+ }
+
+ private void testSurfaceControlFrameRateCategoryInternal(
+ @Surface.FrameRateCategory int category) throws InterruptedException {
runOneSurfaceTest((TestSurface surface) -> {
Log.i(TAG, "**** Running testSurfaceControlFrameRateCategory for category " + category);
- float expectedFrameRate = getExpectedFrameRate(category);
+ float expectedFrameRate = getExpectedFrameRateForCategory(category);
int initialNumEvents = mModeChangedEvents.size();
surface.setFrameRateCategory(category);
verifyCompatibleAndStableFrameRate(expectedFrameRate, surface);
@@ -681,7 +707,8 @@
});
}
- public void testSurfaceControlFrameRateCategory(int category) throws InterruptedException {
+ public void testSurfaceControlFrameRateCategory(@Surface.FrameRateCategory int category)
+ throws InterruptedException {
runTestsWithPreconditions(()
-> testSurfaceControlFrameRateCategoryInternal(category),
"frame rate category=" + category);
@@ -744,7 +771,24 @@
"frame rate strategy=" + parentStrategy);
}
- private float getExpectedFrameRate(int category) {
+ private float getExpectedFrameRateForCompatibility(int compatibility) {
+ assumeTrue("**** testSurfaceControlFrameRateCompatibility SKIPPED for compatibility "
+ + compatibility,
+ compatibility == Surface.FRAME_RATE_COMPATIBILITY_GTE);
+
+ Display display = getDisplay();
+ Optional<Float> expectedFrameRate = getRefreshRates(display.getMode(), display)
+ .stream()
+ .filter(rate -> rate >= 30.f)
+ .min(Comparator.naturalOrder());
+
+ assumeTrue("**** testSurfaceControlFrameRateCompatibility SKIPPED because no refresh rate "
+ + "is >= 30",
+ expectedFrameRate.isPresent());
+ return expectedFrameRate.get();
+ }
+
+ private float getExpectedFrameRateForCategory(int category) {
Display display = getDisplay();
List<Float> frameRates = getRefreshRates(display.getMode(), display);
diff --git a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
index 29f6879..4b56c10 100644
--- a/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
+++ b/tests/CtsSurfaceControlTestsStaging/src/main/java/android/view/surfacecontroltests/SurfaceControlTest.java
@@ -81,6 +81,12 @@
}
@Test
+ public void testSurfaceControlFrameRateCompatibilityGte() throws InterruptedException {
+ GraphicsActivity activity = mActivityRule.getActivity();
+ activity.testSurfaceControlFrameRateCompatibility(Surface.FRAME_RATE_COMPATIBILITY_GTE);
+ }
+
+ @Test
public void testSurfaceControlFrameRateCategoryHigh() throws InterruptedException {
GraphicsActivity activity = mActivityRule.getActivity();
activity.testSurfaceControlFrameRateCategory(Surface.FRAME_RATE_CATEGORY_HIGH);
diff --git a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
index 44de6a6..9c33576 100644
--- a/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyboardLayoutManagerTests.kt
@@ -63,6 +63,7 @@
deviceId: Int,
vendorId: Int,
productId: Int,
+ deviceBus: Int,
languageTag: String,
layoutType: String
): InputDevice =
@@ -75,6 +76,7 @@
.setExternal(true)
.setVendorId(vendorId)
.setProductId(productId)
+ .setDeviceBus(deviceBus)
.setKeyboardLanguageTag(languageTag)
.setKeyboardLayoutType(layoutType)
.build()
@@ -94,6 +96,7 @@
const val ENGLISH_QWERTY_DEVICE_ID = 4
const val DEFAULT_VENDOR_ID = 123
const val DEFAULT_PRODUCT_ID = 456
+ const val DEFAULT_DEVICE_BUS = 789
const val USER_ID = 4
const val IME_ID = "ime_id"
const val PACKAGE_NAME = "KeyboardLayoutManagerTests"
@@ -177,12 +180,14 @@
Mockito.`when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
.thenReturn(inputManager)
- keyboardDevice = createKeyboard(DEVICE_ID, DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID, "", "")
- vendorSpecificKeyboardDevice = createKeyboard(VENDOR_SPECIFIC_DEVICE_ID, 1, 1, "", "")
+ keyboardDevice = createKeyboard(DEVICE_ID, DEFAULT_VENDOR_ID, DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS, "", "")
+ vendorSpecificKeyboardDevice = createKeyboard(VENDOR_SPECIFIC_DEVICE_ID, 1, 1,
+ 1, "", "")
englishDvorakKeyboardDevice = createKeyboard(ENGLISH_DVORAK_DEVICE_ID, DEFAULT_VENDOR_ID,
- DEFAULT_PRODUCT_ID, "en", "dvorak")
+ DEFAULT_PRODUCT_ID, DEFAULT_DEVICE_BUS, "en", "dvorak")
englishQwertyKeyboardDevice = createKeyboard(ENGLISH_QWERTY_DEVICE_ID, DEFAULT_VENDOR_ID,
- DEFAULT_PRODUCT_ID, "en", "qwerty")
+ DEFAULT_PRODUCT_ID, DEFAULT_DEVICE_BUS, "en", "qwerty")
Mockito.`when`(iInputManager.inputDeviceIds)
.thenReturn(intArrayOf(
DEVICE_ID,
@@ -861,7 +866,9 @@
GERMAN_LAYOUT_NAME,
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_VIRTUAL_KEYBOARD,
"de-Latn",
- LAYOUT_TYPE_QWERTZ))
+ LAYOUT_TYPE_QWERTZ),
+ ),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -887,7 +894,8 @@
ENGLISH_US_LAYOUT_NAME,
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEVICE,
"de-Latn",
- LAYOUT_TYPE_QWERTZ))
+ LAYOUT_TYPE_QWERTZ)),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -911,7 +919,9 @@
"Default",
KeyboardMetricsCollector.LAYOUT_SELECTION_CRITERIA_DEFAULT,
KeyboardMetricsCollector.DEFAULT_LANGUAGE_TAG,
- LAYOUT_TYPE_DEFAULT))
+ LAYOUT_TYPE_DEFAULT),
+ ),
+ ArgumentMatchers.eq(keyboardDevice.deviceBus),
)
}
}
@@ -929,7 +939,8 @@
ArgumentMatchers.anyBoolean(),
ArgumentMatchers.anyInt(),
ArgumentMatchers.anyInt(),
- ArgumentMatchers.any(ByteArray::class.java)
+ ArgumentMatchers.any(ByteArray::class.java),
+ ArgumentMatchers.anyInt(),
)
}, Mockito.times(0))
}
@@ -972,8 +983,13 @@
}
private fun createByteArray(
- expectedLanguageTag: String, expectedLayoutType: Int, expectedLayoutName: String,
- expectedCriteria: Int, expectedImeLanguageTag: String, expectedImeLayoutType: Int): ByteArray {
+ expectedLanguageTag: String,
+ expectedLayoutType: Int,
+ expectedLayoutName: String,
+ expectedCriteria: Int,
+ expectedImeLanguageTag: String,
+ expectedImeLayoutType: Int
+ ): ByteArray {
val proto = ProtoOutputStream()
val keyboardLayoutConfigToken = proto.start(
KeyboardConfiguredProto.RepeatedKeyboardLayoutConfig.KEYBOARD_LAYOUT_CONFIG)
@@ -1001,7 +1017,7 @@
KeyboardConfiguredProto.KeyboardLayoutConfig.IME_LAYOUT_TYPE,
expectedImeLayoutType
)
- proto.end(keyboardLayoutConfigToken);
+ proto.end(keyboardLayoutConfigToken)
return proto.bytes
}
diff --git a/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt b/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
index 33ff09b..89a47b9 100644
--- a/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
+++ b/tests/Input/src/com/android/server/input/KeyboardMetricsCollectorTests.kt
@@ -30,6 +30,7 @@
deviceId: Int,
vendorId: Int,
productId: Int,
+ deviceBus: Int,
languageTag: String?,
layoutType: String?
): InputDevice =
@@ -42,6 +43,7 @@
.setExternal(true)
.setVendorId(vendorId)
.setProductId(productId)
+ .setDeviceBus(deviceBus)
.setKeyboardLanguageTag(languageTag)
.setKeyboardLayoutType(layoutType)
.build()
@@ -67,6 +69,7 @@
const val DEVICE_ID = 1
const val DEFAULT_VENDOR_ID = 123
const val DEFAULT_PRODUCT_ID = 456
+ const val DEFAULT_DEVICE_BUS = 789
}
@Test
@@ -77,6 +80,7 @@
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
null,
null
)
@@ -92,6 +96,7 @@
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
null,
null
)
@@ -107,6 +112,7 @@
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
"de-CH",
"qwertz"
)
@@ -135,6 +141,11 @@
DEFAULT_PRODUCT_ID,
event.productId
)
+ assertEquals(
+ "KeyboardConfigurationEvent should pick device bus from provided InputDevice",
+ DEFAULT_DEVICE_BUS,
+ event.deviceBus
+ )
assertTrue(event.isFirstConfiguration)
assertEquals(
@@ -178,6 +189,7 @@
DEVICE_ID,
DEFAULT_VENDOR_ID,
DEFAULT_PRODUCT_ID,
+ DEFAULT_DEVICE_BUS,
"und", // Undefined language tag
"azerty"
)
diff --git a/tests/Internal/Android.bp b/tests/Internal/Android.bp
index ddec8fa..a487799 100644
--- a/tests/Internal/Android.bp
+++ b/tests/Internal/Android.bp
@@ -27,3 +27,16 @@
platform_apis: true,
test_suites: ["device-tests"],
}
+
+android_ravenwood_test {
+ name: "InternalTestsRavenwood",
+ static_libs: [
+ "androidx.annotation_annotation",
+ "androidx.test.rules",
+ "platform-test-annotations",
+ ],
+ srcs: [
+ "src/com/android/internal/util/ParcellingTests.java",
+ ],
+ auto_gen_config: true,
+}
diff --git a/tests/NetworkSecurityConfigTest/OWNERS b/tests/NetworkSecurityConfigTest/OWNERS
index aa87958..90e1bed 100644
--- a/tests/NetworkSecurityConfigTest/OWNERS
+++ b/tests/NetworkSecurityConfigTest/OWNERS
@@ -1 +1,2 @@
include /services/core/java/com/android/server/net/OWNERS
+include /core/java/android/security/net/OWNERS
diff --git a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
index 1dfd5c0..d0e5626 100644
--- a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
+++ b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt
@@ -93,7 +93,7 @@
}
@Test
- @RequiresFlagsEnabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS)
+ @RequiresFlagsEnabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2)
fun grantCannotActivelyUnlockDevice() {
// On automotive, trust agents can actively unlock the device.
assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE))
@@ -120,7 +120,7 @@
}
@Test
- @RequiresFlagsDisabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS)
+ @RequiresFlagsDisabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2)
fun grantCouldCauseWrongDeviceLockedStateDueToBug() {
// On automotive, trust agents can actively unlock the device.
assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE))
diff --git a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
index 5a8f828..0121809 100644
--- a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
+++ b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt
@@ -36,7 +36,8 @@
class LockStateTrackingRule : TestRule {
private val context: Context = getApplicationContext()
private val windowManager = checkNotNull(WindowManagerGlobal.getWindowManagerService())
- private val keyguardManager = context.getSystemService(KeyguardManager::class.java) as KeyguardManager
+ private val keyguardManager =
+ context.getSystemService(KeyguardManager::class.java) as KeyguardManager
@Volatile lateinit var trustState: TrustState
private set
@@ -63,7 +64,7 @@
wait("not trusted") { trustState.trusted == false }
}
- // TODO(b/299298338) remove this when removing FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS
+ // TODO(b/299298338) remove this when removing FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS_V2
fun assertUnlockedButNotReally() {
wait("device unlocked") { !keyguardManager.isDeviceLocked }
wait("not trusted") { trustState.trusted == false }
@@ -87,7 +88,7 @@
trustGrantedMessages: MutableList<String>
) {
Log.d(TAG, "Device became trusted=$enabled")
- trustState = trustState.copy(trusted=enabled)
+ trustState = trustState.copy(trusted = enabled)
}
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 412aa9b..275a0e2 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -92,10 +92,6 @@
srcs: [
"compile/IdAssigner.cpp",
"compile/InlineXmlFormatParser.cpp",
- "compile/NinePatch.cpp",
- "compile/Png.cpp",
- "compile/PngChunkFilter.cpp",
- "compile/PngCrunch.cpp",
"compile/PseudolocaleGenerator.cpp",
"compile/Pseudolocalizer.cpp",
"compile/XmlIdCollector.cpp",
@@ -112,9 +108,7 @@
"format/binary/XmlFlattener.cpp",
"format/proto/ProtoDeserialize.cpp",
"format/proto/ProtoSerialize.cpp",
- "io/BigBufferStream.cpp",
"io/File.cpp",
- "io/FileStream.cpp",
"io/FileSystem.cpp",
"io/StringStream.cpp",
"io/Util.cpp",
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index 6b1fd9f..d6502d8 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -18,12 +18,12 @@
#include "ResourceValues.h"
#include "ValueVisitor.h"
+#include "androidfw/BigBufferStream.h"
#include "format/Archive.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "xml/XmlDom.h"
@@ -48,7 +48,7 @@
}
// First try in proto format.
- std::unique_ptr<io::InputStream> manifest_in = manifest_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> manifest_in = manifest_file->OpenInputStream();
if (manifest_in != nullptr) {
pb::XmlNode pb_node;
io::ProtoInputStreamReader proto_reader(manifest_in.get());
@@ -102,7 +102,7 @@
io::IFile* table_file = collection->FindFile(kProtoResourceTablePath);
if (table_file != nullptr) {
pb::ResourceTable pb_table;
- std::unique_ptr<io::InputStream> in = table_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> in = table_file->OpenInputStream();
if (in == nullptr) {
diag->Error(android::DiagMessage(source) << "failed to open " << kProtoResourceTablePath);
return {};
@@ -129,7 +129,7 @@
return {};
}
- std::unique_ptr<io::InputStream> manifest_in = manifest_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> manifest_in = manifest_file->OpenInputStream();
if (manifest_in == nullptr) {
diag->Error(android::DiagMessage(source) << "failed to open " << kAndroidManifestPath);
return {};
@@ -262,7 +262,7 @@
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
if (!io::CopyInputStreamToArchive(context,
&input_stream,
path,
@@ -296,7 +296,7 @@
}
uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u;
- io::BigBufferInputStream manifest_buffer_in(&buffer);
+ android::BigBufferInputStream manifest_buffer_in(&buffer);
if (!io::CopyInputStreamToArchive(context, &manifest_buffer_in, path, compression_flags,
writer)) {
return false;
@@ -321,7 +321,7 @@
std::unique_ptr<xml::XmlResource> doc;
if (format_ == ApkFormat::kProto) {
- std::unique_ptr<io::InputStream> in = file->OpenInputStream();
+ std::unique_ptr<android::InputStream> in = file->OpenInputStream();
if (!in) {
diag->Error(android::DiagMessage() << "failed to open file");
return nullptr;
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index a0b4dab..b351d6e 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,6 +27,7 @@
#include "Diagnostics.h"
#include "android-base/stringprintf.h"
#include "android-base/utf8.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/StringPiece.h"
#include "cmd/ApkInfo.h"
@@ -37,7 +38,6 @@
#include "cmd/Dump.h"
#include "cmd/Link.h"
#include "cmd/Optimize.h"
-#include "io/FileStream.h"
#include "trace/TraceBuffer.h"
#include "util/Files.h"
#include "util/Util.h"
@@ -99,7 +99,7 @@
*/
class DaemonCommand : public Command {
public:
- explicit DaemonCommand(io::FileOutputStream* out, android::IDiagnostics* diagnostics)
+ explicit DaemonCommand(android::FileOutputStream* out, android::IDiagnostics* diagnostics)
: Command("daemon", "m"), out_(out), diagnostics_(diagnostics) {
SetDescription("Runs aapt in daemon mode. Each subsequent line is a single parameter to the\n"
"command. The end of an invocation is signaled by providing an empty line.");
@@ -147,7 +147,7 @@
}
private:
- io::FileOutputStream* out_;
+ android::FileOutputStream* out_;
android::IDiagnostics* diagnostics_;
std::optional<std::string> trace_folder_;
};
@@ -167,7 +167,7 @@
// Use a smaller buffer so that there is less latency for printing to stdout.
constexpr size_t kStdOutBufferSize = 1024u;
- aapt::io::FileOutputStream fout(STDOUT_FILENO, kStdOutBufferSize);
+ android::FileOutputStream fout(STDOUT_FILENO, kStdOutBufferSize);
aapt::text::Printer printer(&fout);
aapt::StdErrDiagnostics diagnostics;
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 728ba8a..031dd5b 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -25,13 +25,16 @@
#include "android-base/errors.h"
#include "android-base/file.h"
#include "android-base/utf8.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Image.h"
+#include "androidfw/Png.h"
#include "androidfw/StringPiece.h"
#include "cmd/Util.h"
#include "compile/IdAssigner.h"
#include "compile/InlineXmlFormatParser.h"
-#include "compile/Png.h"
#include "compile/PseudolocaleGenerator.h"
#include "compile/XmlIdCollector.h"
#include "format/Archive.h"
@@ -39,8 +42,6 @@
#include "format/proto/ProtoSerialize.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
-#include "io/BigBufferStream.h"
-#include "io/FileStream.h"
#include "io/FileSystem.h"
#include "io/StringStream.h"
#include "io/Util.h"
@@ -52,9 +53,9 @@
#include "xml/XmlDom.h"
#include "xml/XmlPullParser.h"
-using ::aapt::io::FileInputStream;
using ::aapt::text::Printer;
using ::android::ConfigDescription;
+using ::android::FileInputStream;
using ::android::StringPiece;
using ::android::base::SystemErrorCodeToString;
using ::google::protobuf::io::CopyingOutputStreamAdaptor;
@@ -241,7 +242,7 @@
}
if (options.generate_text_symbols_path) {
- io::FileOutputStream fout_text(options.generate_text_symbols_path.value());
+ android::FileOutputStream fout_text(options.generate_text_symbols_path.value());
if (fout_text.HadError()) {
context->GetDiagnostics()->Error(android::DiagMessage()
@@ -307,7 +308,7 @@
}
static bool WriteHeaderAndDataToWriter(StringPiece output_path, const ResourceFile& file,
- io::KnownSizeInputStream* in, IArchiveWriter* writer,
+ android::KnownSizeInputStream* in, IArchiveWriter* writer,
android::IDiagnostics* diag) {
TRACE_CALL();
// Start the entry so we can write the header.
@@ -448,7 +449,7 @@
}
if (options.generate_text_symbols_path) {
- io::FileOutputStream fout_text(options.generate_text_symbols_path.value());
+ android::FileOutputStream fout_text(options.generate_text_symbols_path.value());
if (fout_text.HadError()) {
context->GetDiagnostics()->Error(android::DiagMessage()
@@ -498,21 +499,22 @@
}
android::BigBuffer crunched_png_buffer(4096);
- io::BigBufferOutputStream crunched_png_buffer_out(&crunched_png_buffer);
+ android::BigBufferOutputStream crunched_png_buffer_out(&crunched_png_buffer);
// Ensure that we only keep the chunks we care about if we end up
// using the original PNG instead of the crunched one.
const StringPiece content(reinterpret_cast<const char*>(data->data()), data->size());
- PngChunkFilter png_chunk_filter(content);
- std::unique_ptr<Image> image = ReadPng(context, path_data.source, &png_chunk_filter);
+ android::PngChunkFilter png_chunk_filter(content);
+ android::SourcePathDiagnostics source_diag(path_data.source, context->GetDiagnostics());
+ auto image = android::ReadPng(&png_chunk_filter, &source_diag);
if (!image) {
return false;
}
- std::unique_ptr<NinePatch> nine_patch;
+ std::unique_ptr<android::NinePatch> nine_patch;
if (path_data.extension == "9.png") {
std::string err;
- nine_patch = NinePatch::Create(image->rows.get(), image->width, image->height, &err);
+ nine_patch = android::NinePatch::Create(image->rows.get(), image->width, image->height, &err);
if (!nine_patch) {
context->GetDiagnostics()->Error(android::DiagMessage() << err);
return false;
@@ -537,7 +539,8 @@
}
// Write the crunched PNG.
- if (!WritePng(context, image.get(), nine_patch.get(), &crunched_png_buffer_out, {})) {
+ if (!android::WritePng(image.get(), nine_patch.get(), &crunched_png_buffer_out, {},
+ &source_diag, context->IsVerbose())) {
return false;
}
@@ -557,7 +560,7 @@
png_chunk_filter.Rewind();
android::BigBuffer filtered_png_buffer(4096);
- io::BigBufferOutputStream filtered_png_buffer_out(&filtered_png_buffer);
+ android::BigBufferOutputStream filtered_png_buffer_out(&filtered_png_buffer);
io::Copy(&filtered_png_buffer_out, &png_chunk_filter);
buffer.AppendBuffer(std::move(filtered_png_buffer));
}
@@ -567,7 +570,7 @@
// This will help catch exotic cases where the new code may generate larger PNGs.
std::stringstream legacy_stream{std::string(content)};
android::BigBuffer legacy_buffer(4096);
- Png png(context->GetDiagnostics());
+ android::Png png(context->GetDiagnostics());
if (!png.process(path_data.source, &legacy_stream, &legacy_buffer, {})) {
return false;
}
@@ -578,7 +581,7 @@
}
}
- io::BigBufferInputStream buffer_in(&buffer);
+ android::BigBufferInputStream buffer_in(&buffer);
return WriteHeaderAndDataToWriter(output_path, res_file, &buffer_in, writer,
context->GetDiagnostics());
}
diff --git a/tools/aapt2/cmd/Compile_test.cpp b/tools/aapt2/cmd/Compile_test.cpp
index 8880089..9337cb9 100644
--- a/tools/aapt2/cmd/Compile_test.cpp
+++ b/tools/aapt2/cmd/Compile_test.cpp
@@ -341,7 +341,7 @@
// Check resources.pb contains relative sources.
io::IFile* proto_file =
apk.get()->GetFileCollection()->FindFile("resources.pb");
- std::unique_ptr<io::InputStream> proto_stream = proto_file->OpenInputStream();
+ std::unique_ptr<android::InputStream> proto_stream = proto_file->OpenInputStream();
io::ProtoInputStreamReader proto_reader(proto_stream.get());
pb::ResourceTable pb_table;
proto_reader.ReadMessage(&pb_table);
diff --git a/tools/aapt2/cmd/Convert.cpp b/tools/aapt2/cmd/Convert.cpp
index 387dcfe..c132792 100644
--- a/tools/aapt2/cmd/Convert.cpp
+++ b/tools/aapt2/cmd/Convert.cpp
@@ -24,13 +24,13 @@
#include "android-base/file.h"
#include "android-base/macros.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/StringPiece.h"
#include "cmd/Util.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
@@ -80,7 +80,7 @@
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, path, compression_flags, writer);
}
@@ -91,14 +91,14 @@
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, kApkResourceTablePath,
ArchiveEntry::kAlign, writer);
}
bool SerializeFile(FileReference* file, IArchiveWriter* writer) override {
if (file->type == ResourceFile::Type::kProtoXml) {
- unique_ptr<io::InputStream> in = file->file->OpenInputStream();
+ unique_ptr<android::InputStream> in = file->file->OpenInputStream();
if (in == nullptr) {
context_->GetDiagnostics()->Error(android::DiagMessage(source_)
<< "failed to open file " << *file->path);
diff --git a/tools/aapt2/cmd/Dump.cpp b/tools/aapt2/cmd/Dump.cpp
index 864af06..6fa9ecb 100644
--- a/tools/aapt2/cmd/Dump.cpp
+++ b/tools/aapt2/cmd/Dump.cpp
@@ -19,19 +19,18 @@
#include <cinttypes>
#include <vector>
-#include "android-base/stringprintf.h"
-#include "androidfw/ConfigDescription.h"
-#include "androidfw/StringPiece.h"
-
#include "Debug.h"
#include "Diagnostics.h"
#include "LoadedApk.h"
#include "Util.h"
+#include "android-base/stringprintf.h"
+#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
+#include "androidfw/StringPiece.h"
#include "format/Container.h"
#include "format/binary/BinaryResourceParser.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
-#include "io/FileStream.h"
#include "io/ZipArchive.h"
#include "process/IResourceTableConsumer.h"
#include "text/Printer.h"
@@ -145,7 +144,7 @@
bool error = false;
for (auto container : args) {
- io::FileInputStream input(container);
+ android::FileInputStream input(container);
if (input.HadError()) {
context.GetDiagnostics()->Error(android::DiagMessage(container)
<< "failed to open file: " << input.GetError());
diff --git a/tools/aapt2/cmd/Dump.h b/tools/aapt2/cmd/Dump.h
index 76d33d7..119a59b 100644
--- a/tools/aapt2/cmd/Dump.h
+++ b/tools/aapt2/cmd/Dump.h
@@ -17,7 +17,7 @@
#ifndef AAPT2_DUMP_H
#define AAPT2_DUMP_H
-#include <io/FileStream.h>
+#include <androidfw/FileStream.h>
#include <io/ZipArchive.h>
#include "Command.h"
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index c638873..9ca546f 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -35,6 +35,8 @@
#include "android-base/expected.h"
#include "android-base/file.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
+#include "androidfw/FileStream.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/Locale.h"
#include "androidfw/StringPiece.h"
@@ -48,8 +50,6 @@
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
#include "format/proto/ProtoSerialize.h"
-#include "io/BigBufferStream.h"
-#include "io/FileStream.h"
#include "io/FileSystem.h"
#include "io/Util.h"
#include "io/ZipArchive.h"
@@ -73,8 +73,8 @@
#include "util/Files.h"
#include "xml/XmlDom.h"
-using ::aapt::io::FileInputStream;
using ::android::ConfigDescription;
+using ::android::FileInputStream;
using ::android::StringPiece;
using ::android::base::expected;
using ::android::base::StringPrintf;
@@ -263,7 +263,7 @@
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kCompress,
writer);
} break;
@@ -284,7 +284,7 @@
static std::unique_ptr<xml::XmlResource> LoadXml(const std::string& path,
android::IDiagnostics* diag) {
TRACE_CALL();
- FileInputStream fin(path);
+ android::FileInputStream fin(path);
if (fin.HadError()) {
diag->Error(android::DiagMessage(path) << "failed to load XML file: " << fin.GetError());
return {};
@@ -687,7 +687,7 @@
static bool WriteStableIdMapToPath(android::IDiagnostics* diag,
const std::unordered_map<ResourceName, ResourceId>& id_map,
const std::string& id_map_path) {
- io::FileOutputStream fout(id_map_path);
+ android::FileOutputStream fout(id_map_path);
if (fout.HadError()) {
diag->Error(android::DiagMessage(id_map_path) << "failed to open: " << fout.GetError());
return false;
@@ -1197,7 +1197,7 @@
return false;
}
- io::BigBufferInputStream input_stream(&buffer);
+ android::BigBufferInputStream input_stream(&buffer);
return io::CopyInputStreamToArchive(context_, &input_stream, kApkResourceTablePath,
ArchiveEntry::kAlign, writer);
} break;
@@ -1221,7 +1221,7 @@
}
std::string out_path;
- std::unique_ptr<io::FileOutputStream> fout;
+ std::unique_ptr<android::FileOutputStream> fout;
if (options_.generate_java_class_path) {
out_path = options_.generate_java_class_path.value();
file::AppendPath(&out_path, file::PackageToPath(out_package));
@@ -1233,7 +1233,7 @@
file::AppendPath(&out_path, "R.java");
- fout = util::make_unique<io::FileOutputStream>(out_path);
+ fout = util::make_unique<android::FileOutputStream>(out_path);
if (fout->HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage()
<< "failed writing to '" << out_path
@@ -1242,9 +1242,9 @@
}
}
- std::unique_ptr<io::FileOutputStream> fout_text;
+ std::unique_ptr<android::FileOutputStream> fout_text;
if (out_text_symbols_path) {
- fout_text = util::make_unique<io::FileOutputStream>(out_text_symbols_path.value());
+ fout_text = util::make_unique<android::FileOutputStream>(out_text_symbols_path.value());
if (fout_text->HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage()
<< "failed writing to '" << out_text_symbols_path.value()
@@ -1386,7 +1386,7 @@
file::AppendPath(&out_path, "Manifest.java");
- io::FileOutputStream fout(out_path);
+ android::FileOutputStream fout(out_path);
if (fout.HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage() << "failed to open '" << out_path
<< "': " << fout.GetError());
@@ -1412,7 +1412,7 @@
}
const std::string& out_path = out.value();
- io::FileOutputStream fout(out_path);
+ android::FileOutputStream fout(out_path);
if (fout.HadError()) {
context_->GetDiagnostics()->Error(android::DiagMessage() << "failed to open '" << out_path
<< "': " << fout.GetError());
@@ -1601,7 +1601,7 @@
}
}
- std::unique_ptr<io::InputStream> input_stream = file->OpenInputStream();
+ std::unique_ptr<android::InputStream> input_stream = file->OpenInputStream();
if (input_stream == nullptr) {
context_->GetDiagnostics()->Error(android::DiagMessage(src) << "failed to open file");
return false;
diff --git a/tools/aapt2/cmd/Optimize.cpp b/tools/aapt2/cmd/Optimize.cpp
index f045dad..762441e 100644
--- a/tools/aapt2/cmd/Optimize.cpp
+++ b/tools/aapt2/cmd/Optimize.cpp
@@ -30,6 +30,7 @@
#include "ValueVisitor.h"
#include "android-base/file.h"
#include "android-base/stringprintf.h"
+#include "androidfw/BigBufferStream.h"
#include "androidfw/ConfigDescription.h"
#include "androidfw/IDiagnostics.h"
#include "androidfw/ResourceTypes.h"
@@ -39,7 +40,6 @@
#include "filter/AbiFilter.h"
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
-#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "optimize/MultiApkGenerator.h"
#include "optimize/Obfuscator.h"
@@ -249,7 +249,7 @@
return false;
}
- io::BigBufferInputStream manifest_buffer_in(&manifest_buffer);
+ android::BigBufferInputStream manifest_buffer_in(&manifest_buffer);
if (!io::CopyInputStreamToArchive(context_, &manifest_buffer_in, "AndroidManifest.xml",
ArchiveEntry::kCompress, writer)) {
return false;
@@ -297,7 +297,7 @@
return false;
}
- io::BigBufferInputStream table_buffer_in(&table_buffer);
+ android::BigBufferInputStream table_buffer_in(&table_buffer);
return io::CopyInputStreamToArchive(context_, &table_buffer_in, "resources.arsc",
ArchiveEntry::kAlign, writer);
}
diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp
index a2b4818..a596229 100644
--- a/tools/aapt2/dump/DumpManifest.cpp
+++ b/tools/aapt2/dump/DumpManifest.cpp
@@ -29,8 +29,8 @@
#include "SdkConstants.h"
#include "ValueVisitor.h"
#include "androidfw/ConfigDescription.h"
+#include "androidfw/FileStream.h"
#include "io/File.h"
-#include "io/FileStream.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
diff --git a/tools/aapt2/format/Archive.cpp b/tools/aapt2/format/Archive.cpp
index e9a93d8..91768a0 100644
--- a/tools/aapt2/format/Archive.cpp
+++ b/tools/aapt2/format/Archive.cpp
@@ -91,7 +91,7 @@
return true;
}
- bool WriteFile(StringPiece path, uint32_t flags, io::InputStream* in) override {
+ bool WriteFile(StringPiece path, uint32_t flags, android::InputStream* in) override {
if (!StartEntry(path, flags)) {
return false;
}
@@ -182,7 +182,7 @@
return true;
}
- bool WriteFile(StringPiece path, uint32_t flags, io::InputStream* in) override {
+ bool WriteFile(StringPiece path, uint32_t flags, android::InputStream* in) override {
while (true) {
if (!StartEntry(path, flags)) {
return false;
diff --git a/tools/aapt2/format/Archive.h b/tools/aapt2/format/Archive.h
index 6cde753..3c3d0ab 100644
--- a/tools/aapt2/format/Archive.h
+++ b/tools/aapt2/format/Archive.h
@@ -24,9 +24,9 @@
#include "androidfw/BigBuffer.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
#include "google/protobuf/io/zero_copy_stream_impl_lite.h"
-#include "io/Io.h"
#include "util/Files.h"
namespace aapt {
@@ -46,7 +46,7 @@
public:
virtual ~IArchiveWriter() = default;
- virtual bool WriteFile(android::StringPiece path, uint32_t flags, io::InputStream* in) = 0;
+ virtual bool WriteFile(android::StringPiece path, uint32_t flags, android::InputStream* in) = 0;
// Starts a new entry and allows caller to write bytes to it sequentially.
// Only use StartEntry if code you do not control needs to write to a CopyingOutputStream.
diff --git a/tools/aapt2/format/Archive_test.cpp b/tools/aapt2/format/Archive_test.cpp
index fd50af9..df105f8 100644
--- a/tools/aapt2/format/Archive_test.cpp
+++ b/tools/aapt2/format/Archive_test.cpp
@@ -95,7 +95,7 @@
void VerifyZipFile(const std::string& output_path, const std::string& file, const uint8_t array[]) {
std::unique_ptr<io::ZipFileCollection> zip = io::ZipFileCollection::Create(output_path, nullptr);
- std::unique_ptr<io::InputStream> stream = zip->FindFile(file)->OpenInputStream();
+ std::unique_ptr<android::InputStream> stream = zip->FindFile(file)->OpenInputStream();
std::vector<uint8_t> buffer;
const void* data;
diff --git a/tools/aapt2/format/Container.cpp b/tools/aapt2/format/Container.cpp
index 1ff6c49..cb4a225 100644
--- a/tools/aapt2/format/Container.cpp
+++ b/tools/aapt2/format/Container.cpp
@@ -94,7 +94,7 @@
}
bool ContainerWriter::AddResFileEntry(const pb::internal::CompiledFile& file,
- io::KnownSizeInputStream* in) {
+ android::KnownSizeInputStream* in) {
if (current_entry_count_ >= total_entry_count_) {
error_ = "too many entries being serialized";
return false;
@@ -264,7 +264,7 @@
return reader_->GetError();
}
-ContainerReader::ContainerReader(io::InputStream* in)
+ContainerReader::ContainerReader(android::InputStream* in)
: in_(in),
adaptor_(in),
coded_in_(&adaptor_),
diff --git a/tools/aapt2/format/Container.h b/tools/aapt2/format/Container.h
index 121c592..c5d5676 100644
--- a/tools/aapt2/format/Container.h
+++ b/tools/aapt2/format/Container.h
@@ -22,9 +22,9 @@
#include "Resources.pb.h"
#include "ResourcesInternal.pb.h"
#include "androidfw/BigBuffer.h"
+#include "androidfw/Streams.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/io/zero_copy_stream.h"
-#include "io/Io.h"
#include "io/Util.h"
namespace aapt {
@@ -39,7 +39,7 @@
explicit ContainerWriter(::google::protobuf::io::ZeroCopyOutputStream* out, size_t entry_count);
bool AddResTableEntry(const pb::ResourceTable& table);
- bool AddResFileEntry(const pb::internal::CompiledFile& file, io::KnownSizeInputStream* in);
+ bool AddResFileEntry(const pb::internal::CompiledFile& file, android::KnownSizeInputStream* in);
bool HadError() const;
std::string GetError() const;
@@ -79,7 +79,7 @@
class ContainerReader {
public:
- explicit ContainerReader(io::InputStream* in);
+ explicit ContainerReader(android::InputStream* in);
ContainerReaderEntry* Next();
@@ -91,7 +91,7 @@
friend class ContainerReaderEntry;
- io::InputStream* in_;
+ android::InputStream* in_;
io::ZeroCopyInputAdaptor adaptor_;
::google::protobuf::io::CodedInputStream coded_in_;
size_t total_entry_count_;
diff --git a/tools/aapt2/io/Data.h b/tools/aapt2/io/Data.h
index db91a77..29f523a 100644
--- a/tools/aapt2/io/Data.h
+++ b/tools/aapt2/io/Data.h
@@ -20,15 +20,14 @@
#include <memory>
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "utils/FileMap.h"
-#include "io/Io.h"
-
namespace aapt {
namespace io {
// Interface for a block of contiguous memory. An instance of this interface owns the data.
-class IData : public KnownSizeInputStream {
+class IData : public android::KnownSizeInputStream {
public:
virtual ~IData() = default;
diff --git a/tools/aapt2/io/File.cpp b/tools/aapt2/io/File.cpp
index b4f1ff3..4dfdb5b 100644
--- a/tools/aapt2/io/File.cpp
+++ b/tools/aapt2/io/File.cpp
@@ -39,7 +39,7 @@
return {};
}
-std::unique_ptr<io::InputStream> FileSegment::OpenInputStream() {
+std::unique_ptr<android::InputStream> FileSegment::OpenInputStream() {
return OpenAsData();
}
diff --git a/tools/aapt2/io/File.h b/tools/aapt2/io/File.h
index 673d1b7..248756b 100644
--- a/tools/aapt2/io/File.h
+++ b/tools/aapt2/io/File.h
@@ -43,7 +43,7 @@
// Returns nullptr on failure.
virtual std::unique_ptr<IData> OpenAsData() = 0;
- virtual std::unique_ptr<io::InputStream> OpenInputStream() = 0;
+ virtual std::unique_ptr<android::InputStream> OpenInputStream() = 0;
// Returns the source of this file. This is for presentation to the user and
// may not be a valid file system path (for example, it may contain a '@' sign to separate
@@ -78,7 +78,7 @@
: file_(file), offset_(offset), len_(len) {}
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override {
return file_->GetSource();
diff --git a/tools/aapt2/io/FileSystem.cpp b/tools/aapt2/io/FileSystem.cpp
index 6a692e4..03fabcc 100644
--- a/tools/aapt2/io/FileSystem.cpp
+++ b/tools/aapt2/io/FileSystem.cpp
@@ -22,9 +22,9 @@
#include <sys/stat.h>
#include "android-base/errors.h"
+#include "androidfw/FileStream.h"
#include "androidfw/Source.h"
#include "androidfw/StringPiece.h"
-#include "io/FileStream.h"
#include "util/Files.h"
#include "util/Util.h"
#include "utils/FileMap.h"
@@ -49,8 +49,8 @@
return {};
}
-std::unique_ptr<io::InputStream> RegularFile::OpenInputStream() {
- return util::make_unique<FileInputStream>(source_.path);
+std::unique_ptr<android::InputStream> RegularFile::OpenInputStream() {
+ return util::make_unique<android::FileInputStream>(source_.path);
}
const android::Source& RegularFile::GetSource() const {
diff --git a/tools/aapt2/io/FileSystem.h b/tools/aapt2/io/FileSystem.h
index f975196..d6ecfeb 100644
--- a/tools/aapt2/io/FileSystem.h
+++ b/tools/aapt2/io/FileSystem.h
@@ -30,7 +30,7 @@
explicit RegularFile(const android::Source& source);
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override;
bool GetModificationTime(struct tm* buf) const override;
diff --git a/tools/aapt2/io/StringStream.cpp b/tools/aapt2/io/StringStream.cpp
index 9c49788..bb3911b 100644
--- a/tools/aapt2/io/StringStream.cpp
+++ b/tools/aapt2/io/StringStream.cpp
@@ -51,6 +51,23 @@
return str_.size();
}
+bool StringInputStream::ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) {
+ if (byte_count == 0) {
+ return true;
+ }
+ if (offset < 0) {
+ return false;
+ }
+ if (offset > std::numeric_limits<off64_t>::max() - byte_count) {
+ return false;
+ }
+ if (offset + byte_count > str_.size()) {
+ return false;
+ }
+ memcpy(data, str_.data() + offset, byte_count);
+ return true;
+}
+
StringOutputStream::StringOutputStream(std::string* str, size_t buffer_capacity)
: str_(str),
buffer_capacity_(buffer_capacity),
diff --git a/tools/aapt2/io/StringStream.h b/tools/aapt2/io/StringStream.h
index f7bdecca..7e1abe5 100644
--- a/tools/aapt2/io/StringStream.h
+++ b/tools/aapt2/io/StringStream.h
@@ -17,17 +17,16 @@
#ifndef AAPT_IO_STRINGSTREAM_H
#define AAPT_IO_STRINGSTREAM_H
-#include "io/Io.h"
-
#include <memory>
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
namespace aapt {
namespace io {
-class StringInputStream : public KnownSizeInputStream {
+class StringInputStream : public android::KnownSizeInputStream {
public:
explicit StringInputStream(android::StringPiece str);
@@ -47,6 +46,8 @@
size_t TotalSize() const override;
+ bool ReadFullyAtOffset(void* data, size_t byte_count, off64_t offset) override;
+
private:
DISALLOW_COPY_AND_ASSIGN(StringInputStream);
@@ -54,7 +55,7 @@
size_t offset_;
};
-class StringOutputStream : public OutputStream {
+class StringOutputStream : public android::OutputStream {
public:
explicit StringOutputStream(std::string* str, size_t buffer_capacity = 4096u);
diff --git a/tools/aapt2/io/Util.cpp b/tools/aapt2/io/Util.cpp
index 79d8d52..9616e47 100644
--- a/tools/aapt2/io/Util.cpp
+++ b/tools/aapt2/io/Util.cpp
@@ -26,8 +26,9 @@
namespace aapt {
namespace io {
-bool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, std::string_view out_path,
- uint32_t compression_flags, IArchiveWriter* writer) {
+bool CopyInputStreamToArchive(IAaptContext* context, android::InputStream* in,
+ std::string_view out_path, uint32_t compression_flags,
+ IArchiveWriter* writer) {
TRACE_CALL();
if (context->IsVerbose()) {
context->GetDiagnostics()->Note(android::DiagMessage()
@@ -91,7 +92,7 @@
return false;
}
-bool Copy(OutputStream* out, InputStream* in) {
+bool Copy(android::OutputStream* out, android::InputStream* in) {
TRACE_CALL();
const void* in_buffer;
size_t in_len;
@@ -110,7 +111,7 @@
return !in->HadError();
}
-bool Copy(OutputStream* out, StringPiece in) {
+bool Copy(android::OutputStream* out, StringPiece in) {
const char* in_buffer = in.data();
size_t in_len = in.size();
while (in_len != 0) {
@@ -129,7 +130,7 @@
return true;
}
-bool Copy(ZeroCopyOutputStream* out, InputStream* in) {
+bool Copy(ZeroCopyOutputStream* out, android::InputStream* in) {
OutputStreamAdaptor adaptor(out);
return Copy(&adaptor, in);
}
diff --git a/tools/aapt2/io/Util.h b/tools/aapt2/io/Util.h
index 685f522..25aa8f8 100644
--- a/tools/aapt2/io/Util.h
+++ b/tools/aapt2/io/Util.h
@@ -19,18 +19,19 @@
#include <string_view>
+#include "androidfw/Streams.h"
#include "format/Archive.h"
#include "google/protobuf/io/coded_stream.h"
#include "google/protobuf/message.h"
#include "io/File.h"
-#include "io/Io.h"
#include "process/IResourceTableConsumer.h"
namespace aapt {
namespace io {
-bool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, std::string_view out_path,
- uint32_t compression_flags, IArchiveWriter* writer);
+bool CopyInputStreamToArchive(IAaptContext* context, android::InputStream* in,
+ std::string_view out_path, uint32_t compression_flags,
+ IArchiveWriter* writer);
bool CopyFileToArchive(IAaptContext* context, IFile* file, std::string_view out_path,
uint32_t compression_flags, IArchiveWriter* writer);
@@ -44,11 +45,11 @@
// Copies the data from in to out. Returns false if there was an error.
// If there was an error, check the individual streams' HadError/GetError methods.
-bool Copy(OutputStream* out, InputStream* in);
-bool Copy(OutputStream* out, android::StringPiece in);
-bool Copy(::google::protobuf::io::ZeroCopyOutputStream* out, InputStream* in);
+bool Copy(android::OutputStream* out, android::InputStream* in);
+bool Copy(android::OutputStream* out, android::StringPiece in);
+bool Copy(::google::protobuf::io::ZeroCopyOutputStream* out, android::InputStream* in);
-class OutputStreamAdaptor : public io::OutputStream {
+class OutputStreamAdaptor : public android::OutputStream {
public:
explicit OutputStreamAdaptor(::google::protobuf::io::ZeroCopyOutputStream* out) : out_(out) {
}
@@ -84,7 +85,7 @@
class ZeroCopyInputAdaptor : public ::google::protobuf::io::ZeroCopyInputStream {
public:
- explicit ZeroCopyInputAdaptor(io::InputStream* in) : in_(in) {
+ explicit ZeroCopyInputAdaptor(android::InputStream* in) : in_(in) {
}
bool Next(const void** data, int* size) override {
@@ -119,12 +120,13 @@
private:
DISALLOW_COPY_AND_ASSIGN(ZeroCopyInputAdaptor);
- io::InputStream* in_;
+ android::InputStream* in_;
};
class ProtoInputStreamReader {
public:
- explicit ProtoInputStreamReader(io::InputStream* in) : in_(in) { }
+ explicit ProtoInputStreamReader(android::InputStream* in) : in_(in) {
+ }
/** Deserializes a Message proto from the current position in the input stream.*/
template <typename T> bool ReadMessage(T *message) {
@@ -135,7 +137,7 @@
}
private:
- io::InputStream* in_;
+ android::InputStream* in_;
};
} // namespace io
diff --git a/tools/aapt2/io/ZipArchive.cpp b/tools/aapt2/io/ZipArchive.cpp
index cb5bbe9..e44d61e 100644
--- a/tools/aapt2/io/ZipArchive.cpp
+++ b/tools/aapt2/io/ZipArchive.cpp
@@ -63,7 +63,7 @@
}
}
-std::unique_ptr<io::InputStream> ZipFile::OpenInputStream() {
+std::unique_ptr<android::InputStream> ZipFile::OpenInputStream() {
return OpenAsData();
}
diff --git a/tools/aapt2/io/ZipArchive.h b/tools/aapt2/io/ZipArchive.h
index ac125d0..a53c4a2 100644
--- a/tools/aapt2/io/ZipArchive.h
+++ b/tools/aapt2/io/ZipArchive.h
@@ -35,7 +35,7 @@
ZipFile(::ZipArchiveHandle handle, const ::ZipEntry& entry, const android::Source& source);
std::unique_ptr<IData> OpenAsData() override;
- std::unique_ptr<io::InputStream> OpenInputStream() override;
+ std::unique_ptr<android::InputStream> OpenInputStream() override;
const android::Source& GetSource() const override;
bool WasCompressed() override;
bool GetModificationTime(struct tm* buf) const override;
diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp
index 98f3bd2..db7aa35 100644
--- a/tools/aapt2/java/ClassDefinition.cpp
+++ b/tools/aapt2/java/ClassDefinition.cpp
@@ -111,7 +111,7 @@
" */\n\n";
void ClassDefinition::WriteJavaFile(const ClassDefinition* def, StringPiece package, bool final,
- bool strip_api_annotations, io::OutputStream* out) {
+ bool strip_api_annotations, android::OutputStream* out) {
Printer printer(out);
printer.Print(sWarningHeader).Print("package ").Print(package).Println(";");
printer.Println();
diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h
index 63c9982..84e3f33 100644
--- a/tools/aapt2/java/ClassDefinition.h
+++ b/tools/aapt2/java/ClassDefinition.h
@@ -241,7 +241,7 @@
class ClassDefinition : public ClassMember {
public:
static void WriteJavaFile(const ClassDefinition* def, android::StringPiece package, bool final,
- bool strip_api_annotations, io::OutputStream* out);
+ bool strip_api_annotations, android::OutputStream* out);
ClassDefinition(android::StringPiece name, ClassQualifier qualifier, bool createIfEmpty)
: name_(name), qualifier_(qualifier), create_if_empty_(createIfEmpty) {
diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp
index 7665d0e..58f6564 100644
--- a/tools/aapt2/java/JavaClassGenerator.cpp
+++ b/tools/aapt2/java/JavaClassGenerator.cpp
@@ -37,8 +37,8 @@
#include "java/ClassDefinition.h"
#include "process/SymbolTable.h"
-using ::aapt::io::OutputStream;
using ::aapt::text::Printer;
+using ::android::OutputStream;
using ::android::StringPiece;
using ::android::base::StringPrintf;
diff --git a/tools/aapt2/java/JavaClassGenerator.h b/tools/aapt2/java/JavaClassGenerator.h
index 234df04..9909eec 100644
--- a/tools/aapt2/java/JavaClassGenerator.h
+++ b/tools/aapt2/java/JavaClassGenerator.h
@@ -19,11 +19,10 @@
#include <string>
-#include "androidfw/StringPiece.h"
-
#include "ResourceTable.h"
#include "ResourceValues.h"
-#include "io/Io.h"
+#include "androidfw/Streams.h"
+#include "androidfw/StringPiece.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
#include "text/Printer.h"
@@ -70,12 +69,12 @@
// All symbols technically belong to a single package, but linked libraries will
// have their names mangled, denoting that they came from a different package.
// We need to generate these symbols in a separate file. Returns true on success.
- bool Generate(android::StringPiece package_name_to_generate, io::OutputStream* out,
- io::OutputStream* out_r_txt = nullptr);
+ bool Generate(android::StringPiece package_name_to_generate, android::OutputStream* out,
+ android::OutputStream* out_r_txt = nullptr);
bool Generate(android::StringPiece package_name_to_generate,
- android::StringPiece output_package_name, io::OutputStream* out,
- io::OutputStream* out_r_txt = nullptr);
+ android::StringPiece output_package_name, android::OutputStream* out,
+ android::OutputStream* out_r_txt = nullptr);
const std::string& GetError() const;
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 80a46d5..aef48fc 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -29,8 +29,8 @@
#include "util/Util.h"
#include "xml/XmlDom.h"
-using ::aapt::io::OutputStream;
using ::aapt::text::Printer;
+using ::android::OutputStream;
namespace aapt {
namespace proguard {
diff --git a/tools/aapt2/java/ProguardRules.h b/tools/aapt2/java/ProguardRules.h
index 267f7ed..876ef48 100644
--- a/tools/aapt2/java/ProguardRules.h
+++ b/tools/aapt2/java/ProguardRules.h
@@ -26,8 +26,8 @@
#include "ResourceTable.h"
#include "ValueVisitor.h"
#include "androidfw/Source.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
@@ -69,7 +69,7 @@
}
private:
- friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep,
+ friend void WriteKeepSet(const KeepSet& keep_set, android::OutputStream* out, bool minimal_keep,
bool no_location_reference);
friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
@@ -89,7 +89,7 @@
bool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set);
-void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out, bool minimal_keep,
+void WriteKeepSet(const KeepSet& keep_set, android::OutputStream* out, bool minimal_keep,
bool no_location_reference);
bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index e48668c..0437980 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -90,7 +90,7 @@
return {};
}
- std::unique_ptr<io::InputStream> OpenInputStream() override {
+ std::unique_ptr<android::InputStream> OpenInputStream() override {
return OpenAsData();
}
diff --git a/tools/aapt2/test/Fixture.cpp b/tools/aapt2/test/Fixture.cpp
index 428372f..b91abe5 100644
--- a/tools/aapt2/test/Fixture.cpp
+++ b/tools/aapt2/test/Fixture.cpp
@@ -20,6 +20,7 @@
#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/utf8.h>
+#include <androidfw/FileStream.h>
#include <androidfw/StringPiece.h>
#include <dirent.h>
#include <gmock/gmock.h>
@@ -28,7 +29,6 @@
#include "Diagnostics.h"
#include "cmd/Compile.h"
#include "cmd/Link.h"
-#include "io/FileStream.h"
#include "util/Files.h"
using testing::Eq;
diff --git a/tools/aapt2/text/Printer.cpp b/tools/aapt2/text/Printer.cpp
index 8e491ac..c2fa8cc 100644
--- a/tools/aapt2/text/Printer.cpp
+++ b/tools/aapt2/text/Printer.cpp
@@ -20,7 +20,7 @@
#include "io/Util.h"
-using ::aapt::io::OutputStream;
+using ::android::OutputStream;
using ::android::StringPiece;
namespace aapt {
diff --git a/tools/aapt2/text/Printer.h b/tools/aapt2/text/Printer.h
index f7ad98b..44f0fc5 100644
--- a/tools/aapt2/text/Printer.h
+++ b/tools/aapt2/text/Printer.h
@@ -18,17 +18,16 @@
#define AAPT_TEXT_PRINTER_H
#include "android-base/macros.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
-
namespace aapt {
namespace text {
// An indenting Printer that helps write formatted text to the OutputStream.
class Printer {
public:
- explicit Printer(::aapt::io::OutputStream* out) : out_(out) {
+ explicit Printer(android::OutputStream* out) : out_(out) {
}
Printer& Print(android::StringPiece str);
@@ -41,7 +40,7 @@
private:
DISALLOW_COPY_AND_ASSIGN(Printer);
- ::aapt::io::OutputStream* out_;
+ android::OutputStream* out_;
int indent_level_ = 0;
bool needs_indent_ = false;
bool error_ = false;
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 8dea8ea..49807db 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -30,7 +30,7 @@
#include "XmlPullParser.h"
#include "util/Util.h"
-using ::aapt::io::InputStream;
+using ::android::InputStream;
using ::android::StringPiece;
using ::android::StringPiece16;
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index c253b0a..9668b6a6 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -24,8 +24,8 @@
#include "Resource.h"
#include "ResourceValues.h"
#include "androidfw/IDiagnostics.h"
+#include "androidfw/Streams.h"
#include "androidfw/StringPiece.h"
-#include "io/Io.h"
#include "util/Util.h"
#include "xml/XmlUtil.h"
@@ -152,7 +152,7 @@
};
// Inflates an XML DOM from an InputStream, logging errors to the logger.
-std::unique_ptr<XmlResource> Inflate(io::InputStream* in, android::IDiagnostics* diag,
+std::unique_ptr<XmlResource> Inflate(android::InputStream* in, android::IDiagnostics* diag,
const android::Source& source);
// Inflates an XML DOM from a binary ResXMLTree.
diff --git a/tools/aapt2/xml/XmlPullParser.cpp b/tools/aapt2/xml/XmlPullParser.cpp
index d79446b..203832d 100644
--- a/tools/aapt2/xml/XmlPullParser.cpp
+++ b/tools/aapt2/xml/XmlPullParser.cpp
@@ -21,7 +21,7 @@
#include "xml/XmlPullParser.h"
#include "xml/XmlUtil.h"
-using ::aapt::io::InputStream;
+using ::android::InputStream;
using ::android::StringPiece;
namespace aapt {
diff --git a/tools/aapt2/xml/XmlPullParser.h b/tools/aapt2/xml/XmlPullParser.h
index fe4cd01..655e6dc 100644
--- a/tools/aapt2/xml/XmlPullParser.h
+++ b/tools/aapt2/xml/XmlPullParser.h
@@ -27,11 +27,10 @@
#include <string>
#include <vector>
-#include "android-base/macros.h"
-#include "androidfw/StringPiece.h"
-
#include "Resource.h"
-#include "io/Io.h"
+#include "android-base/macros.h"
+#include "androidfw/Streams.h"
+#include "androidfw/StringPiece.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlUtil.h"
@@ -66,7 +65,7 @@
static bool SkipCurrentElement(XmlPullParser* parser);
static bool IsGoodEvent(Event event);
- explicit XmlPullParser(io::InputStream* in);
+ explicit XmlPullParser(android::InputStream* in);
~XmlPullParser();
/**
@@ -179,7 +178,7 @@
std::vector<Attribute> attributes;
};
- io::InputStream* in_;
+ android::InputStream* in_;
XML_Parser parser_;
std::queue<EventData> event_queue_;
std::string error_;
diff --git a/tools/hoststubgen/README.md b/tools/hoststubgen/README.md
index b0a1262..3455b0a 100644
--- a/tools/hoststubgen/README.md
+++ b/tools/hoststubgen/README.md
@@ -2,19 +2,27 @@
## Overview
-This directory contains tools / sample code / investigation for host side test support.
+HostStubGen is a tool built for ravenwood. It can read an Android framework jar file
+(such as `framework-minus-apex.jar` or `framework-all.jar`) and
+converts them, so that they can be used on the Ravenwood environment.
+This directory contains the HostStubGen source code, tests and some library source files
+used at runtime.
+
+- HostStubGen itself is design to be agnostic to Android. It doesn't use any Android APIs
+(hidden or not). But it may use Android specific knowledge -- e.g. as of now,
+AndroidHeuristicsFilter has hardcoded heuristics to detect AIDL generated classes.
+
+- `test-tiny-framework/` contains basic tests that are agnostic to Android.
+
+- More Android specific build files and code are stored in `frameworks/base/Ravenwood.bp`
+ `frameworks/base/ravenwood`.
## Directories and files
- `hoststubgen/`
Contains source code of the "hoststubgen" tool and relevant code
- - `framework-policy-override.txt`
- This file contains "policy overrides", which allows to control what goes to stub/impl without
- having to touch the target java files. This allows quicker iteration, because you can skip
- having to rebuild framework.jar.
-
- `src/`
HostStubGen tool source code.
@@ -26,14 +34,12 @@
- `test-tiny-framework/` See `README.md` in it.
- - `test-framework` See `README.md` in it.
+ - `test-framework`
+ This directory was used during the prototype phase, but now that we have real ravenwood tests,
+ this directory is obsolete and should be deleted.
+
- `scripts`
- - `run-host-test.sh`
-
- Run a host side test. Use it instead of `atest` for now. (`atest` works "mostly" but it has
- problems.)
-
- `dump-jar.sh`
A script to dump the content of `*.class` and `*.jar` files.
@@ -53,8 +59,8 @@
### Run the tests
-- Run all relevant tests and test scripts. Some of thests are still expected to fail,
- but this should print "finished, with no unexpected failures" at the end.
+- Run all relevant tests and test scripts. All of it is expected to pass, and it'll print
+ "Ready to submit" at the end.
However, because some of the script it executes depend on internal file paths to Soong's
intermediate directory, some of it might fail when something changes in the build system.
@@ -74,3 +80,7 @@
(or at least check it.)
- The `HostStubGenTest-framework-test-host-test-lib` jar somehow contain all ASM classes? Figure out where the dependency is coming from.
+
+- At some point, we can move or delete all Android specific code to `frameworks/base/ravenwood`.
+ - `helper-framework-*-src` should be moved to `frameworks/base/ravenwood`
+ - `test-framework` should be deleted.
\ No newline at end of file
diff --git a/tools/hoststubgen/TEST_MAPPING b/tools/hoststubgen/TEST_MAPPING
index 192b6f2..eca258c 100644
--- a/tools/hoststubgen/TEST_MAPPING
+++ b/tools/hoststubgen/TEST_MAPPING
@@ -1,11 +1,13 @@
{
- "presubmit": [
- { "name": "tiny-framework-dump-test" },
- { "name": "hoststubgentest" },
- { "name": "hoststubgen-invoke-test" }
-
- // As a smoke test.
- // TODO: Enable it once the infra knows how to run it.
- // { "name": "CtsUtilTestCasesRavenwood" }
- ]
+ "presubmit": [
+ { "name": "tiny-framework-dump-test" },
+ { "name": "hoststubgentest" },
+ { "name": "hoststubgen-invoke-test" }
+ ],
+ "ravenwood-presubmit": [
+ {
+ "name": "CtsUtilTestCasesRavenwood",
+ "host": true
+ }
+ ]
}
diff --git a/tools/hoststubgen/hoststubgen/Android.bp b/tools/hoststubgen/hoststubgen/Android.bp
index 5949bca..0e2e158 100644
--- a/tools/hoststubgen/hoststubgen/Android.bp
+++ b/tools/hoststubgen/hoststubgen/Android.bp
@@ -274,6 +274,22 @@
],
}
+java_library_host {
+ name: "hoststubgen-helper-libcore-runtime",
+ defaults: ["hoststubgen-for-prototype-only-java"],
+ srcs: [
+ "helper-framework-runtime-src/libcore-fake/**/*.java",
+ ],
+}
+
+java_host_for_device {
+ name: "hoststubgen-helper-libcore-runtime.ravenwood",
+ defaults: ["hoststubgen-for-prototype-only-java"],
+ libs: [
+ "hoststubgen-helper-libcore-runtime",
+ ],
+}
+
java_library {
name: "hoststubgen-helper-framework-runtime.ravenwood",
defaults: ["hoststubgen-for-prototype-only-java"],
@@ -286,6 +302,7 @@
],
static_libs: [
"core-xml-for-device",
+ "hoststubgen-helper-libcore-runtime.ravenwood",
],
}
diff --git a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java
new file mode 100644
index 0000000..388156a
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/android/system/ErrnoException.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2011 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.system;
+
+import java.io.IOException;
+import java.net.SocketException;
+
+/**
+ * A checked exception thrown when {@link Os} methods fail. This exception contains the native
+ * errno value, for comparison against the constants in {@link OsConstants}, should sophisticated
+ * callers need to adjust their behavior based on the exact failure.
+ */
+public final class ErrnoException extends Exception {
+ private final String functionName;
+
+ /**
+ * The errno value, for comparison with the {@code E} constants in {@link OsConstants}.
+ */
+ public final int errno;
+
+ /**
+ * Constructs an instance with the given function name and errno value.
+ */
+ public ErrnoException(String functionName, int errno) {
+ this.functionName = functionName;
+ this.errno = errno;
+ }
+
+ /**
+ * Constructs an instance with the given function name, errno value, and cause.
+ */
+ public ErrnoException(String functionName, int errno, Throwable cause) {
+ super(cause);
+ this.functionName = functionName;
+ this.errno = errno;
+ }
+
+ /**
+ * Converts the stashed function name and errno value to a human-readable string.
+ * We do this here rather than in the constructor so that callers only pay for
+ * this if they need it.
+ */
+ @Override public String getMessage() {
+ return functionName + " failed: " + errno;
+ }
+
+ /**
+ * Throws an {@link IOException} with a message based on {@link #getMessage()} and with this
+ * instance as the cause.
+ *
+ * <p>This method always terminates by throwing the exception. Callers can write
+ * {@code throw e.rethrowAsIOException()} to make that clear to the compiler.
+ */
+ public IOException rethrowAsIOException() throws IOException {
+ IOException newException = new IOException(getMessage());
+ newException.initCause(this);
+ throw newException;
+ }
+
+ /**
+ * Throws a {@link SocketException} with a message based on {@link #getMessage()} and with this
+ * instance as the cause.
+ *
+ * <p>This method always terminates by throwing the exception. Callers can write
+ * {@code throw e.rethrowAsIOException()} to make that clear to the compiler.
+ */
+ public SocketException rethrowAsSocketException() throws SocketException {
+ throw new SocketException(getMessage());
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java
new file mode 100644
index 0000000..65c285e
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/helper-framework-runtime-src/libcore-fake/libcore/io/IoUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package libcore.io;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.Socket;
+
+/** @hide */
+public final class IoUtils {
+ private IoUtils() {
+ }
+
+ public static void closeQuietly(AutoCloseable closeable) {
+ if (closeable != null) {
+ try {
+ closeable.close();
+ } catch (RuntimeException rethrown) {
+ throw rethrown;
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ public static void closeQuietly(Socket socket) {
+ if (socket != null) {
+ try {
+ socket.close();
+ } catch (RuntimeException rethrown) {
+ throw rethrown;
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ public static void deleteContents(File dir) throws IOException {
+ File[] files = dir.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ deleteContents(file);
+ }
+ file.delete();
+ }
+ }
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java
similarity index 73%
copy from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
copy to tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java
index 7ada961..2cc500f 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInImpl.java
@@ -15,6 +15,9 @@
*/
package com.android.hoststubgen.hosthelper;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
@@ -22,11 +25,11 @@
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all classes/methods/fields that are kept in the "impl" jar.
*/
-@Target({TYPE})
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenKeptInImpl {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenKeptInImpl.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java
similarity index 65%
copy from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
copy to tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java
index 7ada961..12b9875 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenKeptInStub.java
@@ -15,6 +15,9 @@
*/
package com.android.hoststubgen.hosthelper;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
@@ -22,11 +25,14 @@
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all classes/methods/fields that are kept in the "stub" jar.
+ *
+ * All items in the stub jar are automatically kept in the impl jar as well, so
+ * the items with this annotation will all have {@link HostStubGenKeptInImpl} too.
*/
-@Target({TYPE})
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenKeptInStub {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenKeptInStub.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java
similarity index 76%
rename from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
rename to tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java
index 7ada961..cb50404 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsIgnore.java
@@ -15,18 +15,20 @@
*/
package com.android.hoststubgen.hosthelper;
-import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all methods processed as "ignore".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
*/
-@Target({TYPE})
+@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenProcessedAsIgnore {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedAsIgnore.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java
similarity index 63%
copy from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
copy to tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java
index 7ada961..cfa4896 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsSubstitute.java
@@ -15,6 +15,9 @@
*/
package com.android.hoststubgen.hosthelper;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
@@ -22,11 +25,14 @@
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all methods that are processed as "substitute".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
*/
-@Target({TYPE})
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenProcessedAsSubstitute {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(
+ HostStubGenProcessedAsSubstitute.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java
similarity index 75%
copy from tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
copy to tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java
index 7ada961..0d2da11 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedKeepClass.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedAsThrow.java
@@ -15,18 +15,20 @@
*/
package com.android.hoststubgen.hosthelper;
-import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Annotation added to all "stub" classes generated by HostStubGen.
+ * Annotation injected to all methods that are processed as "throw".
+ *
+ * (This annotation is only added in the impl jar, but not the stub jar)
*/
-@Target({TYPE})
+@Target({METHOD})
@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedKeepClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedKeepClass.class);
+public @interface HostStubGenProcessedAsThrow {
+ String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedAsThrow.class);
String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java
deleted file mode 100644
index e598da0a..0000000
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostStubGenProcessedStubClass.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.hoststubgen.hosthelper;
-
-import static java.lang.annotation.ElementType.TYPE;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation added to all "stub" classes generated by HostStubGen.
- */
-@Target({TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface HostStubGenProcessedStubClass {
- String CLASS_INTERNAL_NAME = HostTestUtils.getInternalName(HostStubGenProcessedStubClass.class);
- String CLASS_DESCRIPTOR = "L" + CLASS_INTERNAL_NAME + ";";
-}
diff --git a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
index c770b9c..7c6aa25 100644
--- a/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
+++ b/tools/hoststubgen/hoststubgen/helper-runtime-src/com/android/hoststubgen/hosthelper/HostTestUtils.java
@@ -23,8 +23,6 @@
import javax.annotation.concurrent.GuardedBy;
-import org.junit.AssumptionViolatedException;
-
/**
* Utilities used in the host side test environment.
*/
@@ -128,7 +126,7 @@
}
}
// All processed classes have this annotation.
- var allowed = clazz.getAnnotation(HostStubGenProcessedKeepClass.class) != null;
+ var allowed = clazz.getAnnotation(HostStubGenKeptInImpl.class) != null;
// Java classes should be able to access any methods. (via callbacks, etc.)
if (!allowed) {
diff --git a/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh b/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
index 91e6814..d97dd7c 100755
--- a/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
+++ b/tools/hoststubgen/hoststubgen/invoketest/hoststubgen-invoke-test.sh
@@ -235,10 +235,6 @@
"Duplicate or conflicting argument found: --in-jar" \
""
-EXTRA_ARGS="--quiet" run_hoststubgen_for_failure "Conflicting arg" \
- "Duplicate or conflicting argument found: --quiet" \
- ""
-
echo "All tests passed"
exit 0
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/jarjar-rules.txt b/tools/hoststubgen/hoststubgen/jarjar-rules.txt
index 4e61ba6..b1f2fc2 100644
--- a/tools/hoststubgen/hoststubgen/jarjar-rules.txt
+++ b/tools/hoststubgen/hoststubgen/jarjar-rules.txt
@@ -1,2 +1,2 @@
# Rename guava
-rule com.google.common.** com.android.hoststubgen.x.@0
\ No newline at end of file
+rule com.google.** com.android.hoststubgen.x.google.@0
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Exceptions.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Exceptions.kt
index 207ba52..910bf59 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Exceptions.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Exceptions.kt
@@ -46,3 +46,7 @@
*/
class InvalidAnnotationException(message: String) : Exception(message), UserErrorException
+/**
+ * We use this for general "user" errors.
+ */
+class HostStubGenUserErrorException(message: String) : Exception(message), UserErrorException
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
index dbcf3a5..97e09b8 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
@@ -128,7 +128,7 @@
}
val end = System.currentTimeMillis()
- log.v("Done reading class structure in %.1f second(s).", (end - start) / 1000.0)
+ log.i("Done reading class structure in %.1f second(s).", (end - start) / 1000.0)
return allClasses
}
@@ -158,7 +158,7 @@
// This is used when a member (methods, fields, nested classes) don't get any polices
// from upper filters. e.g. when a method has no annotations, then this filter will apply
// the class-wide policy, if any. (if not, we'll fall back to the above filter.)
- filter = ClassWidePolicyPropagatingFilter(filter)
+ filter = ClassWidePolicyPropagatingFilter(allClasses, filter)
// Inject default hooks from options.
filter = DefaultHookInjectingFilter(
@@ -239,7 +239,7 @@
errors: HostStubGenErrors,
) {
log.i("Converting %s into [stub: %s, impl: %s] ...", inJar, outStubJar, outImplJar)
- log.i("Checker is %s", if (enableChecker) "enabled" else "disabled")
+ log.i("ASM CheckClassAdapter is %s", if (enableChecker) "enabled" else "disabled")
val start = System.currentTimeMillis()
@@ -264,7 +264,7 @@
}
}
val end = System.currentTimeMillis()
- log.v("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0)
+ log.i("Done transforming the jar in %.1f second(s).", (end - start) / 1000.0)
}
private fun <T> maybeWithZipOutputStream(filename: String?, block: (ZipOutputStream?) -> T): T {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenErrors.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenErrors.kt
index 9df0489..6b01d48 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenErrors.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenErrors.kt
@@ -15,10 +15,10 @@
*/
package com.android.hoststubgen
-class HostStubGenErrors {
- fun onErrorFound(message: String) {
- // For now, we just throw as soon as any error is found, but eventually we should keep
+open class HostStubGenErrors {
+ open fun onErrorFound(message: String) {
+ // TODO: For now, we just throw as soon as any error is found, but eventually we should keep
// all errors and print them at the end.
- throw RuntimeException(message)
+ throw HostStubGenUserErrorException(message)
}
}
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
index 5e71a36..18065ba 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenLogger.kt
@@ -15,10 +15,12 @@
*/
package com.android.hoststubgen
-import java.io.OutputStream
-import java.io.PrintStream
+import java.io.BufferedOutputStream
+import java.io.FileOutputStream
+import java.io.PrintWriter
+import java.io.Writer
-val log: HostStubGenLogger = HostStubGenLogger()
+val log: HostStubGenLogger = HostStubGenLogger().setConsoleLogLevel(LogLevel.Info)
/** Logging level */
enum class LogLevel {
@@ -30,15 +32,13 @@
Debug,
}
-/** Simple logging class. */
-class HostStubGenLogger(
- private var out: PrintStream = System.out!!,
- var level: LogLevel = LogLevel.Info,
-) {
- companion object {
- private val sNullPrintStream: PrintStream = PrintStream(OutputStream.nullOutputStream())
- }
-
+/**
+ * Simple logging class.
+ *
+ * By default, it has no printers set. Use [setConsoleLogLevel] or [addFilePrinter] to actually
+ * write log.
+ */
+class HostStubGenLogger {
private var indentLevel: Int = 0
get() = field
set(value) {
@@ -47,6 +47,56 @@
}
private var indent: String = ""
+ private val printers: MutableList<LogPrinter> = mutableListOf()
+
+ private var consolePrinter: LogPrinter? = null
+
+ private var maxLogLevel = LogLevel.None
+
+ private fun updateMaxLogLevel() {
+ maxLogLevel = LogLevel.None
+
+ printers.forEach {
+ if (maxLogLevel < it.logLevel) {
+ maxLogLevel = it.logLevel
+ }
+ }
+ }
+
+ private fun addPrinter(printer: LogPrinter) {
+ printers.add(printer)
+ updateMaxLogLevel()
+ }
+
+ private fun removePrinter(printer: LogPrinter) {
+ printers.remove(printer)
+ updateMaxLogLevel()
+ }
+
+ fun setConsoleLogLevel(level: LogLevel): HostStubGenLogger {
+ // If there's already a console log printer set, remove it, and then add a new one
+ consolePrinter?.let {
+ removePrinter(it)
+ }
+ val cp = StreamPrinter(level, PrintWriter(System.out))
+ addPrinter(cp)
+ consolePrinter = cp
+
+ return this
+ }
+
+ fun addFilePrinter(level: LogLevel, logFilename: String): HostStubGenLogger {
+ addPrinter(StreamPrinter(level, PrintWriter(BufferedOutputStream(
+ FileOutputStream(logFilename)))))
+
+ return this
+ }
+
+ /** Flush all the printers */
+ fun flush() {
+ printers.forEach { it.flush() }
+ }
+
fun indent() {
indentLevel++
}
@@ -68,92 +118,71 @@
}
fun isEnabled(level: LogLevel): Boolean {
- return level.ordinal <= this.level.ordinal
+ return level.ordinal <= maxLogLevel.ordinal
}
- private fun println(message: String) {
- out.print(indent)
- out.println(message)
+ private fun println(level: LogLevel, message: String) {
+ printers.forEach {
+ if (it.logLevel.ordinal >= level.ordinal) {
+ it.println(level, indent, message)
+ }
+ }
+ }
+
+ private fun println(level: LogLevel, format: String, vararg args: Any?) {
+ if (isEnabled(level)) {
+ println(level, String.format(format, *args))
+ }
}
/** Log an error. */
fun e(message: String) {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Error, message)
}
/** Log an error. */
fun e(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return
- }
- e(String.format(format, *args))
+ println(LogLevel.Error, format, *args)
}
/** Log a warning. */
fun w(message: String) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Warn, message)
}
/** Log a warning. */
fun w(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- w(String.format(format, *args))
+ println(LogLevel.Warn, format, *args)
}
/** Log an info message. */
fun i(message: String) {
- if (level.ordinal < LogLevel.Info.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Info, message)
}
- /** Log a debug message. */
+ /** Log an info message. */
fun i(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- i(String.format(format, *args))
+ println(LogLevel.Info, format, *args)
}
/** Log a verbose message. */
fun v(message: String) {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Verbose, message)
}
/** Log a verbose message. */
fun v(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return
- }
- v(String.format(format, *args))
+ println(LogLevel.Verbose, format, *args)
}
/** Log a debug message. */
fun d(message: String) {
- if (level.ordinal < LogLevel.Debug.ordinal) {
- return
- }
- println(message)
+ println(LogLevel.Debug, message)
}
/** Log a debug message. */
fun d(format: String, vararg args: Any?) {
- if (level.ordinal < LogLevel.Warn.ordinal) {
- return
- }
- d(String.format(format, *args))
+ println(LogLevel.Debug, format, *args)
}
inline fun forVerbose(block: () -> Unit) {
@@ -168,31 +197,65 @@
}
}
- /** Return a stream for error. */
- fun getErrorPrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Error.ordinal) {
- return sNullPrintStream
- }
-
- // TODO Apply indent
- return PrintStream(out)
+ /** Return a Writer for a given log level. */
+ fun getWriter(level: LogLevel): Writer {
+ return MultiplexingWriter(level)
}
- /** Return a stream for verbose messages. */
- fun getVerbosePrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Verbose.ordinal) {
- return sNullPrintStream
+ private inner class MultiplexingWriter(val level: LogLevel) : Writer() {
+ private inline fun forPrinters(callback: (LogPrinter) -> Unit) {
+ printers.forEach {
+ if (it.logLevel.ordinal >= level.ordinal) {
+ callback(it)
+ }
+ }
}
- // TODO Apply indent
- return PrintStream(out)
+
+ override fun close() {
+ flush()
+ }
+
+ override fun flush() {
+ forPrinters {
+ it.flush()
+ }
+ }
+
+ override fun write(cbuf: CharArray, off: Int, len: Int) {
+ // TODO Apply indent
+ forPrinters {
+ it.write(cbuf, off, len)
+ }
+ }
+ }
+}
+
+private interface LogPrinter {
+ val logLevel: LogLevel
+
+ fun println(logLevel: LogLevel, indent: String, message: String)
+
+ // TODO: This should be removed once MultiplexingWriter starts applying indent, at which point
+ // println() should be used instead.
+ fun write(cbuf: CharArray, off: Int, len: Int)
+
+ fun flush()
+}
+
+private class StreamPrinter(
+ override val logLevel: LogLevel,
+ val out: PrintWriter,
+) : LogPrinter {
+ override fun println(logLevel: LogLevel, indent: String, message: String) {
+ out.print(indent)
+ out.println(message)
}
- /** Return a stream for debug messages. */
- fun getInfoPrintStream(): PrintStream {
- if (level.ordinal < LogLevel.Info.ordinal) {
- return sNullPrintStream
- }
- // TODO Apply indent
- return PrintStream(out)
+ override fun write(cbuf: CharArray, off: Int, len: Int) {
+ out.write(cbuf, off, len)
}
-}
\ No newline at end of file
+
+ override fun flush() {
+ out.flush()
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
index 0ae52af..d2ead18 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt
@@ -101,9 +101,7 @@
var defaultPolicy: SetOnce<FilterPolicy> = SetOnce(FilterPolicy.Remove),
- var logLevel: SetOnce<LogLevel> = SetOnce(LogLevel.Info),
-
- var cleanUpOnError: SetOnce<Boolean> = SetOnce(true),
+ var cleanUpOnError: SetOnce<Boolean> = SetOnce(false),
var enableClassChecker: SetOnce<Boolean> = SetOnce(false),
var enablePreTrace: SetOnce<Boolean> = SetOnce(false),
@@ -143,6 +141,11 @@
return name
}
+ fun setLogFile(level: LogLevel, filename: String) {
+ log.addFilePrinter(level, filename)
+ log.i("$level log file: $filename")
+ }
+
while (true) {
val arg = ai.nextArgOptional()
if (arg == null) {
@@ -161,9 +164,9 @@
// TODO: Write help
"-h", "--help" -> TODO("Help is not implemented yet")
- "-v", "--verbose" -> ret.logLevel.set(LogLevel.Verbose)
- "-d", "--debug" -> ret.logLevel.set(LogLevel.Debug)
- "-q", "--quiet" -> ret.logLevel.set(LogLevel.None)
+ "-v", "--verbose" -> log.setConsoleLogLevel(LogLevel.Verbose)
+ "-d", "--debug" -> log.setConsoleLogLevel(LogLevel.Debug)
+ "-q", "--quiet" -> log.setConsoleLogLevel(LogLevel.None)
"--in-jar" -> ret.inJar.setNextStringArg().ensureFileExists()
"--out-stub-jar" -> ret.outStubJar.setNextStringArg()
@@ -211,7 +214,7 @@
ret.keepStaticInitializerAnnotations.addUniqueAnnotationArg()
"--package-redirect" ->
- ret.packageRedirects += parsePackageRedirect(ai.nextArgRequired(arg))
+ ret.packageRedirects += parsePackageRedirect(nextArg())
"--annotation-allowed-classes-file" ->
ret.annotationAllowedClassesFile.setNextStringArg()
@@ -246,13 +249,15 @@
"--gen-input-dump-file" -> ret.inputJarDumpFile.setNextStringArg()
+ "--verbose-log" -> setLogFile(LogLevel.Verbose, nextArg())
+ "--debug-log" -> setLogFile(LogLevel.Debug, nextArg())
+
else -> throw ArgumentsException("Unknown option: $arg")
}
} catch (e: SetOnce.SetMoreThanOnceException) {
throw ArgumentsException("Duplicate or conflicting argument found: $arg")
}
}
- log.w(ret.toString())
if (!ret.inJar.isSet) {
throw ArgumentsException("Required option missing: --in-jar")
@@ -377,7 +382,6 @@
intersectStubJars=$intersectStubJars,
policyOverrideFile=$policyOverrideFile,
defaultPolicy=$defaultPolicy,
- logLevel=$logLevel,
cleanUpOnError=$cleanUpOnError,
enableClassChecker=$enableClassChecker,
enablePreTrace=$enablePreTrace,
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
index 38ba0cc..4882c00 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/Main.kt
@@ -17,6 +17,8 @@
package com.android.hoststubgen
+import java.io.PrintWriter
+
const val COMMAND_NAME = "HostStubGen"
/**
@@ -25,13 +27,12 @@
fun main(args: Array<String>) {
var success = false
var clanupOnError = false
+
try {
// Parse the command line arguments.
val options = HostStubGenOptions.parseArgs(args)
clanupOnError = options.cleanUpOnError.get
- log.level = options.logLevel.get
-
log.v("HostStubGen started")
log.v("Options: $options")
@@ -39,17 +40,18 @@
HostStubGen(options).run()
success = true
- } catch (e: Exception) {
+ } catch (e: Throwable) {
log.e("$COMMAND_NAME: Error: ${e.message}")
if (e !is UserErrorException) {
- e.printStackTrace(log.getErrorPrintStream())
+ e.printStackTrace(PrintWriter(log.getWriter(LogLevel.Error)))
}
if (clanupOnError) {
- TODO("clanupOnError is not implemented yet")
+ TODO("Remove output jars here")
}
+ } finally {
+ log.i("$COMMAND_NAME finished")
+ log.flush()
}
- log.v("HostStubGen finished")
-
System.exit(if (success) 0 else 1 )
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
index d7aa0af..0579c2b 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/asm/AsmUtils.kt
@@ -17,6 +17,8 @@
import com.android.hoststubgen.ClassParseException
import com.android.hoststubgen.HostStubGenInternalException
+import org.objectweb.asm.ClassVisitor
+import org.objectweb.asm.FieldVisitor
import org.objectweb.asm.MethodVisitor
import org.objectweb.asm.Opcodes
import org.objectweb.asm.Type
@@ -108,7 +110,7 @@
* Otherwise, return null.
*/
fun getDirectOuterClassName(className: String): String? {
- val pos = className.indexOf('$')
+ val pos = className.lastIndexOf('$')
if (pos < 0) {
return null
}
@@ -194,6 +196,29 @@
}
}
+enum class Visibility {
+ PRIVATE,
+ PACKAGE_PRIVATE,
+ PROTECTED,
+ PUBLIC;
+
+ companion object {
+ fun fromAccess(access: Int): Visibility {
+ if ((access and Opcodes.ACC_PUBLIC) != 0) {
+ return PUBLIC
+ }
+ if ((access and Opcodes.ACC_PROTECTED) != 0) {
+ return PROTECTED
+ }
+ if ((access and Opcodes.ACC_PRIVATE) != 0) {
+ return PRIVATE
+ }
+
+ return PACKAGE_PRIVATE
+ }
+ }
+}
+
fun ClassNode.isEnum(): Boolean {
return (this.access and Opcodes.ACC_ENUM) != 0
}
@@ -210,6 +235,10 @@
return (this.access and Opcodes.ACC_SYNTHETIC) != 0
}
+fun MethodNode.isStatic(): Boolean {
+ return (this.access and Opcodes.ACC_STATIC) != 0
+}
+
fun FieldNode.isEnum(): Boolean {
return (this.access and Opcodes.ACC_ENUM) != 0
}
@@ -218,6 +247,19 @@
return (this.access and Opcodes.ACC_SYNTHETIC) != 0
}
+fun ClassNode.getVisibility(): Visibility {
+ return Visibility.fromAccess(this.access)
+}
+
+fun MethodNode.getVisibility(): Visibility {
+ return Visibility.fromAccess(this.access)
+}
+
+fun FieldNode.getVisibility(): Visibility {
+ return Visibility.fromAccess(this.access)
+}
+
+
/*
Dump of the members of TinyFrameworkEnumSimple:
@@ -283,3 +325,36 @@
}
return false
}
+
+/**
+ * Class to help handle [ClassVisitor], [MethodVisitor] and [FieldVisitor] in a unified way.
+ */
+abstract class UnifiedVisitor {
+ abstract fun visitAnnotation(descriptor: String, visible: Boolean)
+
+ companion object {
+ fun on(target: ClassVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+
+ fun on(target: MethodVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+
+ fun on(target: FieldVisitor): UnifiedVisitor {
+ return object : UnifiedVisitor() {
+ override fun visitAnnotation(descriptor: String, visible: Boolean) {
+ target.visitAnnotation(descriptor, visible)
+ }
+ }
+ }
+ }
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
index 6aac3d8..47790b1 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/ClassWidePolicyPropagatingFilter.kt
@@ -15,6 +15,7 @@
*/
package com.android.hoststubgen.filters
+import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.getDirectOuterClassName
/**
@@ -22,22 +23,38 @@
* (obtained from [outermostFilter]) to the fields and methods.
*/
class ClassWidePolicyPropagatingFilter(
- fallback: OutputFilter,
+ private val classes: ClassNodes,
+ fallback: OutputFilter,
) : DelegatingFilter(fallback) {
private fun getClassWidePolicy(className: String, resolve: Boolean): FilterPolicyWithReason? {
var currentClass = className
- while (true) {
- outermostFilter.getPolicyForClass(className).let { policy ->
- if (policy.policy.isClassWidePolicy) {
- val p = if (resolve) policy.policy.resolveClassWidePolicy() else policy.policy
- return p.withReason(policy.reason).wrapReason("class-wide in $currentClass")
- }
- // If the class's policy is remove, then remove it.
- if (policy.policy == FilterPolicy.Remove) {
- return FilterPolicy.Remove.withReason("class-wide in $currentClass")
+ // If the class name is `a.b.c.A$B$C`, then we try to get the class wide policy
+ // from a.b.c.A$B$C, then a.b.c.A$B, and then a.b.c.A.
+ while (true) {
+ // Sometimes a class name has a `$` in it but not as a nest class name separator --
+ // e.g. class name like "MyClass$$". In this case, `MyClass$` may not actually be
+ // a class name.
+ // So before getting the class policy on a nonexistent class, which may cause an
+ // incorrect result, we make sure if className actually exists.
+ if (classes.hasClass(className)) {
+ outermostFilter.getPolicyForClass(className).let { policy ->
+ if (policy.policy.isClassWidePolicy) {
+ val p = if (resolve) {
+ policy.policy.resolveClassWidePolicy()
+ } else {
+ policy.policy
+ }
+
+ return p.withReason(policy.reason)
+ .wrapReason("class-wide in $currentClass")
+ }
+ // If the class's policy is remove, then remove it.
+ if (policy.policy == FilterPolicy.Remove) {
+ return FilterPolicy.Remove.withReason("class-wide in $currentClass")
+ }
}
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
index f25e862..21cfd4b 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
@@ -16,15 +16,17 @@
package com.android.hoststubgen.visitors
import com.android.hoststubgen.HostStubGenErrors
+import com.android.hoststubgen.LogLevel
import com.android.hoststubgen.asm.ClassNodes
+import com.android.hoststubgen.asm.UnifiedVisitor
import com.android.hoststubgen.asm.getPackageNameFromClassName
import com.android.hoststubgen.asm.resolveClassName
import com.android.hoststubgen.asm.toJvmClassName
import com.android.hoststubgen.filters.FilterPolicy
import com.android.hoststubgen.filters.FilterPolicyWithReason
import com.android.hoststubgen.filters.OutputFilter
-import com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
-import com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+import com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
+import com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
import com.android.hoststubgen.log
import org.objectweb.asm.ClassVisitor
import org.objectweb.asm.FieldVisitor
@@ -63,6 +65,18 @@
*/
protected abstract fun shouldEmit(policy: FilterPolicy): Boolean
+ /**
+ * Inject [HostStubGenKeptInStub] and [HostStubGenKeptInImpl] as needed to an item.
+ */
+ protected fun injectInStubAndKeepAnnotations(policy: FilterPolicy, v: UnifiedVisitor) {
+ if (policy.needsInStub) {
+ v.visitAnnotation(HostStubGenKeptInStub.CLASS_DESCRIPTOR, true)
+ }
+ if (policy.needsInImpl) {
+ v.visitAnnotation(HostStubGenKeptInImpl.CLASS_DESCRIPTOR, true)
+ }
+ }
+
override fun visit(
version: Int,
access: Int,
@@ -99,12 +113,7 @@
nativeSubstitutionClass = fullClassName
}
// Inject annotations to generated classes.
- if (classPolicy.policy.needsInStub) {
- visitAnnotation(HostStubGenProcessedStubClass.CLASS_DESCRIPTOR, true)
- }
- if (classPolicy.policy.needsInImpl) {
- visitAnnotation(HostStubGenProcessedKeepClass.CLASS_DESCRIPTOR, true)
- }
+ injectInStubAndKeepAnnotations(classPolicy.policy, UnifiedVisitor.on(this))
}
override fun visitEnd() {
@@ -147,7 +156,11 @@
}
log.v("Emitting field: %s %s %s", name, descriptor, policy)
- return super.visitField(access, name, descriptor, signature, value)
+ val ret = super.visitField(access, name, descriptor, signature, value)
+
+ injectInStubAndKeepAnnotations(policy.policy, UnifiedVisitor.on(ret))
+
+ return ret
}
}
@@ -165,7 +178,9 @@
log.d("visitMethod: %s%s [%x] [%s] Policy: %s", name, descriptor, access, signature, p)
log.withIndent {
- // If it's a substitute-to method, then skip.
+ // If it's a substitute-from method, then skip (== remove).
+ // Instead of this method, we rename the substitute-to method with the original
+ // name, in the "Maybe rename the method" part below.
val policy = filter.getPolicyForMethod(currentClassName, name, descriptor)
if (policy.policy.isSubstitute) {
log.d("Skipping %s%s %s", name, descriptor, policy)
@@ -178,9 +193,19 @@
// Maybe rename the method.
val newName: String
- val substituteTo = filter.getRenameTo(currentClassName, name, descriptor)
- if (substituteTo != null) {
- newName = substituteTo
+ val renameTo = filter.getRenameTo(currentClassName, name, descriptor)
+ if (renameTo != null) {
+ newName = renameTo
+
+ // It's confusing, but here, `newName` is the original method name
+ // (the one with the @substitute/replace annotation).
+ // `name` is the name of the method we're currently visiting, so it's usually a
+ // "...$ravewnwood" name.
+ if (!checkSubstitutionMethodCompatibility(
+ classes, currentClassName, newName, name, descriptor, options.errors)) {
+ return null
+ }
+
log.v("Emitting %s.%s%s as %s %s", currentClassName, name, descriptor,
newName, policy)
} else {
@@ -190,12 +215,19 @@
// Let subclass update the flag.
// But note, we only use it when calling the super's method,
- // but not for visitMethodInner(), beucase when subclass wants to change access,
+ // but not for visitMethodInner(), because when subclass wants to change access,
// it can do so inside visitMethodInner().
val newAccess = updateAccessFlags(access, name, descriptor)
- return visitMethodInner(access, newName, descriptor, signature, exceptions, policy,
- super.visitMethod(newAccess, newName, descriptor, signature, exceptions))
+ val ret = visitMethodInner(access, newName, descriptor, signature, exceptions, policy,
+ renameTo != null,
+ super.visitMethod(newAccess, newName, descriptor, signature, exceptions))
+
+ ret?.let {
+ injectInStubAndKeepAnnotations(policy.policy, UnifiedVisitor.on(ret))
+ }
+
+ return ret
}
}
@@ -214,6 +246,7 @@
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor?
@@ -229,7 +262,7 @@
): ClassVisitor {
var next = nextVisitor
- val verbosePrinter = PrintWriter(log.getVerbosePrintStream())
+ val verbosePrinter = PrintWriter(log.getWriter(LogLevel.Verbose))
// Inject TraceClassVisitor for debugging.
if (options.enablePostTrace) {
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/Helper.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/Helper.kt
new file mode 100644
index 0000000..9d66c32
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/Helper.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.hoststubgen.visitors
+
+import com.android.hoststubgen.HostStubGenErrors
+import com.android.hoststubgen.asm.ClassNodes
+import com.android.hoststubgen.asm.getVisibility
+import com.android.hoststubgen.asm.isStatic
+
+/**
+ * Make sure substitution from and to methods have matching definition.
+ * (static-ness, visibility.)
+ */
+fun checkSubstitutionMethodCompatibility(
+ classes: ClassNodes,
+ className: String,
+ fromMethodName: String, // the one with the annotation
+ toMethodName: String, // the one with either a "_host" or "$ravenwood" prefix. (typically)
+ descriptor: String,
+ errors: HostStubGenErrors,
+): Boolean {
+ val from = classes.findMethod(className, fromMethodName, descriptor)
+ if (from == null) {
+ errors.onErrorFound(
+ "Substitution-from method not found: $className.$fromMethodName$descriptor")
+ return false
+ }
+ val to = classes.findMethod(className, toMethodName, descriptor)
+ if (to == null) {
+ // This shouldn't happen, because the visitor visited this method...
+ errors.onErrorFound(
+ "Substitution-to method not found: $className.$toMethodName$descriptor")
+ return false
+ }
+
+ if (from.isStatic() != to.isStatic()) {
+ errors.onErrorFound(
+ "Substitution method must have matching static-ness: " +
+ "$className.$fromMethodName$descriptor")
+ return false
+ }
+ if (from.getVisibility().ordinal > to.getVisibility().ordinal) {
+ errors.onErrorFound(
+ "Substitution method cannot have smaller visibility than original: " +
+ "$className.$fromMethodName$descriptor")
+ return false
+ }
+
+ return true
+}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
index 88db15b..9274a96 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
@@ -25,6 +25,9 @@
import com.android.hoststubgen.filters.FilterPolicy
import com.android.hoststubgen.filters.FilterPolicyWithReason
import com.android.hoststubgen.filters.OutputFilter
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsIgnore
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+import com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
import com.android.hoststubgen.hosthelper.HostTestUtils
import com.android.hoststubgen.log
import org.objectweb.asm.ClassVisitor
@@ -135,6 +138,7 @@
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor? {
// Inject method log, if needed.
@@ -182,16 +186,23 @@
)
}
+ fun MethodVisitor.withAnnotation(descriptor: String): MethodVisitor {
+ this.visitAnnotation(descriptor, true)
+ return this
+ }
+
log.withIndent {
if ((access and Opcodes.ACC_NATIVE) != 0 && nativeSubstitutionClass != null) {
log.v("Rewriting native method...")
return NativeSubstitutingMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsSubstitute.CLASS_DESCRIPTOR)
}
if (policy.policy == FilterPolicy.Throw) {
log.v("Making method throw...")
return ThrowingMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsThrow.CLASS_DESCRIPTOR)
}
if (policy.policy == FilterPolicy.Ignore) {
when (Type.getReturnType(descriptor)) {
@@ -199,6 +210,7 @@
log.v("Making method ignored...")
return IgnoreMethodAdapter(
access, name, descriptor, signature, exceptions, innerVisitor)
+ .withAnnotation(HostStubGenProcessedAsIgnore.CLASS_DESCRIPTOR)
}
else -> {
throw RuntimeException("Ignored policy only allowed for void methods")
@@ -206,6 +218,9 @@
}
}
}
+ if (substituted && innerVisitor != null) {
+ innerVisitor.withAnnotation(HostStubGenProcessedAsSubstitute.CLASS_DESCRIPTOR)
+ }
return innerVisitor
}
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
index 37e2a88..fc20f28 100644
--- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
+++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/StubGeneratingAdapter.kt
@@ -45,6 +45,7 @@
signature: String?,
exceptions: Array<String>?,
policy: FilterPolicyWithReason,
+ substituted: Boolean,
superVisitor: MethodVisitor?,
): MethodVisitor? {
return StubMethodVisitor(access, name, descriptor, signature, exceptions, superVisitor)
diff --git a/tools/hoststubgen/hoststubgen/test-framework/README.md b/tools/hoststubgen/hoststubgen/test-framework/README.md
index f616ad6..26a9ad1 100644
--- a/tools/hoststubgen/hoststubgen/test-framework/README.md
+++ b/tools/hoststubgen/hoststubgen/test-framework/README.md
@@ -1,20 +1,21 @@
-# HostStubGen: real framework test
+# HostStubGen: (obsolete) real framework test
This directory contains tests against the actual framework.jar code. The tests were
copied from somewhere else in the android tree. We use this directory to quickly run existing
tests.
+This directory was used during the prototype phase, but now that we have real ravenwood tests,
+this directory is obsolete and should be deleted.
+
## How to run
- With `atest`. This is the proper way to run it, but it may fail due to atest's known problems.
- See the top level README.md on why `--no-bazel-mode` is needed (for now).
-
```
-$ atest --no-bazel-mode HostStubGenTest-framework-test-host-test
+$ atest HostStubGenTest-framework-all-test-host-test
```
-- Advanced option: `run-test-without-atest.sh` runs the test without using `atest` or `run-ravenwood-test`
+- Advanced option: `run-test-without-atest.sh` runs the test without using `atest`
```
$ ./run-test-without-atest.sh
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md b/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
index 3bfad9b..344b4e9 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/README.md
@@ -2,7 +2,7 @@
This directory contains a small classes that "simulates" framework.jar, and tests against it.
-This test doesn't use the actual android framework code.
+This test is agnostic to Android, and it doesn't use any android framework code or knowledge.
## How to run
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
index 9349355..ebe1422 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/02-hoststubgen-test-tiny-framework-host-stub-dump.txt
@@ -17,6 +17,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -28,6 +33,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -35,9 +45,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -58,6 +68,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -69,6 +84,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -76,9 +96,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -96,9 +116,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
@@ -121,6 +141,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneStub();
descriptor: ()I
@@ -132,6 +157,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -141,9 +171,9 @@
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -164,6 +194,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -175,6 +210,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -186,15 +226,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -212,6 +257,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -226,6 +276,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -240,6 +295,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -254,6 +314,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -265,6 +330,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -276,6 +346,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -283,9 +358,9 @@
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -305,14 +380,29 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -324,6 +414,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -335,6 +430,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -346,6 +446,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -357,6 +462,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -368,6 +478,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -379,6 +494,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -390,6 +510,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -401,13 +526,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -424,6 +554,11 @@
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -435,6 +570,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -447,6 +587,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -458,13 +603,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -480,6 +630,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -487,6 +642,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -495,9 +655,9 @@
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -513,6 +673,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -520,6 +685,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -528,9 +698,9 @@
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -552,6 +722,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -559,6 +734,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -566,6 +746,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -573,6 +758,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -584,6 +774,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -595,6 +790,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -607,6 +807,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -621,6 +826,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -635,6 +845,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -649,6 +864,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -660,14 +880,19 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -683,6 +908,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -690,6 +920,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -697,6 +932,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -708,6 +948,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -719,6 +964,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -731,6 +981,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -742,6 +997,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -753,14 +1013,19 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -783,6 +1048,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -794,13 +1064,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -816,6 +1091,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPolicy();
descriptor: ()V
@@ -827,6 +1107,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -838,6 +1123,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -849,6 +1139,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -860,6 +1155,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -871,13 +1171,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -891,6 +1196,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -899,6 +1209,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -913,6 +1228,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -928,6 +1248,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -943,6 +1268,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -957,6 +1287,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -968,6 +1303,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -979,6 +1319,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -990,6 +1335,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -997,9 +1347,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1019,6 +1369,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1027,6 +1382,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1041,6 +1401,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1056,6 +1421,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1071,6 +1441,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1085,6 +1460,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1096,6 +1476,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1107,6 +1492,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1118,6 +1508,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1125,9 +1520,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1147,6 +1542,11 @@
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1158,10 +1558,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native int nativeAddTwo(int);
descriptor: (I)I
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1173,10 +1583,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native long nativeLongPlus(long, long);
descriptor: (JJ)J
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1188,6 +1608,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1199,10 +1624,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public native int nativeNonStaticAddToValue(int);
descriptor: (I)I
flags: (0x0101) ACC_PUBLIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1214,13 +1649,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1240,6 +1680,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -1251,15 +1696,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1273,10 +1723,20 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -1288,15 +1748,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1313,6 +1778,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -1324,6 +1794,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1336,6 +1811,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1343,9 +1823,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1369,6 +1849,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1376,9 +1861,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1393,11 +1878,21 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -1409,6 +1904,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -1421,6 +1921,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1433,6 +1938,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1444,6 +1954,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -1458,9 +1973,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1493,6 +2008,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -1504,13 +2024,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1533,6 +2058,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -1544,13 +2074,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
index 4f8c408e..4cb2a9f 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/03-hoststubgen-test-tiny-framework-host-impl-dump.txt
@@ -10,11 +10,14 @@
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -36,7 +39,7 @@
SourceFile: "HostSideTestKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -57,11 +60,14 @@
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestNativeSubstitutionClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -83,7 +89,7 @@
SourceFile: "HostSideTestRemove.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -105,7 +111,7 @@
SourceFile: "HostSideTestStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -126,11 +132,14 @@
public abstract java.lang.String suffix();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestSubstitute.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD]
@@ -152,7 +161,7 @@
SourceFile: "HostSideTestThrow.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -174,7 +183,7 @@
SourceFile: "HostSideTestWholeClassKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -196,7 +205,7 @@
SourceFile: "HostSideTestWholeClassStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -226,6 +235,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -240,6 +254,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -247,9 +266,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -272,6 +291,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -286,6 +310,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -293,9 +322,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -313,9 +342,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
@@ -340,6 +369,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneKeep();
descriptor: ()I
@@ -355,6 +389,9 @@
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -367,6 +404,11 @@
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -376,9 +418,9 @@
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -401,6 +443,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -410,6 +457,11 @@
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneKeep:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -419,15 +471,20 @@
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneStub:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -445,6 +502,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -452,6 +514,9 @@
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -484,6 +549,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -502,6 +572,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -526,6 +601,9 @@
Start Length Slot Name Signature
15 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
15 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -544,6 +622,13 @@
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -558,6 +643,13 @@
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -576,6 +668,11 @@
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestThrow
@@ -592,6 +689,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -599,9 +701,9 @@
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -621,14 +723,29 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -648,6 +765,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -663,6 +785,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -678,6 +805,11 @@
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -693,6 +825,11 @@
Start Length Slot Name Signature
0 8 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 8 1 foo Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -708,6 +845,13 @@
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -722,6 +866,13 @@
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -734,6 +885,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -747,13 +903,18 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -770,6 +931,11 @@
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -783,6 +949,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassLoadHook;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -802,6 +973,11 @@
Start Length Slot Name Signature
0 11 0 clazz Ljava/lang/Class<*>;
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -814,13 +990,18 @@
x: putstatic #x // Field sLoadedClasses:Ljava/util/Set;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -836,6 +1017,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -843,6 +1029,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -851,9 +1042,9 @@
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -869,6 +1060,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -876,6 +1072,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -896,13 +1097,16 @@
x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -924,6 +1128,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -931,6 +1140,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -938,6 +1152,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -945,6 +1164,9 @@
private final java.lang.String mLongName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -952,6 +1174,9 @@
private final java.lang.String mShortName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -959,6 +1184,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -970,6 +1200,11 @@
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -985,6 +1220,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -1009,6 +1249,11 @@
0 18 3 longName Ljava/lang/String;
0 18 4 shortName Ljava/lang/String;
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1025,6 +1270,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1041,6 +1291,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1066,6 +1321,11 @@
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1100,14 +1360,19 @@
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1123,6 +1388,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1130,6 +1400,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1137,6 +1412,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1148,6 +1428,11 @@
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1163,6 +1448,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -1179,6 +1469,11 @@
Start Length Slot Name Signature
0 7 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1197,6 +1492,11 @@
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1219,14 +1519,19 @@
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1251,6 +1556,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -1279,13 +1589,18 @@
LocalVariableTable:
Start Length Slot Name Signature
11 11 0 e Ljava/lang/Exception;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1301,10 +1616,18 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -1334,6 +1657,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -1349,6 +1677,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
0 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -1370,6 +1703,9 @@
Start Length Slot Name Signature
15 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
15 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -1385,6 +1721,13 @@
Start Length Slot Name Signature
0 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
0 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -1399,6 +1742,13 @@
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1417,6 +1767,11 @@
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1430,13 +1785,18 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -1450,6 +1810,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1458,6 +1823,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1477,6 +1847,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1493,6 +1868,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1506,6 +1886,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1519,6 +1904,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1529,6 +1919,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1539,6 +1934,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1549,6 +1949,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1559,6 +1964,9 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1566,9 +1974,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1609,6 +2017,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1617,6 +2030,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1636,6 +2054,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1652,6 +2075,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1665,6 +2093,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1678,6 +2111,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1688,6 +2126,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1698,6 +2141,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1708,6 +2156,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1718,6 +2171,9 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1725,9 +2181,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1768,6 +2224,11 @@
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1781,6 +2242,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -1790,6 +2256,13 @@
x: iload_0
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeAddTwo:(I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1803,6 +2276,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -1813,6 +2291,13 @@
x: lload_2
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeLongPlus:(JJ)J
x: lreturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1828,6 +2313,11 @@
Start Length Slot Name Signature
0 6 0 arg1 J
0 6 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1843,6 +2333,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
0 6 1 v I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue(int);
descriptor: (I)I
@@ -1853,6 +2348,13 @@
x: iload_1
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeNonStaticAddToValue:(Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1868,13 +2370,18 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
0 6 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1909,6 +2416,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -1929,6 +2439,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 4 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -1950,6 +2463,9 @@
Start Length Slot Name Signature
15 4 0 arg1 J
15 4 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeNonStaticAddToValue(com.android.hoststubgen.test.tinyframework.TinyFrameworkNative, int);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
@@ -1972,11 +2488,14 @@
Start Length Slot Name Signature
15 7 0 source Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
15 7 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative_host.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -1992,6 +2511,9 @@
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$1(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2009,6 +2531,9 @@
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
0 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2028,6 +2553,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2047,6 +2575,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2055,7 +2586,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2078,6 +2609,9 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2097,6 +2631,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2116,6 +2653,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
@@ -2124,7 +2664,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2138,6 +2678,9 @@
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$3(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2155,6 +2698,9 @@
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
0 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2174,6 +2720,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2193,6 +2742,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
@@ -2201,7 +2753,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2224,6 +2776,9 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2243,6 +2798,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2262,6 +2820,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4
@@ -2270,7 +2831,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2284,6 +2845,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -2301,15 +2867,20 @@
Start Length Slot Name Signature
0 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass;
0 10 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2323,10 +2894,20 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -2347,15 +2928,20 @@
Start Length Slot Name Signature
0 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass;
0 15 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2381,6 +2967,9 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2400,6 +2989,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2419,6 +3011,9 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2428,7 +3023,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2442,6 +3037,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -2458,6 +3058,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 11 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -2470,6 +3075,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2477,9 +3087,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2507,6 +3117,11 @@
Start Length Slot Name Signature
0 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$SubClass;
0 6 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -2514,9 +3129,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2531,11 +3146,21 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -2555,6 +3180,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 17 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -2571,6 +3201,11 @@
Start Length Slot Name Signature
0 9 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -2583,6 +3218,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2595,6 +3235,11 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2609,9 +3254,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2646,6 +3291,11 @@
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -2662,13 +3312,18 @@
LocalVariableTable:
Start Length Slot Name Signature
0 12 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2684,6 +3339,9 @@
private final int mValue;
descriptor: I
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.supported.UnsupportedClass(int);
descriptor: (I)V
@@ -2707,6 +3365,9 @@
Start Length Slot Name Signature
15 10 0 this Lcom/supported/UnsupportedClass;
15 10 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -2726,11 +3387,14 @@
LocalVariableTable:
Start Length Slot Name Signature
15 5 0 this Lcom/supported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -2760,6 +3424,11 @@
Start Length Slot Name Signature
0 14 0 this Lcom/unsupported/UnsupportedClass;
0 14 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -2775,13 +3444,18 @@
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/unsupported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
index 9349355..ebe1422 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/12-hoststubgen-test-tiny-framework-host-ext-stub-dump.txt
@@ -17,6 +17,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -28,6 +33,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -35,9 +45,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -58,6 +68,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -69,6 +84,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -76,9 +96,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -96,9 +116,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
@@ -121,6 +141,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneStub();
descriptor: ()I
@@ -132,6 +157,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -141,9 +171,9 @@
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -164,6 +194,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -175,6 +210,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -186,15 +226,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -212,6 +257,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -226,6 +276,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -240,6 +295,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -254,6 +314,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -265,6 +330,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -276,6 +346,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -283,9 +358,9 @@
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -305,14 +380,29 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkClassClassWideAnnotations();
descriptor: ()V
@@ -324,6 +414,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -335,6 +430,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -346,6 +446,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -357,6 +462,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -368,6 +478,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -379,6 +494,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -390,6 +510,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -401,13 +526,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -424,6 +554,11 @@
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -435,6 +570,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -447,6 +587,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -458,13 +603,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -480,6 +630,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -487,6 +642,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -495,9 +655,9 @@
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -513,6 +673,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -520,6 +685,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -528,9 +698,9 @@
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -552,6 +722,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -559,6 +734,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -566,6 +746,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -573,6 +758,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -584,6 +774,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -595,6 +790,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -607,6 +807,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -621,6 +826,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -635,6 +845,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -649,6 +864,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -660,14 +880,19 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -683,6 +908,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -690,6 +920,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -697,6 +932,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -708,6 +948,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -719,6 +964,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -731,6 +981,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -742,6 +997,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -753,14 +1013,19 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -783,6 +1048,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -794,13 +1064,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -816,6 +1091,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkForTextPolicy();
descriptor: ()V
@@ -827,6 +1107,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -838,6 +1123,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -849,6 +1139,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -860,6 +1155,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -871,13 +1171,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -891,6 +1196,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -899,6 +1209,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -913,6 +1228,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -928,6 +1248,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -943,6 +1268,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -957,6 +1287,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -968,6 +1303,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -979,6 +1319,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -990,6 +1335,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -997,9 +1347,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1019,6 +1369,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1027,6 +1382,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1041,6 +1401,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1056,6 +1421,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1071,6 +1441,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1085,6 +1460,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1096,6 +1476,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1107,6 +1492,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -1118,6 +1508,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -1125,9 +1520,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1147,6 +1542,11 @@
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNative();
descriptor: ()V
@@ -1158,10 +1558,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native int nativeAddTwo(int);
descriptor: (I)I
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -1173,10 +1583,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static native long nativeLongPlus(long, long);
descriptor: (JJ)J
flags: (0x0109) ACC_PUBLIC, ACC_STATIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -1188,6 +1608,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -1199,10 +1624,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public native int nativeNonStaticAddToValue(int);
descriptor: (I)I
flags: (0x0101) ACC_PUBLIC, ACC_NATIVE
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -1214,13 +1649,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1240,6 +1680,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$BaseClass(int);
descriptor: (I)V
@@ -1251,15 +1696,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1273,10 +1723,20 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$InnerClass(com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;)V
@@ -1288,15 +1748,20 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1313,6 +1778,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses$StaticNestedClass();
descriptor: ()V
@@ -1324,6 +1794,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1336,6 +1811,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1343,9 +1823,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1369,6 +1849,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -1376,9 +1861,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -1393,11 +1878,21 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -1409,6 +1904,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -1421,6 +1921,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -1433,6 +1938,11 @@
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1444,6 +1954,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -1458,9 +1973,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1493,6 +2008,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -1504,13 +2024,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1533,6 +2058,11 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -1544,13 +2074,18 @@
x: ldc #x // String Stub!
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
index 5ff3cde..49be4db 100644
--- a/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
+++ b/tools/hoststubgen/hoststubgen/test-tiny-framework/golden-output/13-hoststubgen-test-tiny-framework-host-ext-impl-dump.txt
@@ -20,11 +20,14 @@
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -55,7 +58,7 @@
SourceFile: "HostSideTestKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -86,11 +89,14 @@
public abstract java.lang.String value();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestNativeSubstitutionClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -121,7 +127,7 @@
SourceFile: "HostSideTestRemove.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -152,7 +158,7 @@
SourceFile: "HostSideTestStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x,e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE,Ljava/lang/annotation/ElementType;.FIELD,Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -183,11 +189,14 @@
public abstract java.lang.String suffix();
descriptor: ()Ljava/lang/String;
flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "HostSideTestSubstitute.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD]
@@ -218,7 +227,7 @@
SourceFile: "HostSideTestThrow.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x,e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.METHOD,Ljava/lang/annotation/ElementType;.CONSTRUCTOR]
@@ -249,7 +258,7 @@
SourceFile: "HostSideTestWholeClassKeep.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -280,7 +289,7 @@
SourceFile: "HostSideTestWholeClassStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
x: #x(#x=[e#x.#x])
java.lang.annotation.Target(
value=[Ljava/lang/annotation/ElementType;.TYPE]
@@ -325,6 +334,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addTwo(int);
descriptor: (I)I
@@ -344,6 +358,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -351,9 +370,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub.class
Compiled from "IPretendingAidl.java"
@@ -391,6 +410,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int addOne(int);
descriptor: (I)I
@@ -410,6 +434,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 a I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Stub=class com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub of class com/android/hoststubgen/test/tinyframework/IPretendingAidl
@@ -417,9 +446,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/IPretendingAidl
## Class: com/android/hoststubgen/test/tinyframework/IPretendingAidl.class
Compiled from "IPretendingAidl.java"
@@ -446,9 +475,9 @@
SourceFile: "IPretendingAidl.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestMembers:
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub
com/android/hoststubgen/test/tinyframework/IPretendingAidl$Stub$Proxy
@@ -488,6 +517,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOneKeep();
descriptor: ()I
@@ -508,6 +542,9 @@
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -525,6 +562,11 @@
x: iconst_1
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -534,9 +576,9 @@
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck.class
Compiled from "TinyFrameworkCallerCheck.java"
@@ -574,6 +616,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_withCheck();
descriptor: ()I
@@ -588,6 +635,11 @@
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneKeep:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int getOne_noCheck();
descriptor: ()I
@@ -602,15 +654,20 @@
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl.getOneStub:()I
x: ireturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
private static #x= #x of #x; // Impl=class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck$Impl of class com/android/hoststubgen/test/tinyframework/TinyFrameworkCallerCheck
SourceFile: "TinyFrameworkCallerCheck.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -628,6 +685,11 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -635,6 +697,9 @@
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -675,6 +740,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -698,6 +768,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -727,6 +802,9 @@
Start Length Slot Name Signature
26 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
26 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -750,6 +828,13 @@
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -769,6 +854,13 @@
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -792,6 +884,11 @@
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestThrow
@@ -813,6 +910,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -820,9 +922,9 @@
SourceFile: "TinyFrameworkClassAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -842,14 +944,29 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int remove;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -884,6 +1001,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -904,6 +1026,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -924,6 +1051,11 @@
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void toBeRemoved(java.lang.String);
descriptor: (Ljava/lang/String;)V
@@ -944,6 +1076,11 @@
Start Length Slot Name Signature
11 8 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 8 1 foo Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -964,6 +1101,13 @@
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -983,6 +1127,13 @@
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1000,6 +1151,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 3 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1018,13 +1174,18 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassClassWideAnnotations;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassClassWideAnnotations.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1041,6 +1202,11 @@
descriptor: Ljava/util/Set;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/Set<Ljava/lang/Class<*>;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkClassLoadHook();
descriptor: ()V
@@ -1059,6 +1225,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkClassLoadHook;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static void onClassLoaded(java.lang.Class<?>);
descriptor: (Ljava/lang/Class;)V
@@ -1083,6 +1254,11 @@
Start Length Slot Name Signature
11 11 0 clazz Ljava/lang/Class<*>;
Signature: #x // (Ljava/lang/Class<*>;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1103,13 +1279,18 @@
x: putstatic #x // Field sLoadedClasses:Ljava/util/Set;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassLoadHook.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1125,6 +1306,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1132,6 +1318,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1140,9 +1331,9 @@
SourceFile: "TinyFrameworkClassWithInitializerDefault.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1158,6 +1349,11 @@
public static boolean sInitialized;
descriptor: Z
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1165,6 +1361,11 @@
public static java.lang.Object sObject;
descriptor: Ljava/lang/Object;
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1193,13 +1394,16 @@
x: putstatic #x // Field sObject:Ljava/lang/Object;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkClassWithInitializerStub.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x(#x=s#x)
android.hosttest.annotation.HostSideTestClassLoadHook(
@@ -1221,6 +1425,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex RED;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1228,6 +1437,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex GREEN;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1235,6 +1449,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex BLUE;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1242,6 +1461,9 @@
private final java.lang.String mLongName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -1249,6 +1471,9 @@
private final java.lang.String mShortName;
descriptor: Ljava/lang/String;
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestKeep
@@ -1256,6 +1481,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -1272,6 +1502,11 @@
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
@@ -1292,6 +1527,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumComplex(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V
@@ -1321,6 +1561,11 @@
11 18 3 longName Ljava/lang/String;
11 18 4 shortName Ljava/lang/String;
Signature: #x // (Ljava/lang/String;Ljava/lang/String;)V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1342,6 +1587,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1363,6 +1613,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1393,6 +1648,11 @@
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1435,14 +1695,19 @@
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumComplex;>;
SourceFile: "TinyFrameworkEnumComplex.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1458,6 +1723,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple CAT;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1465,6 +1735,11 @@
public static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple DOG;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x4019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL, ACC_ENUM
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1472,6 +1747,11 @@
private static final com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $VALUES;
descriptor: [Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
flags: (0x101a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1488,6 +1768,11 @@
x: checkcast #x // class "[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;"
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple valueOf(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1508,6 +1793,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 name Ljava/lang/String;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple();
descriptor: (Ljava/lang/String;I)V
@@ -1529,6 +1819,11 @@
Start Length Slot Name Signature
11 7 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
Signature: #x // ()V
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static com.android.hoststubgen.test.tinyframework.TinyFrameworkEnumSimple[] $values();
descriptor: ()[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
@@ -1552,6 +1847,11 @@
x: aastore
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -1582,14 +1882,19 @@
x: putstatic #x // Field $VALUES:[Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
Signature: #x // Ljava/lang/Enum<Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkEnumSimple;>;
SourceFile: "TinyFrameworkEnumSimple.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1629,6 +1934,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkExceptionTester;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int testException();
descriptor: ()I
@@ -1662,13 +1972,18 @@
LocalVariableTable:
Start Length Slot Name Signature
22 11 0 e Ljava/lang/Exception;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkExceptionTester.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -1684,10 +1999,18 @@
public int stub;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int keep;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -1725,6 +2048,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOne(int);
descriptor: (I)I
@@ -1745,6 +2073,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
11 6 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addOneInner(int);
descriptor: (I)I
@@ -1771,6 +2104,9 @@
Start Length Slot Name Signature
26 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
26 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int addTwo(int);
descriptor: (I)I
@@ -1791,6 +2127,13 @@
Start Length Slot Name Signature
11 4 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
11 4 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddThree(int);
descriptor: (I)I
@@ -1810,6 +2153,13 @@
LocalVariableTable:
Start Length Slot Name Signature
11 4 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String unsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1833,6 +2183,11 @@
x: ldc #x // String Unreachable
x: invokespecial #x // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
x: athrow
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsThrow
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.String visibleButUsesUnsupportedMethod();
descriptor: ()Ljava/lang/String;
@@ -1851,13 +2206,18 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkForTextPolicy;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkForTextPolicy.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested.class
Compiled from "TinyFrameworkLambdas.java"
public class com.android.hoststubgen.test.tinyframework.TinyFrameworkLambdas$Nested
@@ -1871,6 +2231,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1879,6 +2244,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1903,6 +2273,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1924,6 +2299,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1942,6 +2322,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -1960,6 +2345,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -1975,6 +2365,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -1990,6 +2385,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -2005,6 +2405,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2023,6 +2428,9 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -2030,9 +2438,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2073,6 +2481,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2081,6 +2494,11 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2105,6 +2523,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 14 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2126,6 +2549,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2144,6 +2572,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2162,6 +2595,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$getSupplier$2();
descriptor: ()Ljava/lang/Integer;
@@ -2177,6 +2615,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$static$1();
descriptor: ()Ljava/lang/Integer;
@@ -2192,6 +2635,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static java.lang.Integer lambda$new$0();
descriptor: ()Ljava/lang/Integer;
@@ -2207,6 +2655,11 @@
x: invokestatic #x // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
x: areturn
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -2225,6 +2678,9 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // Nested=class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas$Nested of class com/android/hoststubgen/test/tinyframework/TinyFrameworkLambdas
@@ -2232,9 +2688,9 @@
SourceFile: "TinyFrameworkLambdas.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestStub
@@ -2275,6 +2731,11 @@
int value;
descriptor: I
flags: (0x0000)
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2303,6 +2764,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -2312,6 +2778,13 @@
x: iload_0
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeAddTwo:(I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo_should_be_like_this(int);
descriptor: (I)I
@@ -2330,6 +2803,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -2340,6 +2818,13 @@
x: lload_2
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeLongPlus:(JJ)J
x: lreturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus_should_be_like_this(long, long);
descriptor: (JJ)J
@@ -2360,6 +2845,11 @@
Start Length Slot Name Signature
11 6 0 arg1 J
11 6 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public void setValue(int);
descriptor: (I)V
@@ -2380,6 +2870,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
11 6 1 v I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue(int);
descriptor: (I)I
@@ -2390,6 +2885,13 @@
x: iload_1
x: invokestatic #x // Method com/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host.nativeNonStaticAddToValue:(Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
x: ireturn
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenProcessedAsSubstitute
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int nativeNonStaticAddToValue_should_be_like_this(int);
descriptor: (I)I
@@ -2410,13 +2912,18 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
11 6 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -2466,6 +2973,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative_host;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeAddTwo(int);
descriptor: (I)I
@@ -2491,6 +3001,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 4 0 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static long nativeLongPlus(long, long);
descriptor: (JJ)J
@@ -2517,6 +3030,9 @@
Start Length Slot Name Signature
26 4 0 arg1 J
26 4 2 arg2 J
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int nativeNonStaticAddToValue(com.android.hoststubgen.test.tinyframework.TinyFrameworkNative, int);
descriptor: (Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;I)I
@@ -2544,11 +3060,14 @@
Start Length Slot Name Signature
26 7 0 source Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNative;
26 7 1 arg I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkNative_host.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -2564,6 +3083,9 @@
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2596,6 +3118,9 @@
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
11 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2620,6 +3145,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2644,6 +3172,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -2652,7 +3183,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2690,6 +3221,9 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2714,6 +3248,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2738,6 +3275,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$2
@@ -2746,7 +3286,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2760,6 +3300,9 @@
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2792,6 +3335,9 @@
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
11 10 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2816,6 +3362,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2840,6 +3389,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$3
@@ -2848,7 +3400,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2886,6 +3438,9 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -2910,6 +3465,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -2934,6 +3492,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$4
@@ -2942,7 +3503,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -2956,6 +3517,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -2988,15 +3554,20 @@
Start Length Slot Name Signature
11 10 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass;
11 10 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3010,10 +3581,20 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
final com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses this$0;
descriptor: Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
flags: (0x1010) ACC_FINAL, ACC_SYNTHETIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3049,15 +3630,20 @@
Start Length Slot Name Signature
11 15 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass;
11 15 1 this$0 Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public #x= #x of #x; // InnerClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$InnerClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3098,6 +3684,9 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Integer get();
descriptor: ()Ljava/lang/Integer;
@@ -3122,6 +3711,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.lang.Object get();
descriptor: ()Ljava/lang/Object;
@@ -3146,6 +3738,9 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass$1;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3155,7 +3750,7 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3169,6 +3764,11 @@
public int value;
descriptor: I
flags: (0x0001) ACC_PUBLIC
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3200,6 +3800,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 11 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -3217,6 +3822,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // StaticNestedClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$StaticNestedClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3224,9 +3834,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3269,6 +3879,11 @@
Start Length Slot Name Signature
11 6 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$SubClass;
11 6 1 x I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
public static #x= #x of #x; // BaseClass=class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$BaseClass of class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
@@ -3276,9 +3891,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
NestHost: class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses
## Class: com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses.class
Compiled from "TinyFrameworkNestedClasses.java"
@@ -3293,11 +3908,21 @@
descriptor: Ljava/util/function/Supplier;
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static final java.util.function.Supplier<java.lang.Integer> sSupplier;
descriptor: Ljava/util/function/Supplier;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Signature: #x // Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public com.android.hoststubgen.test.tinyframework.TinyFrameworkNestedClasses();
descriptor: ()V
@@ -3322,6 +3947,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 17 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public java.util.function.Supplier<java.lang.Integer> getSupplier();
descriptor: ()Ljava/util/function/Supplier;
@@ -3343,6 +3973,11 @@
Start Length Slot Name Signature
11 9 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses;
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static java.util.function.Supplier<java.lang.Integer> getSupplier_static();
descriptor: ()Ljava/util/function/Supplier;
@@ -3360,6 +3995,11 @@
x: areturn
LineNumberTable:
Signature: #x // ()Ljava/util/function/Supplier<Ljava/lang/Integer;>;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
static {};
descriptor: ()V
@@ -3380,6 +4020,11 @@
x: putstatic #x // Field sSupplier:Ljava/util/function/Supplier;
x: return
LineNumberTable:
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
InnerClasses:
#x; // class com/android/hoststubgen/test/tinyframework/TinyFrameworkNestedClasses$1
@@ -3394,9 +4039,9 @@
SourceFile: "TinyFrameworkNestedClasses.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3446,6 +4091,11 @@
LocalVariableTable:
Start Length Slot Name Signature
11 5 0 this Lcom/android/hoststubgen/test/tinyframework/TinyFrameworkPackageRedirect;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public static int foo(int);
descriptor: (I)I
@@ -3467,13 +4117,18 @@
LocalVariableTable:
Start Length Slot Name Signature
11 12 0 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "TinyFrameworkPackageRedirect.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
@@ -3489,6 +4144,9 @@
private final int mValue;
descriptor: I
flags: (0x0012) ACC_PRIVATE, ACC_FINAL
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
private static {};
descriptor: ()V
@@ -3527,6 +4185,9 @@
Start Length Slot Name Signature
26 10 0 this Lcom/supported/UnsupportedClass;
26 10 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -3551,11 +4212,14 @@
LocalVariableTable:
Start Length Slot Name Signature
26 5 0 this Lcom/supported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassKeep
@@ -3600,6 +4264,11 @@
Start Length Slot Name Signature
11 14 0 this Lcom/unsupported/UnsupportedClass;
11 14 1 value I
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
public int getValue();
descriptor: ()I
@@ -3620,13 +4289,18 @@
LocalVariableTable:
Start Length Slot Name Signature
11 10 0 this Lcom/unsupported/UnsupportedClass;
+ RuntimeVisibleAnnotations:
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
+ x: #x()
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
}
SourceFile: "UnsupportedClass.java"
RuntimeVisibleAnnotations:
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedStubClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
x: #x()
- com.android.hoststubgen.hosthelper.HostStubGenProcessedKeepClass
+ com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
RuntimeInvisibleAnnotations:
x: #x()
android.hosttest.annotation.HostSideTestWholeClassStub
diff --git a/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/asm/AsmUtilsTest.kt b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/asm/AsmUtilsTest.kt
new file mode 100644
index 0000000..6b46c84
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/asm/AsmUtilsTest.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.hoststubgen.asm
+
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.objectweb.asm.Opcodes.ACC_PRIVATE
+import org.objectweb.asm.Opcodes.ACC_PROTECTED
+import org.objectweb.asm.Opcodes.ACC_PUBLIC
+import org.objectweb.asm.Opcodes.ACC_STATIC
+
+class AsmUtilsTest {
+ private fun checkGetDirectOuterClassName(input: String, expected: String?) {
+ assertThat(getDirectOuterClassName(input)).isEqualTo(expected)
+ }
+
+ @Test
+ fun testGetDirectOuterClassName() {
+ checkGetDirectOuterClassName("a", null)
+ checkGetDirectOuterClassName("a\$x", "a")
+ checkGetDirectOuterClassName("a.b.c\$x", "a.b.c")
+ checkGetDirectOuterClassName("a.b.c\$x\$y", "a.b.c\$x")
+ }
+
+ @Test
+ fun testVisibility() {
+ fun test(access: Int, expected: Visibility) {
+ assertThat(Visibility.fromAccess(access)).isEqualTo(expected)
+ }
+
+ test(ACC_PUBLIC or ACC_STATIC, Visibility.PUBLIC)
+ test(ACC_PRIVATE or ACC_STATIC, Visibility.PRIVATE)
+ test(ACC_PROTECTED or ACC_STATIC, Visibility.PROTECTED)
+ test(ACC_STATIC, Visibility.PACKAGE_PRIVATE)
+ }
+}
\ No newline at end of file
diff --git a/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/visitors/HelperTest.kt b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/visitors/HelperTest.kt
new file mode 100644
index 0000000..0ea90ed
--- /dev/null
+++ b/tools/hoststubgen/hoststubgen/test/com/android/hoststubgen/visitors/HelperTest.kt
@@ -0,0 +1,102 @@
+/*
+ * 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.hoststubgen.visitors
+
+import com.android.hoststubgen.HostStubGenErrors
+import com.android.hoststubgen.asm.ClassNodes
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.objectweb.asm.Opcodes
+import org.objectweb.asm.tree.ClassNode
+import org.objectweb.asm.tree.MethodNode
+
+class HelperTest {
+ @Test
+ fun testCheckSubstitutionMethodCompatibility() {
+ val errors = object : HostStubGenErrors() {
+ override fun onErrorFound(message: String) {
+ // Don't throw
+ }
+ }
+
+ val cn = ClassNode().apply {
+ name = "ClassName"
+ methods = ArrayList()
+ }
+
+ val descriptor = "()V"
+
+ val staticPublic = MethodNode().apply {
+ name = "staticPublic"
+ access = Opcodes.ACC_STATIC or Opcodes.ACC_PUBLIC
+ desc = descriptor
+ cn.methods.add(this)
+ }
+
+ val staticPrivate = MethodNode().apply {
+ name = "staticPrivate"
+ access = Opcodes.ACC_STATIC or Opcodes.ACC_PRIVATE
+ desc = descriptor
+ cn.methods.add(this)
+ }
+
+ val nonStaticPublic = MethodNode().apply {
+ name = "nonStaticPublic"
+ access = Opcodes.ACC_PUBLIC
+ desc = descriptor
+ cn.methods.add(this)
+ }
+
+ val nonStaticPProtected = MethodNode().apply {
+ name = "nonStaticPProtected"
+ access = 0
+ desc = descriptor
+ cn.methods.add(this)
+ }
+
+ val classes = ClassNodes().apply {
+ addClass(cn)
+ }
+
+ fun check(from: MethodNode?, to: MethodNode?, expected: Boolean) {
+ assertThat(checkSubstitutionMethodCompatibility(
+ classes,
+ cn.name,
+ (from?.name ?: "**nonexistentmethodname**"),
+ (to?.name ?: "**nonexistentmethodname**"),
+ descriptor,
+ errors,
+ )).isEqualTo(expected)
+ }
+
+ check(staticPublic, staticPublic, true)
+ check(staticPrivate, staticPrivate, true)
+ check(nonStaticPublic, nonStaticPublic, true)
+ check(nonStaticPProtected, nonStaticPProtected, true)
+
+ check(staticPublic, null, false)
+ check(null, staticPublic, false)
+
+ check(staticPublic, nonStaticPublic, false)
+ check(nonStaticPublic, staticPublic, false)
+
+ check(staticPublic, staticPrivate, false)
+ check(staticPrivate, staticPublic, true)
+
+ check(nonStaticPublic, nonStaticPProtected, false)
+ check(nonStaticPProtected, nonStaticPublic, true)
+ }
+}
\ No newline at end of file
diff --git a/tools/hoststubgen/scripts/run-all-tests.sh b/tools/hoststubgen/scripts/run-all-tests.sh
index 82faa91..c7007db 100755
--- a/tools/hoststubgen/scripts/run-all-tests.sh
+++ b/tools/hoststubgen/scripts/run-all-tests.sh
@@ -18,6 +18,8 @@
# Move to the top directory of hoststubgen
cd ..
+ATEST_ARGS="--host"
+
# These tests are known to pass.
READY_TEST_MODULES=(
HostStubGenTest-framework-all-test-host-test
@@ -34,7 +36,7 @@
run m "${MUST_BUILD_MODULES[@]}"
# Run the hoststubgen unittests / etc
-run atest hoststubgentest hoststubgen-invoke-test
+run atest $ATEST_ARGS hoststubgentest hoststubgen-invoke-test
# Next, run the golden check. This should always pass too.
# The following scripts _should_ pass too, but they depend on the internal paths to soong generated
@@ -44,13 +46,13 @@
run ./hoststubgen/test-framework/run-test-without-atest.sh
run ./hoststubgen/test-tiny-framework/run-test-manually.sh
-run atest tiny-framework-dump-test
+run atest $ATEST_ARGS tiny-framework-dump-test
run ./scripts/build-framework-hostside-jars-and-extract.sh
# This script is already broken on goog/master
# run ./scripts/build-framework-hostside-jars-without-genrules.sh
# These tests should all pass.
-run atest ${READY_TEST_MODULES[*]}
+run atest $ATEST_ARGS ${READY_TEST_MODULES[*]}
-echo ""${0##*/}" finished, with no unexpected failures. Ready to submit!"
\ No newline at end of file
+echo ""${0##*/}" finished, with no failures. Ready to submit!"
\ No newline at end of file