Merge "Import translations. DO NOT MERGE ANYWHERE" into tm-dev
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/BroadcastWaiter.java b/apct-tests/perftests/multiuser/src/android/multiuser/BroadcastWaiter.java
new file mode 100644
index 0000000..7ed97fb
--- /dev/null
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/BroadcastWaiter.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.multiuser;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.io.Closeable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Semaphore;
+
+public class BroadcastWaiter implements Closeable {
+ private final Context mContext;
+ private final String mTag;
+ private final int mTimeoutInSecond;
+ private final Set<String> mActions;
+
+ private final Set<String> mActionReceivedForUser = new HashSet<>();
+ private final List<BroadcastReceiver> mBroadcastReceivers = new ArrayList<>();
+
+ private final Map<String, Semaphore> mSemaphoresMap = new ConcurrentHashMap<>();
+ private Semaphore getSemaphore(final String action, final int userId) {
+ final String key = action + userId;
+ return mSemaphoresMap.computeIfAbsent(key, (String absentKey) -> new Semaphore(0));
+ }
+
+ public BroadcastWaiter(Context context, String tag, int timeoutInSecond, String... actions) {
+ mContext = context;
+ mTag = tag + "_" + BroadcastWaiter.class.getSimpleName();
+ mTimeoutInSecond = timeoutInSecond;
+
+ mActions = new HashSet<>(Arrays.asList(actions));
+ mActions.forEach(this::registerBroadcastReceiver);
+ }
+
+ private void registerBroadcastReceiver(String action) {
+ Log.d(mTag, "#registerBroadcastReceiver for " + action);
+
+ final IntentFilter filter = new IntentFilter(action);
+ if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
+ filter.addDataScheme(ContentResolver.SCHEME_FILE);
+ }
+
+ final BroadcastReceiver receiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (action.equals(intent.getAction())) {
+ final int userId = getSendingUserId();
+ final String data = intent.getDataString();
+ Log.d(mTag, "Received " + action + " for user " + userId
+ + (!TextUtils.isEmpty(data) ? " with " + data : ""));
+ mActionReceivedForUser.add(action + userId);
+ getSemaphore(action, userId).release();
+ }
+ }
+ };
+
+ mContext.registerReceiverForAllUsers(receiver, filter, null, null);
+ mBroadcastReceivers.add(receiver);
+ }
+
+ @Override
+ public void close() {
+ mBroadcastReceivers.forEach(mContext::unregisterReceiver);
+ }
+
+ public boolean hasActionBeenReceivedForUser(String action, int userId) {
+ return mActionReceivedForUser.contains(action + userId);
+ }
+
+ public boolean waitActionForUser(String action, int userId) {
+ Log.d(mTag, "#waitActionForUser(action: " + action + ", userId: " + userId + ")");
+
+ if (!mActions.contains(action)) {
+ Log.d(mTag, "No broadcast receivers registered for " + action);
+ return false;
+ }
+
+ try {
+ if (!getSemaphore(action, userId).tryAcquire(1, mTimeoutInSecond, SECONDS)) {
+ Log.e(mTag, action + " broadcast wasn't received for user " + userId);
+ return false;
+ }
+ } catch (InterruptedException e) {
+ Log.e(mTag, "Interrupted while waiting " + action + " for user " + userId);
+ return false;
+ }
+ return true;
+ }
+
+ public boolean waitActionForUserIfNotReceivedYet(String action, int userId) {
+ return hasActionBeenReceivedForUser(action, userId)
+ || waitActionForUser(action, userId);
+ }
+}
diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
index b6f2152..a44d939 100644
--- a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
+++ b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java
@@ -26,7 +26,6 @@
import android.app.UserSwitchObserver;
import android.app.WaitResult;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.IIntentReceiver;
import android.content.IIntentSender;
@@ -115,6 +114,7 @@
private PackageManager mPm;
private ArrayList<Integer> mUsersToRemove;
private boolean mHasManagedUserFeature;
+ private BroadcastWaiter mBroadcastWaiter;
private final BenchmarkRunner mRunner = new BenchmarkRunner();
@Rule
@@ -129,6 +129,10 @@
mUsersToRemove = new ArrayList<>();
mPm = context.getPackageManager();
mHasManagedUserFeature = mPm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS);
+ mBroadcastWaiter = new BroadcastWaiter(context, TAG, TIMEOUT_IN_SECOND,
+ Intent.ACTION_USER_STARTED,
+ Intent.ACTION_MEDIA_MOUNTED,
+ Intent.ACTION_USER_UNLOCKED);
removeAnyPreviousTestUsers();
if (mAm.getCurrentUser() != UserHandle.USER_SYSTEM) {
Log.w(TAG, "WARNING: Tests are being run from user " + mAm.getCurrentUser()
@@ -138,6 +142,7 @@
@After
public void tearDown() {
+ mBroadcastWaiter.close();
for (int userId : mUsersToRemove) {
try {
mUm.removeUser(userId);
@@ -168,12 +173,10 @@
Log.i(TAG, "Starting timer");
final int userId = createUserNoFlags();
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userId);
// Don't use this.startUserInBackgroundAndWaitForUnlock() since only waiting until
// ACTION_USER_STARTED.
mIam.startUserInBackground(userId);
- waitForLatch("Failed to achieve ACTION_USER_STARTED for user " + userId, latch);
+ waitForBroadcast(Intent.ACTION_USER_STARTED, userId);
mRunner.pauseTiming();
Log.i(TAG, "Stopping timer");
@@ -191,13 +194,11 @@
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createUserNoFlags();
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch, userId);
mRunner.resumeTiming();
Log.i(TAG, "Starting timer");
mIam.startUserInBackground(userId);
- waitForLatch("Failed to achieve ACTION_USER_STARTED for user " + userId, latch);
+ waitForBroadcast(Intent.ACTION_USER_STARTED, userId);
mRunner.pauseTiming();
Log.i(TAG, "Stopping timer");
@@ -255,14 +256,11 @@
mRunner.pauseTiming();
final int startUser = mAm.getCurrentUser();
final int testUser = initializeNewUserAndSwitchBack(/* stopNewUser */ true);
- final CountDownLatch latch = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch, testUser);
mRunner.resumeTiming();
Log.i(TAG, "Starting timer");
mAm.switchUser(testUser);
- waitForLatch("Failed to achieve 2nd ACTION_USER_UNLOCKED for user " + testUser, latch);
-
+ waitForBroadcast(Intent.ACTION_USER_UNLOCKED, testUser);
mRunner.pauseTiming();
Log.i(TAG, "Stopping timer");
@@ -298,13 +296,11 @@
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createUserNoFlags();
- final CountDownLatch latch1 = new CountDownLatch(1);
- final CountDownLatch latch2 = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_STARTED, latch1, userId);
- registerMediaBroadcastReceiver(latch2, userId);
mIam.startUserInBackground(userId);
- waitForLatch("Failed to achieve ACTION_USER_STARTED for user " + userId, latch1);
- waitForLatch("Failed to achieve ACTION_MEDIA_MOUNTED for user " + userId, latch2);
+
+ waitForBroadcast(Intent.ACTION_USER_STARTED, userId);
+ waitForBroadcast(Intent.ACTION_MEDIA_MOUNTED, userId);
+
mRunner.resumeTiming();
Log.i(TAG, "Starting timer");
@@ -347,10 +343,9 @@
mRunner.pauseTiming();
final int startUser = mAm.getCurrentUser();
final int userId = createUserWithFlags(UserInfo.FLAG_EPHEMERAL | UserInfo.FLAG_DEMO);
- final CountDownLatch prelatch = new CountDownLatch(1);
- registerMediaBroadcastReceiver(prelatch, userId);
switchUser(userId);
- waitForLatch("Failed to achieve ACTION_MEDIA_MOUNTED for user " + userId, prelatch);
+ waitForBroadcast(Intent.ACTION_MEDIA_MOUNTED, userId);
+
final CountDownLatch latch = new CountDownLatch(1);
InstrumentationRegistry.getContext().registerReceiver(new BroadcastReceiver() {
@Override
@@ -552,10 +547,9 @@
while (mRunner.keepRunning()) {
mRunner.pauseTiming();
final int userId = createManagedProfile();
- final CountDownLatch prelatch = new CountDownLatch(1);
- registerMediaBroadcastReceiver(prelatch, userId);
startUserInBackgroundAndWaitForUnlock(userId);
- waitForLatch("Failed to achieve ACTION_MEDIA_MOUNTED for user " + userId, prelatch);
+ waitForBroadcast(Intent.ACTION_MEDIA_MOUNTED, userId);
+
mRunner.resumeTiming();
Log.i(TAG, "Starting timer");
@@ -710,13 +704,9 @@
final int origUser = mAm.getCurrentUser();
// First, create and switch to testUser, waiting for its ACTION_USER_UNLOCKED
final int testUser = createUserNoFlags();
- final CountDownLatch latch1 = new CountDownLatch(1);
- final CountDownLatch latch2 = new CountDownLatch(1);
- registerBroadcastReceiver(Intent.ACTION_USER_UNLOCKED, latch1, testUser);
- registerMediaBroadcastReceiver(latch2, testUser);
mAm.switchUser(testUser);
- waitForLatch("Failed to achieve initial ACTION_USER_UNLOCKED for user " + testUser, latch1);
- waitForLatch("Failed to achieve initial ACTION_MEDIA_MOUNTED for user " + testUser, latch2);
+ waitForBroadcast(Intent.ACTION_USER_UNLOCKED, testUser);
+ waitForBroadcast(Intent.ACTION_MEDIA_MOUNTED, testUser);
// Second, switch back to origUser, waiting merely for switchUser() to finish
switchUser(origUser);
@@ -786,50 +776,6 @@
}, TAG);
}
- private void registerBroadcastReceiver(final String action, final CountDownLatch latch,
- final int userId) {
- InstrumentationRegistry.getContext().registerReceiverAsUser(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (action.equals(intent.getAction()) && intent.getIntExtra(
- Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL) == userId) {
- latch.countDown();
- }
- }
- }, UserHandle.of(userId), new IntentFilter(action), null, null);
- }
-
- /**
- * Register for a broadcast to indicate that Storage has processed the given user.
- * Without this as part of setup, for tests dealing with already-switched users, Storage may not
- * have finished, making the resulting processing inconsistent.
- *
- * Strictly speaking, the receiver should always be unregistered afterwards, but we don't
- * necessarily bother since receivers from failed tests will be removed on test uninstallation.
- */
- private void registerMediaBroadcastReceiver(final CountDownLatch latch, final int userId) {
- final String action = Intent.ACTION_MEDIA_MOUNTED;
-
- final IntentFilter filter = new IntentFilter();
- filter.addAction(action);
- filter.addDataScheme(ContentResolver.SCHEME_FILE);
-
- final Context context = InstrumentationRegistry.getContext();
- context.registerReceiverAsUser(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String data = intent.getDataString();
- if (action.equals(intent.getAction())) {
- Log.d(TAG, "Received ACTION_MEDIA_MOUNTED with " + data);
- if (data != null && data.contains("/" + userId)) {
- latch.countDown();
- context.unregisterReceiver(this);
- }
- }
- }
- }, UserHandle.of(userId), filter, null, null);
- }
-
private class ProgressWaiter extends IProgressListener.Stub {
private final CountDownLatch mFinishedLatch = new CountDownLatch(1);
@@ -854,6 +800,17 @@
}
}
+ /**
+ * Waits TIMEOUT_IN_SECOND for the broadcast to be received, otherwise declares the given error.
+ * It only works for the broadcasts provided in {@link #mBroadcastWaiter}'s instantiation above.
+ * @param action action of the broadcast, i.e. {@link Intent#ACTION_USER_STARTED}
+ * @param userId sendingUserId of the broadcast. See {@link BroadcastReceiver#getSendingUserId}
+ */
+ private void waitForBroadcast(String action, int userId) {
+ attestTrue("Failed to achieve " + action + " for user " + userId,
+ mBroadcastWaiter.waitActionForUser(action, userId));
+ }
+
/** Waits TIMEOUT_IN_SECOND for the latch to complete, otherwise declares the given error. */
private void waitForLatch(String errMsg, CountDownLatch latch) {
boolean success = false;
@@ -880,6 +837,9 @@
}
private void removeUser(int userId) {
+ if (mBroadcastWaiter.hasActionBeenReceivedForUser(Intent.ACTION_USER_STARTED, userId)) {
+ mBroadcastWaiter.waitActionForUserIfNotReceivedYet(Intent.ACTION_MEDIA_MOUNTED, userId);
+ }
try {
mUm.removeUser(userId);
final long startTime = System.currentTimeMillis();
diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml
index ca549ae..f58c4b0 100644
--- a/core/res/res/values-land/dimens.xml
+++ b/core/res/res/values-land/dimens.xml
@@ -74,7 +74,7 @@
<!-- Floating toolbar dimensions -->
<dimen name="floating_toolbar_preferred_width">544dp</dimen>
- <dimen name="chooser_preview_width">480dp</dimen>
+ <dimen name="chooser_preview_width">412dp</dimen>
<dimen name="toast_y_offset">24dp</dimen>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 845f89d..c213895 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -638,7 +638,7 @@
<string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Обратитесь в сервисный центр."</string>
<string name="face_acquired_insufficient" msgid="2150805835949162453">"Не удалось собрать данные. Повторите попытку."</string>
<string name="face_acquired_too_bright" msgid="8070756048978079164">"Слишком светло. Сделайте освещение менее ярким."</string>
- <string name="face_acquired_too_dark" msgid="252573548464426546">"Слишком темно. Сделайте освещение ярче."</string>
+ <string name="face_acquired_too_dark" msgid="252573548464426546">"Слишком темно. Сделайте освещение ярче"</string>
<string name="face_acquired_too_close" msgid="1628767882971469833">"Переместите телефон дальше."</string>
<string name="face_acquired_too_far" msgid="5098567726427173896">"Переместите телефон ближе."</string>
<string name="face_acquired_too_high" msgid="4868033653626081839">"Переместите телефон выше."</string>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
index 7760df1..0cb56d7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java
@@ -210,19 +210,19 @@
@Override
public void setBackToLauncherCallback(IOnBackInvokedCallback callback) {
executeRemoteCallWithTaskPermission(mController, "setBackToLauncherCallback",
- (controller) -> mController.setBackToLauncherCallback(callback));
+ (controller) -> controller.setBackToLauncherCallback(callback));
}
@Override
public void clearBackToLauncherCallback() {
executeRemoteCallWithTaskPermission(mController, "clearBackToLauncherCallback",
- (controller) -> mController.clearBackToLauncherCallback());
+ (controller) -> controller.clearBackToLauncherCallback());
}
@Override
public void onBackToLauncherAnimationFinished() {
executeRemoteCallWithTaskPermission(mController, "onBackToLauncherAnimationFinished",
- (controller) -> mController.onBackToLauncherAnimationFinished());
+ (controller) -> controller.onBackToLauncherAnimationFinished());
}
void invalidate() {
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 94a07be..e48e4559 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -385,7 +385,7 @@
<string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Hierdie toestel is gekoppel aan die internet deur VPN\'e."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Jou werkprogramme is deur <xliff:g id="VPN_APP">%1$s</xliff:g> aan die internet gekoppel"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Jou persoonlike programme is gekoppel aan die internet deur <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Hierdie toestel is gekoppel aan die internet deur <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Toestel is gekoppel aan die internet deur <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="monitoring_title_financed_device" msgid="3659962357973919387">"Hierdie toestel word verskaf deur <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Toestelbestuur"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 811baff..ba2d8f0 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -385,10 +385,10 @@
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> može pratiti mrežni saobraćaj na vašem radnom profilu"</string>
<string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"Mrežna aktivnost radnog profila je vidljiva vašem IT administratoru"</string>
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Mreža može biti nadzirana"</string>
- <string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Ovaj uređaj je povezan na internet putem VPN-ova"</string>
+ <string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Uređaj je povezan s internetom putem VPN-ova"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Vaše poslovne aplikacije su povezane s internetom putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Vaše lične aplikacije su povezane na internet putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Ovaj uređaj je povezan na internet putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
+ <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Lične aplikacije su povezane s internetom putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Uređaj je povezan s internetom putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="monitoring_title_financed_device" msgid="3659962357973919387">"Ovaj uređaj pruža <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Upravljanje uređajem"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN mreža"</string>
@@ -404,10 +404,10 @@
<string name="monitoring_description_ca_certificate" msgid="448923057059097497">"CA certifikat je instaliran na ovom uređaju. Vaš saobraćaj preko sigurne mreže može se pratiti."</string>
<string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Vaš administrator je uključio zapisivanje na mreži, čime se prati saobraćaj na vašem uređaju."</string>
<string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrator je uključio zapisivanje na mreži, čime se nadzire saobraćaj na vašem radnom profilu, ali ne i na ličnom profilu."</string>
- <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Ovaj uređaj je povezan na internet putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem IT administratoru."</string>
- <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Ovaj uređaj je povezan na internet putem aplikacija <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem IT administratoru."</string>
+ <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Uređaj je povezan s internetom putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem IT administratoru."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Uređaj je povezan s internetom putem aplikacija <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem IT administratoru."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Vaše poslovne aplikacije su povezane na internet putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>. Vaša mrežna aktivnost u poslovnim aplikacijama, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem IT administratoru i pružaocu VPN usluga."</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Vaše lične aplikacije su povezane na internet putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem pružaocu VPN usluga."</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Lične aplikacije su povezane s internetom putem aplikacije <xliff:g id="VPN_APP">%1$s</xliff:g>. Vaša mrežna aktivnost, uključujući e-poštu i podatke o pregledanju, je vidljiva vašem pružaocu VPN usluga."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Otvorite postavke VPN mreže"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Ovim uređajem upravlja tvoj roditelj. Roditelj može vidjeti i upravljati informacijama kao što su aplikacije koje koristiš, lokacija i vrijeme korištenja uređaja."</string>
@@ -952,14 +952,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Tekst je kopiran"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Slika je kopirana"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Sadržaj je kopiran"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Uređivač međumemorije"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Međumemorija"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Pregled slike"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"uredi"</string>
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Upravljajte korisnicima"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Ovo obavještenje ne podržava prevlačenje na podijeljeni ekran."</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 8e55176..e814a5c 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -552,7 +552,7 @@
<string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerra"</string>
<string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dreta"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centre"</string>
- <string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulador"</string>
+ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espai"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Retorn"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"Retrocés"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 65f64da7f..631aa81 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Το κείμενο αντιγράφηκε"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Η εικόνα αντιγράφηκε"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Το περιεχόμενο αντιγράφηκε"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Πρόγραμμα επεξεργασίας προχείρου"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Πρόχειρο"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Προεπισκόπηση εικόνας"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"επεξεργασία"</string>
<string name="add" msgid="81036585205287996">"Προσθήκη"</string>
<string name="manage_users" msgid="1823875311934643849">"Διαχείριση χρηστών"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Αυτή η ειδοποίηση δεν υποστηρίζει τη μεταφορά με σύρσιμο για χρήση του διαχωρισμού οθόνης."</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index c8e4b55..1c72886 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -552,7 +552,7 @@
<string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Gauche"</string>
<string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Droite"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centrer"</string>
- <string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulation"</string>
+ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espace"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Entrée"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"Retour arrière"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 3c92877..1718992 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -552,7 +552,7 @@
<string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Esquerda"</string>
<string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Dereita"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Centro"</string>
- <string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulador"</string>
+ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espazo"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Intro"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"Retroceso"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 0470f2f..440b376 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -406,7 +406,7 @@
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"ऑफ़िस के काम से जुड़े ऐप्लिकेशन, <xliff:g id="VPN_APP">%1$s</xliff:g> के ज़रिए इंटरनेट से कनेक्ट किए गए हैं. ऑफ़िस के काम से जुड़े ऐप्लिकेशन में, नेटवर्क पर की गई गतिविधि से जुड़ी जानकारी आपके आईटी एडमिन और वीपीएन सेवा देने वाले को दिखती है. इस जानकारी में, ईमेल और ब्राउज़िंग डेटा शामिल है."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"आपके निजी ऐप्लिकेशन, <xliff:g id="VPN_APP">%1$s</xliff:g> के ज़रिए इंटरनेट से कनेक्ट किए गए हैं. नेटवर्क पर की गई गतिविधि से जुड़ी जानकारी, वीपीएन सेवा देने वाले को दिखती है. इस जानकारी में, ईमेल और ब्राउज़िंग डेटा शामिल है."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
- <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN सेटिंग खोलें"</string>
+ <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"वीपीएन सेटिंग खोलें"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"इस डिवाइस का प्रबंधन आपके अभिभावक करते हैं. अभिभावक आपके डिवाइस से जुड़ी जानकारी देख सकते हैं. साथ ही, इसे प्रबंधित कर सकते हैं. इनमें आपके इस्तेमाल किए गए ऐप्लिकेशन, जगह की जानकारी, और डिवाइस के इस्तेमाल में बिताए गए समय जैसी जानकारी शामिल है."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"वीपीएन"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent की वजह से अनलॉक रखा गया है"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 5f7554d..330363a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -952,14 +952,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Tekst je kopiran"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Slika je kopirana"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Sadržaj je kopiran"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Uređivač međuspremnika"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Međuspremnik"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Pregled slike"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"uredi"</string>
<string name="add" msgid="81036585205287996">"Dodaj"</string>
<string name="manage_users" msgid="1823875311934643849">"Upravljanje korisnicima"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Ova obavijest ne podržava povlačenje na podijeljeni zaslon."</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 90866b5..6c97321 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -385,7 +385,7 @@
<string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Այս սարքը համացանցին միացած է VPN-ների միջոցով"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Ձեր աշխատանքային հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Անձնական հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով"</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Այս սարքը համացանցին միացած է <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Այս սարքը համացանցին միացված է <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով"</string>
<string name="monitoring_title_financed_device" msgid="3659962357973919387">"Այս սարքը տրամադրվել է <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> կազմակերպության կողմից"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Սարքերի կառավարում"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
@@ -401,10 +401,10 @@
<string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Այս սարքում տեղադրված է վկայագրման կենտրոն։ Ձեր ցանցի ապահով թրաֆիկը կարող է վերահսկվել կամ փոփոխվել։"</string>
<string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր սարքի թրաֆիկը։"</string>
<string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր աշխատանքային պրոֆիլի թրաֆիկը (այլ ոչ անձնական պրոֆիլը)։"</string>
- <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Այս սարքը միացած է համացանցին <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային գործողությունները աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին։"</string>
- <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Այս սարքը համացանցին միացած է <xliff:g id="VPN_APP_0">%1$s</xliff:g>-ի և <xliff:g id="VPN_APP_1">%2$s</xliff:g>-ի միջոցով։ Ձեր ցանցային գործողությունները աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին։"</string>
- <string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Աշխատանքային հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային գործողությունները աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին և VPN-ի մատակարարին։"</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Անձնական հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային գործողությունները անձնական հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր VPN-ի մատակարարին։"</string>
+ <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Այս սարքը միացած է համացանցին <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային ակտիվությունը աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին։"</string>
+ <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Այս սարքը համացանցին միացած է <xliff:g id="VPN_APP_0">%1$s</xliff:g>-ի և <xliff:g id="VPN_APP_1">%2$s</xliff:g>-ի միջոցով։ Ձեր ցանցային ակտիվությունը աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին։"</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Աշխատանքային հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային ակտիվությունը աշխատանքային հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր ՏՏ ադմինիստրատորին և VPN-ի մատակարարին։"</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Անձնական հավելվածները համացանցին միացած են <xliff:g id="VPN_APP">%1$s</xliff:g>-ի միջոցով։ Ձեր ցանցային ակտիվությունը անձնական հավելվածներում, ներառյալ էլփոստում և դիտարկիչում արված գործողությունների տվյալները, տեսանելի են ձեր VPN-ի մատակարարին։"</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Բացել VPN-ի կարգավորումները"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Այս սարքը կառավարում է ձեր ծնողը։ Նա կարող է դիտել և փոփոխել որոշակի տեղեկություններ, օրինակ՝ հավելվածները, որոնք դուք օգտագործում եք, ձեր տեղադրությունը և սարքի օգտագործման ժամանակը։"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 8103392..e0af998 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -404,7 +404,7 @@
<string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Questo dispositivo si connette a Internet tramite <xliff:g id="VPN_APP">%1$s</xliff:g>. La tua attività di rete, inclusi email e dati di navigazione, è visibile all\'amministratore IT."</string>
<string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Questo dispositivo si connette a Internet tramite <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>. La tua attività di rete, inclusi email e dati di navigazione, è visibile all\'amministratore IT."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Le tue app di lavoro si connettono a Internet tramite <xliff:g id="VPN_APP">%1$s</xliff:g>. La tua attività di rete nelle app di lavoro, inclusi email e dati di navigazione, è visibile all\'amministratore IT e al provider VPN."</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Le tue app personali si connettono a Internet tramite <xliff:g id="VPN_APP">%1$s</xliff:g>. La tua attività di rete nelle app personali, inclusi email e dati di navigazione, è visibile al provider VPN."</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Le tue app personali si connettono a Internet tramite <xliff:g id="VPN_APP">%1$s</xliff:g>. La tua attività di rete, inclusi email e dati di navigazione, è visibile al provider VPN."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Apri impostazioni VPN"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Questo dispositivo è gestito da uno dei tuoi genitori, il quale può visualizzare e gestire informazioni come le app che usi, la tua posizione e il tuo tempo di utilizzo."</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 29df256..5324ec50 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"テキストをコピーしました"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"画像をコピーしました"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"コンテンツをコピーしました"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"クリップボード エディタ"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"クリップボード"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"画像プレビュー"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"編集"</string>
<string name="add" msgid="81036585205287996">"追加"</string>
<string name="manage_users" msgid="1823875311934643849">"ユーザーの管理"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"この通知は、分割画面へのドラッグがサポートされていません。"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 7f191f7..b5ec088 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"ტექსტი დაკოპირდა"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"სურათი დაკოპირდა"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"კონტენტი დაკოპირდა"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"გაცვლის ბუფერის რედაქტორი"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"გაცვლის ბუფერი"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"სურათის წინასწარი ხედი"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"რედაქტირება"</string>
<string name="add" msgid="81036585205287996">"დამატება"</string>
<string name="manage_users" msgid="1823875311934643849">"მომხმარებლების მართვა"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"ამ შეტყობინების გადათრევა გაყოფილ ეკრანებს შორის არ არის მხარდაჭერილი."</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 3a3773bc..b0171de 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -385,7 +385,7 @@
<string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Бұл құрылғы интернетке VPN желілері арқылы қосылған."</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Жұмыс қолданбаларыңыз интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған."</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Жеке қолданбаларыңыз интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған."</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Бұл желі интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған."</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Бұл құрылғы интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған."</string>
<string name="monitoring_title_financed_device" msgid="3659962357973919387">"Бұл құрылғыны <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ұсынады"</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Құрылғыны басқару"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
@@ -406,7 +406,7 @@
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Жұмыс қолданбаларыңыз интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған. Жұмыс қолданбаларында жасаған желідегі әрекетіңіз, соның ішінде электрондық пошталар мен браузерді пайдалану деректеріңіз әкімшіге және VPN провайдеріне көрінеді."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Жеке қолданбаларыңыз интернетке <xliff:g id="VPN_APP">%1$s</xliff:g> арқылы қосылған. Желідегі әрекетіңіз, соның ішінде электрондық пошталар мен браузерді пайдалану деректеріңіз VPN провайдеріне көрінеді."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
- <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN параметрлерін ашу"</string>
+ <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN параметрлерін ашыңыз."</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Бұл құрылғыны ата-анаңыз басқарады. Ата-анаңыз сіз пайдаланатын қолданбалар, геодерегіңіз және пайдалану уақытыңыз сияқты ақпаратты көре және басқара алады."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent арқылы құлпы ашылды."</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 13a3971..cfc31de 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"ടെക്സ്റ്റ് പകർത്തി"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"ചിത്രം പകർത്തി"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"ഉള്ളടക്കം പകർത്തി"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"ക്ലിപ്പ്ബോർഡ് എഡിറ്റർ"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"ക്ലിപ്പ്ബോർഡ്"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"ചിത്രത്തിന്റെ പ്രിവ്യൂ"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"എഡിറ്റ് ചെയ്യുക"</string>
<string name="add" msgid="81036585205287996">"ചേർക്കുക"</string>
<string name="manage_users" msgid="1823875311934643849">"ഉപയോക്താക്കളെ മാനേജ് ചെയ്യുക"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"സ്പ്ലിറ്റ് സ്ക്രീനിലേക്ക് വലിച്ചിടുന്നതിനെ ഈ അറിയിപ്പ് പിന്തുണയ്ക്കുന്നില്ല."</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index f5a499c..b453c8c 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Текстийг хуулсан"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Зургийг хуулсан"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Контентыг хуулсан"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Түр санах ой засварлагч"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Түр санах ой"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Зураг урьдчилан үзэх"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"засах"</string>
<string name="add" msgid="81036585205287996">"Нэмэх"</string>
<string name="manage_users" msgid="1823875311934643849">"Хэрэглэгчдийг удирдах"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Энэ мэдэгдэл нь Дэлгэцийг хуваах горим руу чирэхийг дэмждэггүй."</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index ff31ac2..1d303eb 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -552,7 +552,7 @@
<string name="keyboard_key_dpad_left" msgid="8329738048908755640">"डावा"</string>
<string name="keyboard_key_dpad_right" msgid="6282105433822321767">"उजवा"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्यवर्ती"</string>
- <string name="keyboard_key_tab" msgid="4592772350906496730">"टॅब"</string>
+ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Enter"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"Backspace"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 77698a9..c4c9ba1 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"ਲਿਖਤ ਕਾਪੀ ਕੀਤੀ ਗਈ"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"ਚਿੱਤਰ ਕਾਪੀ ਕੀਤਾ ਗਿਆ"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"ਸਮੱਗਰੀ ਕਾਪੀ ਕੀਤੀ ਗਈ"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"ਕਲਿੱਪਬੋਰਡ ਸੰਪਾਦਕ"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"ਕਲਿੱਪਬੋਰਡ"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"ਚਿੱਤਰ ਦੀ ਪੂਰਵ-ਝਲਕ"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="add" msgid="81036585205287996">"ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="manage_users" msgid="1823875311934643849">"ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"ਇਹ ਸੂਚਨਾ ਸਪਲਿਟ ਸਕ੍ਰੀਨ \'ਤੇ ਘਸੀਟਣ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਹੈ।"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ca987ec..cd69f86 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Texto copiado"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Imagem copiada"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Conteúdo copiado"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Editor da área de transferência"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Área de transferência"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Visualização da imagem"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string>
<string name="add" msgid="81036585205287996">"Adicionar"</string>
<string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificação não tem suporte para ser arrastada para a tela dividida."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 04946b8..2b22504 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -406,7 +406,7 @@
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"As suas apps de trabalho estão ligadas à Internet através da app <xliff:g id="VPN_APP">%1$s</xliff:g>. A sua atividade de rede em apps de trabalho, incluindo dados de navegação e emails, está visível para o seu administrador de TI e fornecedor de VPN."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"As suas apps pessoais estão ligadas à Internet através da app <xliff:g id="VPN_APP">%1$s</xliff:g>. A sua atividade de rede, incluindo dados de navegação e emails, está visível para o seu fornecedor de VPN."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
- <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Abrir as definições de VPN"</string>
+ <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Abra as definições de VPN"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Este dispositivo é gerido pelos teus pais, que podem ver e gerir informações como as apps que utilizas, a tua localização e o tempo de utilização."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Mantido desbloqueado pelo TrustAgent"</string>
@@ -552,7 +552,7 @@
<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_center" msgid="4079412840715672825">"Ao centro"</string>
- <string name="keyboard_key_tab" msgid="4592772350906496730">"Tabulação"</string>
+ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Espaço"</string>
<string name="keyboard_key_enter" msgid="8633362970109751646">"Enter"</string>
<string name="keyboard_key_backspace" msgid="4095278312039628074">"Retrocesso"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ca987ec..cd69f86 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -945,14 +945,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Texto copiado"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Imagem copiada"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Conteúdo copiado"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Editor da área de transferência"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Área de transferência"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Visualização da imagem"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"editar"</string>
<string name="add" msgid="81036585205287996">"Adicionar"</string>
<string name="manage_users" msgid="1823875311934643849">"Gerenciar usuários"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Esta notificação não tem suporte para ser arrastada para a tela dividida."</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 3a0e5d2..5c5f69b 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -959,14 +959,10 @@
<string name="clipboard_text_copied" msgid="5100836834278976679">"Text bol skopírovaný"</string>
<string name="clipboard_image_copied" msgid="3793365360174328722">"Obrázok bol skopírovaný"</string>
<string name="clipboard_content_copied" msgid="144452398567828145">"Obsah bol skopírovaný"</string>
- <!-- no translation found for clipboard_editor (2971197550401892843) -->
- <skip />
- <!-- no translation found for clipboard_overlay_window_name (6450043652167357664) -->
- <skip />
- <!-- no translation found for clipboard_image_preview (2156475174343538128) -->
- <skip />
- <!-- no translation found for clipboard_edit (4500155216174011640) -->
- <skip />
+ <string name="clipboard_editor" msgid="2971197550401892843">"Editor schránky"</string>
+ <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"Schránka"</string>
+ <string name="clipboard_image_preview" msgid="2156475174343538128">"Ukážka obrázka"</string>
+ <string name="clipboard_edit" msgid="4500155216174011640">"upraviť"</string>
<string name="add" msgid="81036585205287996">"Pridať"</string>
<string name="manage_users" msgid="1823875311934643849">"Spravovať používateľov"</string>
<string name="drag_split_not_supported" msgid="4326847447699729722">"Toto upozornenie nepodporuje presun na rozdelenú obrazovku."</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 6b3d1c2..7820313 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -384,8 +384,8 @@
<string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"Tarmoq kuzatilishi mumkin"</string>
<string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"Bu qurilma internetga VPN tarmoqlari orqali ulangan"</string>
<string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"Ishga oid ilovalar internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan"</string>
- <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Shaxsiy ilovalaringiz internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan"</string>
- <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Bu qurilma internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan"</string>
+ <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"Shaxsiy ilovalaringiz Internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan"</string>
+ <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"Bu qurilma Internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan"</string>
<string name="monitoring_title_financed_device" msgid="3659962357973919387">"Bu qurilma <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tomonidan berilgan."</string>
<string name="monitoring_title_device_owned" msgid="7029691083837606324">"Qurilmalar boshqaruvi"</string>
<string name="monitoring_subtitle_vpn" msgid="800485258004629079">"VPN"</string>
@@ -401,10 +401,10 @@
<string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Qurilmada CA sertifikati o‘rnatilgan. U himoyalangan tarmoq trafigini nazorat qilishi va o‘zgartirishi mumkin."</string>
<string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Administrator qurilmangizdagi trafikni nazorat qiluvchi tarmoq jurnalini yuritishni faollashtirgan."</string>
<string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"Administrator ish profilingizdagi trafikni nazorat qiluvchi tarmoq jurnalini yuritishni faollashtirgan (shaxsiy profildan maʼlumotlar olinmaydi)."</string>
- <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Bu qurilma internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan. Emaillar va brauzer tarixi kabi tarmoq harakatlaringiz AT administratoriga koʻrinadi."</string>
+ <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"Bu qurilma Internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan. Emaillar va brauzer tarixi kabi tarmoqdagi xatti-harakatlaringiz AT administratoriga koʻrinadi."</string>
<string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"Bu qurilma internet <xliff:g id="VPN_APP_0">%1$s</xliff:g> va <xliff:g id="VPN_APP_1">%2$s</xliff:g> orqali ulangan. Emaillar va brauzer tarixi kabi tarmoq harakatlaringiz AT administratoriga koʻrinadi."</string>
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Ishga oid ilovalar internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan. Ishga oid ilovalarda emaillar va brauzer tarixi kabi tarmoq harakatlaringiz AT administratori va VPN provayderiga koʻrinadi."</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Shaxsiy ilovalaringiz internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan. Emaillar va brauzer tarixi kabi tarmoq harakatlaringiz VPN provayderiga koʻrinadi."</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Shaxsiy ilovalaringiz Internetga <xliff:g id="VPN_APP">%1$s</xliff:g> orqali ulangan. Emaillar va brauzer tarixi kabi tarmoqdagi xatti-harakatlaringiz VPN provayderiga koʻrinadi."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
<string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN sozlamalarini ochish"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Bu – ota-onangiz tomonidan boshqariladigan qurilma. Ota-onangiz siz foydalangan ilovalar, joylashuvingiz va qurilmadan foydalanish vaqti kabi axborotlarni koʻrishi va boshqarishi mumkin."</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index dc8231e..9f8da90 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -406,7 +406,7 @@
<string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"Ứng dụng công việc của bạn được kết nối với Internet thông qua <xliff:g id="VPN_APP">%1$s</xliff:g>. Hoạt động mạng trong các ứng dụng công việc, bao gồm email và dữ liệu duyệt web sẽ được hiển thị cho quản trị viên CNTT và nhà cung cấp VPN."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"Ứng dụng cá nhân được kết nối với Internet thông qua <xliff:g id="VPN_APP">%1$s</xliff:g>. Hoạt động mạng của bạn, bao gồm email và dữ liệu duyệt web, được hiển thị cho nhà cung cấp VPN."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string>
- <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Mở cài đặt VPN"</string>
+ <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Mở phần cài đặt VPN"</string>
<string name="monitoring_description_parental_controls" msgid="8184693528917051626">"Thiết bị này do cha mẹ bạn quản lý. Cha mẹ có thể có thể xem và quản lý những thông tin như ứng dụng bạn dùng, vị trí của bạn và thời gian bạn sử dụng thiết bị."</string>
<string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
<string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Luôn được TrustAgent mở khóa"</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
index 3c4c1b6..487e1a4 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java
@@ -23,7 +23,6 @@
import android.content.res.Resources;
import android.graphics.Color;
import android.icu.text.NumberFormat;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -144,7 +143,6 @@
@Override
protected void onViewAttached() {
- Log.d(TAG, "onViewAttached mView=" + mView);
updateLocale();
mBroadcastDispatcher.registerReceiver(mLocaleBroadcastReceiver,
new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
@@ -162,7 +160,6 @@
@Override
protected void onViewDetached() {
- Log.d(TAG, "onViewDetached mView=" + mView);
mBroadcastDispatcher.unregisterReceiver(mLocaleBroadcastReceiver);
mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
mBatteryController.removeCallback(mBatteryCallback);
diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.kt b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.kt
index 19d39d5..e22386e 100644
--- a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.kt
+++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.kt
@@ -25,7 +25,6 @@
import android.text.TextUtils
import android.text.format.DateFormat
import android.util.AttributeSet
-import android.util.Log
import android.widget.TextView
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
@@ -133,22 +132,6 @@
// relayout if the text didn't actually change.
if (!TextUtils.equals(text, formattedText)) {
text = formattedText
- Log.d(
- tag, "refreshTime this=$this" +
- " currTimeContextDesc=$contentDescription" +
- " measuredHeight=$measuredHeight" +
- " lastMeasureCall=$lastMeasureCall" +
- " isSingleLineInternal=$isSingleLineInternal"
- )
- } else {
- Log.d(
- tag, "refreshTime (skipped due to unchanged text)" +
- " this=$this" +
- " currTimeContextDesc=$contentDescription" +
- " measuredHeight=$measuredHeight" +
- " lastMeasureCall=$lastMeasureCall" +
- " isSingleLineInternal=$isSingleLineInternal"
- )
}
}
@@ -169,20 +152,10 @@
} else {
animator.updateLayout(layout)
}
- Log.v(tag, "onMeasure this=$this" +
- " currTimeContextDesc=$contentDescription" +
- " heightMeasureSpecMode=${MeasureSpec.getMode(heightMeasureSpec)}" +
- " heightMeasureSpecSize=${MeasureSpec.getSize(heightMeasureSpec)}" +
- " measuredWidth=$measuredWidth" +
- " measuredHeight=$measuredHeight" +
- " isSingleLineInternal=$isSingleLineInternal")
}
override fun onDraw(canvas: Canvas) {
// intentionally doesn't call super.onDraw here or else the text will be rendered twice
- Log.d(tag, "onDraw this=$this" +
- " currTimeContextDesc=$contentDescription" +
- " isSingleLineInternal=$isSingleLineInternal")
textAnimator?.draw(canvas)
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
index bd5bceb..40edfe5 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
@@ -304,7 +304,7 @@
super.onLayout(changed, l, t, r, b);
if (mDisplayedClockSize != null && !mChildrenAreLaidOut) {
- updateClockViews(mDisplayedClockSize == LARGE, /* animate */ true);
+ post(() -> updateClockViews(mDisplayedClockSize == LARGE, /* animate */ true));
}
mChildrenAreLaidOut = true;
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
index ea14b64..5c9dd5e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java
@@ -237,23 +237,12 @@
mStatusArea = mView.findViewById(R.id.keyguard_status_area);
if (mSmartspaceController.isEnabled()) {
- mSmartspaceView = mSmartspaceController.buildAndConnectView(mView);
View ksv = mView.findViewById(R.id.keyguard_slice_view);
int ksvIndex = mStatusArea.indexOfChild(ksv);
ksv.setVisibility(View.GONE);
- LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
- MATCH_PARENT, WRAP_CONTENT);
-
- mStatusArea.addView(mSmartspaceView, ksvIndex, lp);
- int startPadding = getContext().getResources()
- .getDimensionPixelSize(R.dimen.below_clock_padding_start);
- int endPadding = getContext().getResources()
- .getDimensionPixelSize(R.dimen.below_clock_padding_end);
- mSmartspaceView.setPaddingRelative(startPadding, 0, endPadding, 0);
-
+ addSmartspaceView(ksvIndex);
updateClockLayout();
- mKeyguardUnlockAnimationController.setLockscreenSmartspace(mSmartspaceView);
}
mSecureSettings.registerContentObserverForUser(
@@ -287,6 +276,30 @@
mKeyguardUnlockAnimationListener);
}
+ void onLocaleListChanged() {
+ if (mSmartspaceController.isEnabled()) {
+ int index = mStatusArea.indexOfChild(mSmartspaceView);
+ if (index >= 0) {
+ mStatusArea.removeView(mSmartspaceView);
+ addSmartspaceView(index);
+ }
+ }
+ }
+
+ private void addSmartspaceView(int index) {
+ mSmartspaceView = mSmartspaceController.buildAndConnectView(mView);
+ LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+ MATCH_PARENT, WRAP_CONTENT);
+ mStatusArea.addView(mSmartspaceView, index, lp);
+ int startPadding = getContext().getResources().getDimensionPixelSize(
+ R.dimen.below_clock_padding_start);
+ int endPadding = getContext().getResources().getDimensionPixelSize(
+ R.dimen.below_clock_padding_end);
+ mSmartspaceView.setPaddingRelative(startPadding, 0, endPadding, 0);
+
+ mKeyguardUnlockAnimationController.setLockscreenSmartspace(mSmartspaceView);
+ }
+
/**
* Apply dp changes on font/scale change
*/
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index 083f2fe..8921780 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -224,6 +224,7 @@
@Override
public void onLocaleListChanged() {
refreshTime();
+ mKeyguardClockSwitchController.onLocaleListChanged();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt
index 2035781..4cd40d2 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsBpViewController.kt
@@ -15,11 +15,9 @@
*/
package com.android.systemui.biometrics
-import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import com.android.systemui.statusbar.phone.panelstate.PanelExpansionListener
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
/**
@@ -30,7 +28,6 @@
statusBarStateController: StatusBarStateController,
panelExpansionStateManager: PanelExpansionStateManager,
systemUIDialogManager: SystemUIDialogManager,
- val broadcastSender: BroadcastSender,
dumpManager: DumpManager
) : UdfpsAnimationViewController<UdfpsBpView>(
view,
@@ -40,29 +37,4 @@
dumpManager
) {
override val tag = "UdfpsBpViewController"
- private val bpPanelExpansionListener = PanelExpansionListener { event ->
- // Notification shade can be expanded but not visible (fraction: 0.0), for example
- // when a heads-up notification (HUN) is showing.
- notificationShadeVisible = event.expanded && event.fraction > 0f
- view.onExpansionChanged(event.fraction)
- cancelAuth()
- }
-
- fun cancelAuth() {
- if (shouldPauseAuth()) {
- broadcastSender.closeSystemDialogs()
- }
- }
-
- override fun onViewAttached() {
- super.onViewAttached()
-
- panelExpansionStateManager.addExpansionListener(bpPanelExpansionListener)
- }
-
- override fun onViewDetached() {
- super.onViewDetached()
-
- panelExpansionStateManager.removeExpansionListener(bpPanelExpansionListener)
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index 903b3de..6fa7164 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -24,10 +24,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.graphics.Point;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.display.DisplayManager;
@@ -54,7 +51,6 @@
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.biometrics.dagger.BiometricsBackground;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.DozeReceiver;
@@ -128,7 +124,6 @@
@NonNull private final UnlockedScreenOffAnimationController
mUnlockedScreenOffAnimationController;
@NonNull private final LatencyTracker mLatencyTracker;
- @NonNull private final BroadcastSender mBroadcastSender;
@VisibleForTesting @NonNull final BiometricDisplayListener mOrientationListener;
@NonNull private final ActivityLaunchAnimator mActivityLaunchAnimator;
@@ -209,7 +204,7 @@
mUnlockedScreenOffAnimationController, mHalControlsIllumination,
mHbmProvider, requestId, reason, callback,
(view, event, fromUdfpsView) -> onTouch(requestId, event,
- fromUdfpsView), mActivityLaunchAnimator, mBroadcastSender)));
+ fromUdfpsView), mActivityLaunchAnimator)));
}
@Override
@@ -338,20 +333,6 @@
return velocity > 750f;
}
- private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (mOverlay != null
- && mOverlay.getRequestReason() != REASON_AUTH_KEYGUARD
- && Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
- Log.d(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received, mRequestReason: "
- + mOverlay.getRequestReason());
- mOverlay.cancel();
- hideUdfpsOverlay();
- }
- }
- };
-
/**
* Forwards touches to the udfps controller / view
*/
@@ -606,7 +587,6 @@
@NonNull LatencyTracker latencyTracker,
@NonNull ActivityLaunchAnimator activityLaunchAnimator,
@NonNull Optional<AlternateUdfpsTouchProvider> aternateTouchProvider,
- @NonNull BroadcastSender broadcastSender,
@BiometricsBackground Executor biometricsExecutor) {
mContext = context;
mExecution = execution;
@@ -637,7 +617,6 @@
mLatencyTracker = latencyTracker;
mActivityLaunchAnimator = activityLaunchAnimator;
mAlternateTouchProvider = aternateTouchProvider.orElse(null);
- mBroadcastSender = broadcastSender;
mBiometricExecutor = biometricsExecutor;
mOrientationListener = new BiometricDisplayListener(
@@ -655,11 +634,6 @@
final UdfpsOverlayController mUdfpsOverlayController = new UdfpsOverlayController();
mFingerprintManager.setUdfpsOverlayController(mUdfpsOverlayController);
- final IntentFilter filter = new IntentFilter();
- filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- context.registerReceiver(mBroadcastReceiver, filter,
- Context.RECEIVER_EXPORTED_UNAUDITED);
-
udfpsHapticsSimulator.setUdfpsController(this);
udfpsShell.setUdfpsOverlayController(mUdfpsOverlayController);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index 37db2bd..ec72057 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -41,7 +41,6 @@
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.R
import com.android.systemui.animation.ActivityLaunchAnimator
-import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -84,8 +83,7 @@
@ShowReason val requestReason: Int,
private val controllerCallback: IUdfpsOverlayControllerCallback,
private val onTouch: (View, MotionEvent, Boolean) -> Boolean,
- private val activityLaunchAnimator: ActivityLaunchAnimator,
- private val broadcastSender: BroadcastSender
+ private val activityLaunchAnimator: ActivityLaunchAnimator
) {
/** The view, when [isShowing], or null. */
var overlayView: UdfpsView? = null
@@ -104,8 +102,8 @@
fitInsetsTypes = 0
gravity = android.view.Gravity.TOP or android.view.Gravity.LEFT
layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
- flags = (Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS
- or WindowManager.LayoutParams.FLAG_SPLIT_TOUCH)
+ flags =
+ (Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS or WindowManager.LayoutParams.FLAG_SPLIT_TOUCH)
privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
// Avoid announcing window title.
accessibilityTitle = " "
@@ -227,7 +225,6 @@
statusBarStateController,
panelExpansionStateManager,
dialogManager,
- broadcastSender,
dumpManager
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
index 779c6b4..def574c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java
@@ -23,12 +23,16 @@
import android.animation.ValueAnimator;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.database.ContentObserver;
import android.hardware.biometrics.BiometricSourceType;
+import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.util.MathUtils;
import android.view.View;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import com.android.keyguard.CarrierTextController;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -36,6 +40,7 @@
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
import com.android.systemui.battery.BatteryMeterViewController;
+import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
@@ -45,6 +50,7 @@
import com.android.systemui.statusbar.notification.PropertyAnimator;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
+import com.android.systemui.statusbar.phone.fragment.StatusBarIconBlocklistKt;
import com.android.systemui.statusbar.phone.fragment.StatusBarSystemEventAnimator;
import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserInfoTracker;
import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherController;
@@ -54,10 +60,12 @@
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.util.ViewController;
+import com.android.systemui.util.settings.SecureSettings;
import java.io.PrintWriter;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -98,6 +106,9 @@
private final StatusBarUserSwitcherFeatureController mFeatureController;
private final StatusBarUserSwitcherController mUserSwitcherController;
private final StatusBarUserInfoTracker mStatusBarUserInfoTracker;
+ private final SecureSettings mSecureSettings;
+ private final Executor mMainExecutor;
+ private final Object mLock = new Object();
private final ConfigurationController.ConfigurationListener mConfigurationListener =
new ConfigurationController.ConfigurationListener() {
@@ -206,7 +217,7 @@
}
};
- private final List<String> mBlockedIcons;
+ private final List<String> mBlockedIcons = new ArrayList<>();
private final int mNotificationsHeaderCollideDistance;
private boolean mBatteryListening;
@@ -255,7 +266,9 @@
UserManager userManager,
StatusBarUserSwitcherFeatureController featureController,
StatusBarUserSwitcherController userSwitcherController,
- StatusBarUserInfoTracker statusBarUserInfoTracker
+ StatusBarUserInfoTracker statusBarUserInfoTracker,
+ SecureSettings secureSettings,
+ @Main Executor mainExecutor
) {
super(view);
mCarrierTextController = carrierTextController;
@@ -277,6 +290,8 @@
mFeatureController = featureController;
mUserSwitcherController = userSwitcherController;
mStatusBarUserInfoTracker = statusBarUserInfoTracker;
+ mSecureSettings = secureSettings;
+ mMainExecutor = mainExecutor;
mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled();
mKeyguardStateController.addCallback(
@@ -292,8 +307,7 @@
);
Resources r = getResources();
- mBlockedIcons = Arrays.asList(r.getStringArray(
- R.array.config_keyguard_statusbar_icon_blocklist));
+ updateBlockedIcons();
mNotificationsHeaderCollideDistance = r.getDimensionPixelSize(
R.dimen.header_notifications_collide_distance);
@@ -321,11 +335,16 @@
if (mTintedIconManager == null) {
mTintedIconManager =
mTintedIconManagerFactory.create(mView.findViewById(R.id.statusIcons));
- mTintedIconManager.setBlockList(mBlockedIcons);
+ mTintedIconManager.setBlockList(getBlockedIcons());
mStatusBarIconController.addIconGroup(mTintedIconManager);
}
mView.setOnApplyWindowInsetsListener(
(view, windowInsets) -> mView.updateWindowInsets(windowInsets, mInsetsProvider));
+ mSecureSettings.registerContentObserverForUser(
+ Settings.Secure.getUriFor(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON),
+ false,
+ mVolumeSettingObserver,
+ UserHandle.USER_ALL);
updateUserSwitcher();
onThemeChanged();
}
@@ -337,6 +356,7 @@
mUserInfoController.removeCallback(mOnUserInfoChangedListener);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
+ mSecureSettings.unregisterContentObserver(mVolumeSettingObserver);
if (mTintedIconManager != null) {
mStatusBarIconController.removeIconGroup(mTintedIconManager);
}
@@ -486,8 +506,32 @@
R.bool.qs_show_user_switcher_for_single_user)));
}
+ @VisibleForTesting
+ void updateBlockedIcons() {
+ List<String> newBlockList = StatusBarIconBlocklistKt
+ .getStatusBarIconBlocklist(getResources(), mSecureSettings);
+
+ synchronized (mLock) {
+ mBlockedIcons.clear();
+ mBlockedIcons.addAll(newBlockList);
+ }
+
+ mMainExecutor.execute(() -> {
+ if (mTintedIconManager != null) {
+ mTintedIconManager.setBlockList(getBlockedIcons());
+ }
+ });
+ }
+
+ @VisibleForTesting
+ List<String> getBlockedIcons() {
+ synchronized (mLock) {
+ return new ArrayList<>(mBlockedIcons);
+ }
+ }
+
/**
- * Update {@link KeyguardStatusBarView}'s visibility based on whether keyguard is showing and
+ Update {@link KeyguardStatusBarView}'s visibility based on whether keyguard is showing and
* whether heads up is visible.
*/
public void updateForHeadsUp() {
@@ -533,4 +577,11 @@
mExplicitAlpha = alpha;
updateViewState();
}
+
+ private final ContentObserver mVolumeSettingObserver = new ContentObserver(null) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateBlockedIcons();
+ }
+ };
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarIconBlocklist.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarIconBlocklist.kt
new file mode 100644
index 0000000..b845bad
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarIconBlocklist.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.phone.fragment
+
+import android.content.res.Resources
+import android.os.UserHandle
+import android.provider.Settings
+import com.android.internal.R
+import com.android.systemui.util.settings.SecureSettings
+
+/**
+ * Centralize the logic for the status bar / keyguard status bar icon blocklist. The default is
+ * loaded from the config, and we currently support a system setting for the vibrate icon. It's
+ * pretty likely that we would end up supporting more user-configurable settings in the future, so
+ * breaking this out into its own file for now.
+ *
+ * Note for the future: it might be reasonable to turn this into its own class that can listen to
+ * the system setting and execute a callback when it changes instead of having multiple content
+ * observers.
+ */
+fun getStatusBarIconBlocklist(
+ res: Resources,
+ settings: SecureSettings
+): List<String> {
+ // Load the default blocklist from res
+ val blocklist = res.getStringArray(
+ com.android.systemui.R.array.config_collapsed_statusbar_icon_blocklist).toList()
+
+ val vibrateIconSlot: String = res.getString(R.string.status_bar_volume)
+ val showVibrateIcon = settings.getIntForUser(
+ Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON,
+ 0,
+ UserHandle.USER_CURRENT) == 0
+
+ // Filter out vibrate icon from the blocklist if the setting is on
+ return blocklist.filter { icon ->
+ !icon.equals(vibrateIconSlot) || showVibrateIcon
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index fe9e75c..5db2cf4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -229,13 +229,22 @@
@Test
public void testSmartspaceEnabledRemovesKeyguardStatusArea() {
when(mSmartspaceController.isEnabled()).thenReturn(true);
- when(mSmartspaceController.buildAndConnectView(any())).thenReturn(mFakeSmartspaceView);
mController.init();
assertEquals(View.GONE, mSliceView.getVisibility());
}
@Test
+ public void onLocaleListChangedRebuildsSmartspaceView() {
+ when(mSmartspaceController.isEnabled()).thenReturn(true);
+ mController.init();
+
+ mController.onLocaleListChanged();
+ // Should be called once on initial setup, then once again for locale change
+ verify(mSmartspaceController, times(2)).buildAndConnectView(mView);
+ }
+
+ @Test
public void testSmartspaceDisabledShowsKeyguardStatusArea() {
when(mSmartspaceController.isEnabled()).thenReturn(false);
mController.init();
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
index 650a5d0..70025230 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
@@ -25,6 +25,7 @@
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.ScreenOffAnimationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
+import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Before;
@@ -117,4 +118,16 @@
verify(mKeyguardStatusView).setChildrenTranslationYExcludingMediaView(translationY);
}
+
+ @Test
+ public void onLocaleListChangedNotifiesClockSwitchController() {
+ ArgumentCaptor<ConfigurationListener> configurationListenerArgumentCaptor =
+ ArgumentCaptor.forClass(ConfigurationListener.class);
+
+ mController.onViewAttached();
+ verify(mConfigurationController).addCallback(configurationListenerArgumentCaptor.capture());
+
+ configurationListenerArgumentCaptor.getValue().onLocaleListChanged();
+ verify(mKeyguardClockSwitchController).onLocaleListChanged();
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt
deleted file mode 100644
index a52c4a3..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsBpViewControllerTest.kt
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.biometrics
-
-import android.app.Instrumentation
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import android.testing.ViewUtils
-import androidx.test.filters.SmallTest
-import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
-import com.android.internal.jank.InteractionJankMonitor
-import com.android.internal.logging.testing.UiEventLoggerFake
-import com.android.systemui.R
-import com.android.systemui.SysuiTestCase
-import com.android.systemui.broadcast.BroadcastSender
-import com.android.systemui.dump.DumpManager
-import com.android.systemui.statusbar.StatusBarStateControllerImpl
-import com.android.systemui.statusbar.phone.SystemUIDialogManager
-import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager
-import com.android.systemui.util.mockito.any
-import org.junit.After
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito.spy
-import org.mockito.Mockito.times
-import org.mockito.Mockito.verify
-import org.mockito.junit.MockitoJUnit
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-@TestableLooper.RunWithLooper
-class UdfpsBpViewControllerTest : SysuiTestCase() {
-
- @JvmField @Rule var rule = MockitoJUnit.rule()
-
- @Mock lateinit var dumpManager: DumpManager
- @Mock lateinit var systemUIDialogManager: SystemUIDialogManager
- @Mock lateinit var broadcastSender: BroadcastSender
- @Mock lateinit var interactionJankMonitor: InteractionJankMonitor
- @Mock lateinit var panelExpansionStateManager: PanelExpansionStateManager
-
- private lateinit var instrumentation: Instrumentation
- private lateinit var uiEventLogger: UiEventLoggerFake
- private lateinit var udfpsBpView: UdfpsBpView
- private lateinit var statusBarStateController: StatusBarStateControllerImpl
- private lateinit var udfpsBpViewController: UdfpsBpViewController
-
- @Before
- fun setup() {
- instrumentation = getInstrumentation()
- instrumentation.runOnMainSync { createUdfpsView() }
- instrumentation.waitForIdleSync()
-
- uiEventLogger = UiEventLoggerFake()
- statusBarStateController =
- StatusBarStateControllerImpl(uiEventLogger, dumpManager, interactionJankMonitor)
- udfpsBpViewController = UdfpsBpViewController(
- udfpsBpView,
- statusBarStateController,
- panelExpansionStateManager,
- systemUIDialogManager,
- broadcastSender,
- dumpManager)
- udfpsBpViewController.init()
- }
-
- @After
- fun tearDown() {
- if (udfpsBpViewController.isAttachedToWindow) {
- instrumentation.runOnMainSync { ViewUtils.detachView(udfpsBpView) }
- instrumentation.waitForIdleSync()
- }
- }
-
- private fun createUdfpsView() {
- context.setTheme(R.style.Theme_AppCompat)
- context.orCreateTestableResources.addOverride(
- com.android.internal.R.integer.config_udfps_illumination_transition_ms, 0)
- udfpsBpView = UdfpsBpView(context, null)
- }
-
- @Test
- fun addExpansionListener() {
- instrumentation.runOnMainSync { ViewUtils.attachView(udfpsBpView) }
- instrumentation.waitForIdleSync()
-
- // Both UdfpsBpViewController & UdfpsAnimationViewController add listener
- verify(panelExpansionStateManager, times(2)).addExpansionListener(any())
- }
-
- @Test
- fun removeExpansionListener() {
- instrumentation.runOnMainSync { ViewUtils.attachView(udfpsBpView) }
- instrumentation.waitForIdleSync()
- instrumentation.runOnMainSync { ViewUtils.detachView(udfpsBpView) }
- instrumentation.waitForIdleSync()
-
- // Both UdfpsBpViewController & UdfpsAnimationViewController remove listener
- verify(panelExpansionStateManager, times(2)).removeExpansionListener(any())
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
index 431739b..cb8358d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerOverlayTest.kt
@@ -40,7 +40,6 @@
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.ActivityLaunchAnimator
-import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.LockscreenShadeTransitionController
@@ -103,7 +102,6 @@
@Mock private lateinit var udfpsView: UdfpsView
@Mock private lateinit var udfpsEnrollView: UdfpsEnrollView
@Mock private lateinit var activityLaunchAnimator: ActivityLaunchAnimator
- @Mock private lateinit var broadcastSender: BroadcastSender
@Captor private lateinit var layoutParamsCaptor: ArgumentCaptor<WindowManager.LayoutParams>
private val onTouch = { _: View, _: MotionEvent, _: Boolean -> true }
@@ -133,8 +131,7 @@
keyguardUpdateMonitor, dialogManager, dumpManager, transitionController,
configurationController, systemClock, keyguardStateController,
unlockedScreenOffAnimationController, HAL_CONTROLS_ILLUMINATION, hbmProvider,
- REQUEST_ID, reason, controllerCallback, onTouch, activityLaunchAnimator,
- broadcastSender)
+ REQUEST_ID, reason, controllerCallback, onTouch, activityLaunchAnimator)
block()
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index e7e8e73..946c52e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -66,7 +66,6 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ActivityLaunchAnimator;
-import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.plugins.FalsingManager;
@@ -188,8 +187,6 @@
private ActivityLaunchAnimator mActivityLaunchAnimator;
@Mock
private AlternateUdfpsTouchProvider mAlternateTouchProvider;
- @Mock
- private BroadcastSender mBroadcastSender;
// Capture listeners so that they can be used to send events
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
@@ -270,7 +267,6 @@
mLatencyTracker,
mActivityLaunchAnimator,
Optional.of(mAlternateTouchProvider),
- mBroadcastSender,
mBiometricsExecutor);
verify(mFingerprintManager).setUdfpsOverlayController(mOverlayCaptor.capture());
mOverlayController = mOverlayCaptor.getValue();
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 39d5a16..4e1a708 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
@@ -22,6 +22,8 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.clearInvocations;
@@ -29,7 +31,9 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.LayoutInflater;
@@ -55,6 +59,9 @@
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.util.concurrency.FakeExecutor;
+import com.android.systemui.util.settings.SecureSettings;
+import com.android.systemui.util.time.FakeSystemClock;
import org.junit.Before;
import org.junit.Test;
@@ -108,10 +115,12 @@
private StatusBarUserSwitcherController mStatusBarUserSwitcherController;
@Mock
private StatusBarUserInfoTracker mStatusBarUserInfoTracker;
+ @Mock private SecureSettings mSecureSettings;
private TestNotificationPanelViewStateProvider mNotificationPanelViewStateProvider;
private KeyguardStatusBarView mKeyguardStatusBarView;
private KeyguardStatusBarViewController mController;
+ private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
@Before
public void setup() throws Exception {
@@ -150,7 +159,9 @@
mUserManager,
mStatusBarUserSwitcherFeatureController,
mStatusBarUserSwitcherController,
- mStatusBarUserInfoTracker
+ mStatusBarUserInfoTracker,
+ mSecureSettings,
+ mFakeExecutor
);
}
@@ -420,6 +431,39 @@
assertThat(mKeyguardStatusBarView.isKeyguardUserAvatarEnabled()).isTrue();
}
+ @Test
+ public void testBlockedIcons_obeysSettingForVibrateIcon_settingOff() {
+ String str = mContext.getString(com.android.internal.R.string.status_bar_volume);
+
+ // GIVEN the setting is off
+ when(mSecureSettings.getInt(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0))
+ .thenReturn(0);
+
+ // WHEN CollapsedStatusBarFragment builds the blocklist
+ mController.updateBlockedIcons();
+
+ // THEN status_bar_volume SHOULD be present in the list
+ boolean contains = mController.getBlockedIcons().contains(str);
+ assertTrue(contains);
+ }
+
+ @Test
+ public void testBlockedIcons_obeysSettingForVibrateIcon_settingOn() {
+ String str = mContext.getString(com.android.internal.R.string.status_bar_volume);
+
+ // GIVEN the setting is ON
+ when(mSecureSettings.getIntForUser(Settings.Secure.STATUS_BAR_SHOW_VIBRATE_ICON, 0,
+ UserHandle.USER_CURRENT))
+ .thenReturn(1);
+
+ // WHEN CollapsedStatusBarFragment builds the blocklist
+ mController.updateBlockedIcons();
+
+ // THEN status_bar_volume SHOULD NOT be present in the list
+ boolean contains = mController.getBlockedIcons().contains(str);
+ assertFalse(contains);
+ }
+
private void updateStateToNotKeyguard() {
updateStatusBarState(SHADE);
}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index e62f35d..e90a5db 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -2548,28 +2548,31 @@
public void sendPendingBroadcasts() {
String[] packages;
ArrayList<String>[] components;
- int size = 0;
+ int numBroadcasts = 0, numUsers;
int[] uids;
synchronized (mPm.mLock) {
final SparseArray<ArrayMap<String, ArrayList<String>>> userIdToPackagesToComponents =
mPm.mPendingBroadcasts.copiedMap();
- size = userIdToPackagesToComponents.size();
- if (size <= 0) {
+ numUsers = userIdToPackagesToComponents.size();
+ for (int n = 0; n < numUsers; n++) {
+ numBroadcasts += userIdToPackagesToComponents.valueAt(n).size();
+ }
+ if (numBroadcasts == 0) {
// Nothing to be done. Just return
return;
}
- packages = new String[size];
- components = new ArrayList[size];
- uids = new int[size];
+ packages = new String[numBroadcasts];
+ components = new ArrayList[numBroadcasts];
+ uids = new int[numBroadcasts];
int i = 0; // filling out the above arrays
- for (int n = 0; n < size; n++) {
+ for (int n = 0; n < numUsers; n++) {
final int packageUserId = userIdToPackagesToComponents.keyAt(n);
final ArrayMap<String, ArrayList<String>> componentsToBroadcast =
userIdToPackagesToComponents.valueAt(n);
final int numComponents = CollectionUtils.size(componentsToBroadcast);
- for (int index = 0; i < size && index < numComponents; index++) {
+ for (int index = 0; index < numComponents; index++) {
packages[i] = componentsToBroadcast.keyAt(index);
components[i] = componentsToBroadcast.valueAt(index);
final PackageSetting ps = mPm.mSettings.getPackageLPr(packages[i]);
@@ -2579,12 +2582,12 @@
i++;
}
}
- size = i;
+ numBroadcasts = i;
mPm.mPendingBroadcasts.clear();
}
final Computer snapshot = mPm.snapshotComputer();
// Send broadcasts
- for (int i = 0; i < size; i++) {
+ for (int i = 0; i < numBroadcasts; i++) {
mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */,
components[i], uids[i], null /* reason */);
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index dd1b50f..ca91a74 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -451,6 +451,14 @@
if (!toTop) {
if (t.mTaskId == mLastLeafTaskToFrontId) {
mLastLeafTaskToFrontId = INVALID_TASK_ID;
+
+ // If the previous front-most task is moved to the back, then notify of the new
+ // front-most task.
+ final ActivityRecord topMost = getTopMostActivity();
+ if (topMost != null) {
+ mAtmService.getTaskChangeNotificationController().notifyTaskMovedToFront(
+ topMost.getTask().getTaskInfo());
+ }
}
return;
}