diff options
603 files changed, 10891 insertions, 3763 deletions
diff --git a/StubLibraries.bp b/StubLibraries.bp index 91efb05b50f4..50524998d416 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -48,7 +48,6 @@ stubs_defaults { ":opt-telephony-srcs", ":opt-net-voip-srcs", ":art-module-public-api-stubs-source", - ":conscrypt.module.public.api.stubs.source", ":android_icu4j_public_api_files", ], // TODO(b/147699819): remove below aidl includes. @@ -69,7 +68,10 @@ stubs_defaults { stubs_defaults { name: "metalava-full-api-stubs-default", defaults: ["metalava-base-api-stubs-default"], - srcs: [":framework-updatable-sources"], + srcs: [ + ":conscrypt.module.public.api.stubs.source", + ":framework-updatable-sources", + ], sdk_version: "core_platform", } diff --git a/apex/extservices/Android.bp b/apex/extservices/Android.bp index 68350afdac85..0c6c4c23dce1 100644 --- a/apex/extservices/Android.bp +++ b/apex/extservices/Android.bp @@ -21,7 +21,7 @@ apex { apex_defaults { name: "com.android.extservices-defaults", updatable: true, - min_sdk_version: "R", + min_sdk_version: "current", key: "com.android.extservices.key", certificate: ":com.android.extservices.certificate", apps: ["ExtServices"], diff --git a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java index 6d9e3eddf616..887d82c6413f 100644 --- a/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java +++ b/apex/jobscheduler/framework/java/com/android/server/usage/AppStandbyInternal.java @@ -45,6 +45,14 @@ public interface AppStandbyInternal { boolean idle, int bucket, int reason); /** + * Callback to inform listeners that the parole state has changed. This means apps are + * allowed to do work even if they're idle or in a low bucket. + */ + public void onParoleStateChanged(boolean isParoleOn) { + // No-op by default + } + + /** * Optional callback to inform the listener that the app has transitioned into * an active state due to user interaction. */ @@ -92,6 +100,11 @@ public interface AppStandbyInternal { boolean isAppIdleFiltered(String packageName, int appId, int userId, long elapsedRealtime); + /** + * @return true if currently app idle parole mode is on. + */ + boolean isInParole(); + int[] getIdleUidsForUser(int userId); void setAppIdleAsync(String packageName, boolean idle, int userId); diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 24728dd8edca..980372d58f33 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -214,8 +214,7 @@ public class AppStandbyController implements AppStandbyInternal { private AppIdleHistory mAppIdleHistory; @GuardedBy("mPackageAccessListeners") - private ArrayList<AppIdleStateChangeListener> - mPackageAccessListeners = new ArrayList<>(); + private final ArrayList<AppIdleStateChangeListener> mPackageAccessListeners = new ArrayList<>(); /** Whether we've queried the list of carrier privileged apps. */ @GuardedBy("mAppIdleLock") @@ -235,6 +234,7 @@ public class AppStandbyController implements AppStandbyInternal { static final int MSG_FORCE_IDLE_STATE = 4; static final int MSG_CHECK_IDLE_STATES = 5; static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8; + static final int MSG_PAROLE_STATE_CHANGED = 9; static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10; /** Check the state of one app: arg1 = userId, arg2 = uid, obj = (String) packageName */ static final int MSG_CHECK_PACKAGE_IDLE_STATE = 11; @@ -293,6 +293,13 @@ public class AppStandbyController implements AppStandbyInternal { * {@link #setAppStandbyBucket(String, int, int, int, int)} will not be propagated. */ boolean mLinkCrossProfileApps; + /** + * Whether we should allow apps into the + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} bucket or not. + * If false, any attempts to put an app into the bucket will put the app into the + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RARE} bucket instead. + */ + private boolean mAllowRestrictedBucket; private volatile boolean mAppIdleEnabled; private boolean mIsCharging; @@ -390,7 +397,16 @@ public class AppStandbyController implements AppStandbyInternal { @VisibleForTesting void setAppIdleEnabled(boolean enabled) { - mAppIdleEnabled = enabled; + synchronized (mAppIdleLock) { + if (mAppIdleEnabled != enabled) { + final boolean oldParoleState = isInParole(); + mAppIdleEnabled = enabled; + if (isInParole() != oldParoleState) { + postParoleStateChanged(); + } + } + } + } @Override @@ -563,11 +579,23 @@ public class AppStandbyController implements AppStandbyInternal { if (mIsCharging != isCharging) { if (DEBUG) Slog.d(TAG, "Setting mIsCharging to " + isCharging); mIsCharging = isCharging; + postParoleStateChanged(); } } } @Override + public boolean isInParole() { + return !mAppIdleEnabled || mIsCharging; + } + + private void postParoleStateChanged() { + if (DEBUG) Slog.d(TAG, "Posting MSG_PAROLE_STATE_CHANGED"); + mHandler.removeMessages(MSG_PAROLE_STATE_CHANGED); + mHandler.sendEmptyMessage(MSG_PAROLE_STATE_CHANGED); + } + + @Override public void postCheckIdleStates(int userId) { mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0)); } @@ -667,6 +695,10 @@ public class AppStandbyController implements AppStandbyInternal { return; } final int oldBucket = app.currentBucket; + if (oldBucket == STANDBY_BUCKET_NEVER) { + // None of this should bring an app out of the NEVER bucket. + return; + } int newBucket = Math.max(oldBucket, STANDBY_BUCKET_ACTIVE); // Undo EXEMPTED boolean predictionLate = predictionTimedOut(app, elapsedRealtime); // Compute age-based bucket @@ -722,11 +754,18 @@ public class AppStandbyController implements AppStandbyInternal { Slog.d(TAG, "Bringing down to RESTRICTED due to timeout"); } } + if (newBucket == STANDBY_BUCKET_RESTRICTED && !mAllowRestrictedBucket) { + newBucket = STANDBY_BUCKET_RARE; + // Leave the reason alone. + if (DEBUG) { + Slog.d(TAG, "Bringing up from RESTRICTED to RARE due to off switch"); + } + } if (DEBUG) { Slog.d(TAG, " Old bucket=" + oldBucket + ", newBucket=" + newBucket); } - if (oldBucket < newBucket || predictionLate) { + if (oldBucket != newBucket || predictionLate) { mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket, reason); maybeInformListeners(packageName, userId, elapsedRealtime, @@ -1176,8 +1215,8 @@ public class AppStandbyController implements AppStandbyInternal { final int reason = REASON_MAIN_FORCED_BY_SYSTEM | (REASON_SUB_MASK & restrictReason); final long nowElapsed = mInjector.elapsedRealtime(); - setAppStandbyBucket(packageName, userId, STANDBY_BUCKET_RESTRICTED, reason, - nowElapsed, false); + final int bucket = mAllowRestrictedBucket ? STANDBY_BUCKET_RESTRICTED : STANDBY_BUCKET_RARE; + setAppStandbyBucket(packageName, userId, bucket, reason, nowElapsed, false); } @Override @@ -1247,6 +1286,9 @@ public class AppStandbyController implements AppStandbyInternal { Slog.e(TAG, "Tried to set bucket of uninstalled app: " + packageName); return; } + if (newBucket == STANDBY_BUCKET_RESTRICTED && !mAllowRestrictedBucket) { + newBucket = STANDBY_BUCKET_RARE; + } AppIdleHistory.AppUsageHistory app = mAppIdleHistory.getAppUsageHistory(packageName, userId, elapsedRealtime); boolean predicted = (reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED; @@ -1365,6 +1407,7 @@ public class AppStandbyController implements AppStandbyInternal { Slog.d(TAG, " Keeping at WORKING_SET due to min timeout"); } } else if (newBucket == STANDBY_BUCKET_RARE + && mAllowRestrictedBucket && getBucketForLocked(packageName, userId, elapsedRealtime) == STANDBY_BUCKET_RESTRICTED) { // Prediction doesn't think the app will be used anytime soon and @@ -1502,6 +1545,15 @@ public class AppStandbyController implements AppStandbyInternal { } } + private void informParoleStateChanged() { + final boolean paroled = isInParole(); + synchronized (mPackageAccessListeners) { + for (AppIdleStateChangeListener listener : mPackageAccessListeners) { + listener.onParoleStateChanged(paroled); + } + } + } + @Override public void flushToDisk(int userId) { synchronized (mAppIdleLock) { @@ -1697,6 +1749,8 @@ public class AppStandbyController implements AppStandbyInternal { pw.println(); pw.print("mAppIdleEnabled="); pw.print(mAppIdleEnabled); + pw.print(" mAllowRestrictedBucket="); + pw.print(mAllowRestrictedBucket); pw.print(" mIsCharging="); pw.print(mIsCharging); pw.println(); @@ -1798,6 +1852,12 @@ public class AppStandbyController implements AppStandbyInternal { return mPowerWhitelistManager.isWhitelisted(packageName, false); } + boolean isRestrictedBucketEnabled() { + return Global.getInt(mContext.getContentResolver(), + Global.ENABLE_RESTRICTED_BUCKET, + Global.DEFAULT_ENABLE_RESTRICTED_BUCKET) == 1; + } + File getDataSystemDirectory() { return Environment.getDataSystemDirectory(); } @@ -1920,6 +1980,11 @@ public class AppStandbyController implements AppStandbyInternal { args.recycle(); break; + case MSG_PAROLE_STATE_CHANGED: + if (DEBUG) Slog.d(TAG, "Parole state: " + isInParole()); + informParoleStateChanged(); + break; + case MSG_CHECK_PACKAGE_IDLE_STATE: checkAndUpdateStandbyState((String) msg.obj, msg.arg1, msg.arg2, mInjector.elapsedRealtime()); @@ -2031,6 +2096,8 @@ public class AppStandbyController implements AppStandbyInternal { final ContentResolver cr = mContext.getContentResolver(); cr.registerContentObserver(Global.getUriFor(Global.APP_IDLE_CONSTANTS), false, this); cr.registerContentObserver(Global.getUriFor(Global.APP_STANDBY_ENABLED), false, this); + cr.registerContentObserver(Global.getUriFor(Global.ENABLE_RESTRICTED_BUCKET), + false, this); cr.registerContentObserver(Global.getUriFor(Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED), false, this); } @@ -2129,6 +2196,8 @@ public class AppStandbyController implements AppStandbyInternal { mLinkCrossProfileApps = mParser.getBoolean( KEY_CROSS_PROFILE_APPS_SHARE_STANDBY_BUCKETS, DEFAULT_CROSS_PROFILE_APPS_SHARE_STANDBY_BUCKETS); + + mAllowRestrictedBucket = mInjector.isRestrictedBucketEnabled(); } // Check if app_idle_enabled has changed. Do this after getting the rest of the settings diff --git a/apex/statsd/framework/java/android/app/StatsManager.java b/apex/statsd/framework/java/android/app/StatsManager.java index 7fbfc4318949..d1b7d8dc2c7a 100644 --- a/apex/statsd/framework/java/android/app/StatsManager.java +++ b/apex/statsd/framework/java/android/app/StatsManager.java @@ -28,7 +28,6 @@ import android.os.Binder; import android.os.IPullAtomCallback; import android.os.IPullAtomResultReceiver; import android.os.IStatsManagerService; -import android.os.IStatsd; import android.os.RemoteException; import android.os.StatsFrameworkInitializer; import android.util.AndroidException; @@ -57,9 +56,6 @@ public final class StatsManager { private final Context mContext; @GuardedBy("sLock") - private IStatsd mService; - - @GuardedBy("sLock") private IStatsManagerService mStatsManagerService; /** diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 93e6c108a289..5cf5e0b1d182 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -54,11 +54,11 @@ import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; /** * Helper service for statsd (the native stats management service in cmds/statsd/). @@ -112,17 +112,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private final HashMap<Long, String> mDeletedFiles = new HashMap<>(); private final CompanionHandler mHandler; - // Flag that is set when PHASE_BOOT_COMPLETED is triggered in the StatsCompanion lifecycle. This - // and the flag mSentBootComplete below is used for synchronization to ensure that the boot - // complete signal is only ever sent once to statsd. Two signals are needed because - // #sayHiToStatsd can be called from both statsd and #onBootPhase - // PHASE_THIRD_PARTY_APPS_CAN_START. - @GuardedBy("sStatsdLock") - private boolean mBootCompleted = false; - // Flag that is set when IStatsd#bootCompleted is called. This flag ensures that boot complete - // signal is only ever sent once. - @GuardedBy("sStatsdLock") - private boolean mSentBootComplete = false; + // Flag that is set when PHASE_BOOT_COMPLETED is triggered in the StatsCompanion lifecycle. + private AtomicBoolean mBootCompleted = new AtomicBoolean(false); public StatsCompanionService(Context context) { super(); @@ -607,27 +598,35 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // Statsd related code /** - * Fetches the statsd IBinder service. This is a blocking call. + * Fetches the statsd IBinder service. This is a blocking call that always refetches statsd + * instead of returning the cached sStatsd. * Note: This should only be called from {@link #sayHiToStatsd()}. All other clients should use * the cached sStatsd via {@link #getStatsdNonblocking()}. */ - private IStatsd fetchStatsdService(StatsdDeathRecipient deathRecipient) { - synchronized (sStatsdLock) { - if (sStatsd == null) { - sStatsd = IStatsd.Stub.asInterface(StatsFrameworkInitializer - .getStatsServiceManager() - .getStatsdServiceRegisterer() - .get()); - if (sStatsd != null) { - try { - sStatsd.asBinder().linkToDeath(deathRecipient, /* flags */ 0); - } catch (RemoteException e) { - Log.e(TAG, "linkToDeath(StatsdDeathRecipient) failed"); - statsdNotReadyLocked(); - } + private IStatsd fetchStatsdServiceLocked() { + sStatsd = IStatsd.Stub.asInterface(StatsFrameworkInitializer + .getStatsServiceManager() + .getStatsdServiceRegisterer() + .get()); + return sStatsd; + } + + private void registerStatsdDeathRecipient(IStatsd statsd, List<BroadcastReceiver> receivers) { + StatsdDeathRecipient deathRecipient = new StatsdDeathRecipient(statsd, receivers); + + try { + statsd.asBinder().linkToDeath(deathRecipient, /*flags=*/0); + } catch (RemoteException e) { + Log.e(TAG, "linkToDeath (StatsdDeathRecipient) failed"); + // Statsd has already died. Unregister receivers ourselves. + for (BroadcastReceiver receiver : receivers) { + mContext.unregisterReceiver(receiver); + } + synchronized (sStatsdLock) { + if (statsd == sStatsd) { + statsdNotReadyLocked(); } } - return sStatsd; } } @@ -648,22 +647,23 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { * statsd. */ private void sayHiToStatsd() { - if (getStatsdNonblocking() != null) { - Log.e(TAG, "Trying to fetch statsd, but it was already fetched", - new IllegalStateException( - "sStatsd is not null when being fetched")); - return; + IStatsd statsd; + synchronized (sStatsdLock) { + if (sStatsd != null && sStatsd.asBinder().isBinderAlive()) { + Log.e(TAG, "statsd has already been fetched before", + new IllegalStateException("IStatsd object should be null or dead")); + return; + } + statsd = fetchStatsdServiceLocked(); } - StatsdDeathRecipient deathRecipient = new StatsdDeathRecipient(); - IStatsd statsd = fetchStatsdService(deathRecipient); + if (statsd == null) { - Log.i(TAG, - "Could not yet find statsd to tell it that StatsCompanion is " - + "alive."); + Log.i(TAG, "Could not yet find statsd to tell it that StatsCompanion is alive."); return; } - mStatsManagerService.statsdReady(statsd); + if (DEBUG) Log.d(TAG, "Saying hi to statsd"); + mStatsManagerService.statsdReady(statsd); try { statsd.statsCompanionReady(); @@ -682,8 +682,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { mContext.registerReceiverForAllUsers(appUpdateReceiver, filter, null, null); // Setup receiver for user initialize (which happens once for a new user) - // and - // if a user is removed. + // and if a user is removed. filter = new IntentFilter(Intent.ACTION_USER_INITIALIZE); filter.addAction(Intent.ACTION_USER_REMOVED); mContext.registerReceiverForAllUsers(userUpdateReceiver, filter, null, null); @@ -691,27 +690,20 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // Setup receiver for device reboots or shutdowns. filter = new IntentFilter(Intent.ACTION_REBOOT); filter.addAction(Intent.ACTION_SHUTDOWN); - mContext.registerReceiverForAllUsers( - shutdownEventReceiver, filter, null, null); + mContext.registerReceiverForAllUsers(shutdownEventReceiver, filter, null, null); - // Only add the receivers if the registration is successful. - deathRecipient.addRegisteredBroadcastReceivers( - List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver)); + // Register death recipient. + List<BroadcastReceiver> broadcastReceivers = + List.of(appUpdateReceiver, userUpdateReceiver, shutdownEventReceiver); + registerStatsdDeathRecipient(statsd, broadcastReceivers); - // Used so we can call statsd.bootComplete() outside of the lock. - boolean shouldSendBootComplete = false; - synchronized (sStatsdLock) { - if (mBootCompleted && !mSentBootComplete) { - mSentBootComplete = true; - shouldSendBootComplete = true; - } - } - if (shouldSendBootComplete) { + // Tell statsd that boot has completed. The signal may have already been sent, but since + // the signal-receiving function is idempotent, that's ok. + if (mBootCompleted.get()) { statsd.bootCompleted(); } - // Pull the latest state of UID->app name, version mapping when - // statsd starts. + // Pull the latest state of UID->app name, version mapping when statsd starts. informAllUids(mContext); Log.i(TAG, "Told statsd that StatsCompanionService is alive."); @@ -722,18 +714,16 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private class StatsdDeathRecipient implements IBinder.DeathRecipient { - private List<BroadcastReceiver> mReceiversToUnregister; - - StatsdDeathRecipient() { - mReceiversToUnregister = new ArrayList<>(); - } + private final IStatsd mStatsd; + private final List<BroadcastReceiver> mReceiversToUnregister; - public void addRegisteredBroadcastReceivers(List<BroadcastReceiver> receivers) { - synchronized (sStatsdLock) { - mReceiversToUnregister.addAll(receivers); - } + StatsdDeathRecipient(IStatsd statsd, List<BroadcastReceiver> receivers) { + mStatsd = statsd; + mReceiversToUnregister = receivers; } + // It is possible for binderDied to be called after a restarted statsd calls statsdReady, + // but that's alright because the code does not assume an ordering of the two calls. @Override public void binderDied() { Log.i(TAG, "Statsd is dead - erase all my knowledge, except pullers"); @@ -762,13 +752,19 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } } - // We only unregister in binder death becaseu receivers can only be unregistered - // once, or an IllegalArgumentException is thrown. + + // Unregister receivers on death because receivers can only be unregistered once. + // Otherwise, an IllegalArgumentException is thrown. for (BroadcastReceiver receiver: mReceiversToUnregister) { mContext.unregisterReceiver(receiver); } - statsdNotReadyLocked(); - mSentBootComplete = false; + + // It's possible for statsd to have restarted and called statsdReady, causing a new + // sStatsd binder object to be fetched, before the binderDied callback runs. Only + // call #statsdNotReadyLocked if that hasn't happened yet. + if (mStatsd == sStatsd) { + statsdNotReadyLocked(); + } } } } @@ -779,19 +775,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } void bootCompleted() { + mBootCompleted.set(true); IStatsd statsd = getStatsdNonblocking(); - synchronized (sStatsdLock) { - mBootCompleted = true; - if (mSentBootComplete) { - // do not send a boot complete a second time. - return; - } - if (statsd == null) { - // Statsd is not yet ready. - // Delay the boot completed ping to {@link #sayHiToStatsd()} - return; - } - mSentBootComplete = true; + if (statsd == null) { + // Statsd is not yet ready. + // Delay the boot completed ping to {@link #sayHiToStatsd()} + return; } try { statsd.bootCompleted(); @@ -808,8 +797,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } synchronized (sStatsdLock) { - writer.println( - "Number of configuration files deleted: " + mDeletedFiles.size()); + writer.println("Number of configuration files deleted: " + mDeletedFiles.size()); if (mDeletedFiles.size() > 0) { writer.println(" timestamp, deleted file name"); } @@ -817,8 +805,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { SystemClock.currentThreadTimeMillis() - SystemClock.elapsedRealtime(); for (Long elapsedMillis : mDeletedFiles.keySet()) { long deletionMillis = lastBootMillis + elapsedMillis; - writer.println( - " " + deletionMillis + ", " + mDeletedFiles.get(elapsedMillis)); + writer.println(" " + deletionMillis + ", " + mDeletedFiles.get(elapsedMillis)); } } } diff --git a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java index 90764b0bd426..97846f2397a5 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java @@ -172,6 +172,10 @@ public class StatsManagerService extends IStatsManagerService.Stub { public void registerPullAtomCallback(int atomTag, long coolDownMillis, long timeoutMillis, int[] additiveFields, IPullAtomCallback pullerCallback) { enforceRegisterStatsPullAtomPermission(); + if (pullerCallback == null) { + Log.w(TAG, "Puller callback is null for atom " + atomTag); + return; + } int callingUid = Binder.getCallingUid(); PullerKey key = new PullerKey(callingUid, atomTag); PullerValue val = diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index bd9f7a59fcbd..a65f5f792daa 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -343,9 +343,11 @@ status_t StatsService::handleShellCommand(int in, int out, int err, const char** if (!utf8Args[0].compare(String8("print-logs"))) { return cmd_print_logs(out, utf8Args); } + if (!utf8Args[0].compare(String8("send-active-configs"))) { return cmd_trigger_active_config_broadcast(out, utf8Args); } + if (!utf8Args[0].compare(String8("data-subscribe"))) { { std::lock_guard<std::mutex> lock(mShellSubscriberMutex); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 650545f939cc..03061bb7c5da 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -428,6 +428,7 @@ message Atom { 266 [(module) = "framework"]; AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "settings"]; DocsUIDragAndDropReported docs_ui_drag_and_drop_reported = 268 [(module) = "docsui"]; + AppUsageEventOccurred app_usage_event_occurred = 269 [(module) = "framework"]; SdkExtensionStatus sdk_extension_status = 354; // StatsdStats tracks platform atoms with ids upto 500. @@ -3021,14 +3022,14 @@ message LauncherUIChanged { optional string component_name = 11; // (x, y) coordinate and the index information of the target on the container - optional int32 grid_x = 12; - optional int32 grid_y = 13; - optional int32 page_id = 14; + optional int32 grid_x = 12 [default = -1]; + optional int32 grid_y = 13 [default = -1]; + optional int32 page_id = 14 [default = -2]; // e.g., folder icon's (x, y) location and index information on the workspace - optional int32 grid_x_parent = 15; - optional int32 grid_y_parent = 16; - optional int32 page_id_parent = 17; + optional int32 grid_x_parent = 15 [default = -1]; + optional int32 grid_y_parent = 16 [default = -1]; + optional int32 page_id_parent = 17 [default = -2]; // e.g., SEARCHBOX_ALLAPPS, FOLDER_WORKSPACE optional int32 hierarchy = 18; @@ -3036,7 +3037,7 @@ message LauncherUIChanged { optional bool is_work_profile = 19; // Used to store the predicted rank of the target - optional int32 rank = 20; + optional int32 rank = 20 [default = -1]; // e.g., folderLabelState can be captured in the following two fields optional int32 from_state = 21; @@ -3044,6 +3045,9 @@ message LauncherUIChanged { // e.g., autofilled or suggested texts that are not user entered optional string edittext = 23; + + // e.g., number of contents inside a container (e.g., icons inside a folder) + optional int32 cardinality = 24; } /** @@ -3064,22 +3068,34 @@ message LauncherStaticLayout { optional string component_name = 6; // (x, y) coordinate and the index information of the target on the container - optional int32 grid_x = 7; - optional int32 grid_y = 8; - optional int32 page_id = 9; + optional int32 grid_x = 7 [default = -1]; + optional int32 grid_y = 8 [default = -1]; + optional int32 page_id = 9 [default = -2]; // e.g., folder icon's (x, y) location and index information on the workspace - optional int32 grid_x_parent = 10; - optional int32 grid_y_parent = 11; - optional int32 page_id_parent = 12; - - // e.g., WORKSPACE, HOTSEAT, FOLDER_WORKSPACE, FOLDER_HOTSEAT + // e.g., when used with widgets target, use these values for (span_x, span_y) + optional int32 grid_x_parent = 10 [default = -1]; + optional int32 grid_y_parent = 11 [default = -1]; + optional int32 page_id_parent = 12 [default = -2]; + + // UNKNOWN = 0 + // HOTSEAT = 1 + // WORKSPACE = 2 + // FOLDER_HOTSEAT = 3 + // FOLDER_WORKSPACE = 4 optional int32 hierarchy = 13; optional bool is_work_profile = 14; // e.g., PIN, WIDGET TRAY, APPS TRAY, PREDICTION optional int32 origin = 15; + + // e.g., number of icons inside a folder + optional int32 cardinality = 16; + + // e.g., (x, y) span of the widget inside homescreen grid system + optional int32 span_x = 17 [default = 1]; + optional int32 span_y = 18 [default = 1]; } /** @@ -9513,3 +9529,19 @@ message AccessibilityServiceReported { // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto. optional android.stats.accessibility.ServiceStatus service_status = 2; } + +/** + * Logs app usage events. + */ +message AppUsageEventOccurred { + optional int32 uid = 1 [(is_uid) = true]; + optional string package_name = 2; + optional string class_name = 3; + + enum EventType { + NONE = 0; + MOVE_TO_FOREGROUND = 1; + MOVE_TO_BACKGROUND = 2; + } + optional EventType event_type = 4; +} diff --git a/cmds/statsd/src/external/StatsCallbackPuller.cpp b/cmds/statsd/src/external/StatsCallbackPuller.cpp index 3618bb0dd08b..78e6f094db7e 100644 --- a/cmds/statsd/src/external/StatsCallbackPuller.cpp +++ b/cmds/statsd/src/external/StatsCallbackPuller.cpp @@ -86,6 +86,7 @@ bool StatsCallbackPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { // in unit tests. In process calls are not oneway. Status status = mCallback->onPullAtom(mTagId, resultReceiver); if (!status.isOk()) { + StatsdStats::getInstance().notePullBinderCallFailed(mTagId); return false; } diff --git a/cmds/statsd/src/external/StatsPuller.cpp b/cmds/statsd/src/external/StatsPuller.cpp index 5192ddf301e1..829a60345ba7 100644 --- a/cmds/statsd/src/external/StatsPuller.cpp +++ b/cmds/statsd/src/external/StatsPuller.cpp @@ -82,6 +82,11 @@ bool StatsPuller::Pull(std::vector<std::shared_ptr<LogEvent>>* data) { mapAndMergeIsolatedUidsToHostUid(mCachedData, mUidMap, mTagId, mAdditiveFields); } + if (mCachedData.empty()) { + VLOG("Data pulled is empty"); + StatsdStats::getInstance().noteEmptyData(mTagId); + } + (*data) = mCachedData; return mHasGoodData; } diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index cfd5d14b0d3b..1a52eb928777 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -111,12 +111,14 @@ bool StatsPullerManager::PullLocked(int tagId, const ConfigKey& configKey, if (uidProviderIt == mPullUidProviders.end()) { ALOGE("Error pulling tag %d. No pull uid provider for config key %s", tagId, configKey.ToString().c_str()); + StatsdStats::getInstance().notePullUidProviderNotFound(tagId); return false; } sp<PullUidProvider> pullUidProvider = uidProviderIt->second.promote(); if (pullUidProvider == nullptr) { ALOGE("Error pulling tag %d, pull uid provider for config %s is gone.", tagId, configKey.ToString().c_str()); + StatsdStats::getInstance().notePullUidProviderNotFound(tagId); return false; } uids = pullUidProvider->getPullAtomUids(tagId); @@ -140,6 +142,7 @@ bool StatsPullerManager::PullLocked(int tagId, const vector<int32_t>& uids, return ret; } } + StatsdStats::getInstance().notePullerNotFound(tagId); ALOGW("StatsPullerManager: Unknown tagId %d", tagId); return false; // Return early since we don't know what to pull. } else { @@ -288,10 +291,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) { for (const auto& pullInfo : needToPull) { vector<shared_ptr<LogEvent>> data; bool pullSuccess = PullLocked(pullInfo.first->atomTag, pullInfo.first->configKey, &data); - if (pullSuccess) { - StatsdStats::getInstance().notePullDelay(pullInfo.first->atomTag, - getElapsedRealtimeNs() - elapsedTimeNs); - } else { + if (!pullSuccess) { VLOG("pull failed at %lld, will try again later", (long long)elapsedTimeNs); } @@ -354,6 +354,11 @@ void StatsPullerManager::RegisterPullAtomCallback(const int uid, const int32_t a std::lock_guard<std::mutex> _l(mLock); VLOG("RegisterPullerCallback: adding puller for tag %d", atomTag); + if (callback == nullptr) { + ALOGW("SetPullAtomCallback called with null callback for atom %d.", atomTag); + return; + } + StatsdStats::getInstance().notePullerCallbackRegistrationChanged(atomTag, /*registered=*/true); int64_t actualCoolDownNs = coolDownNs < kMinCoolDownNs ? kMinCoolDownNs : coolDownNs; int64_t actualTimeoutNs = timeoutNs > kMaxTimeoutNs ? kMaxTimeoutNs : timeoutNs; diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp index 46f5dbda5521..c027fffd20a0 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.cpp +++ b/cmds/statsd/src/guardrail/StatsdStats.cpp @@ -472,14 +472,19 @@ void StatsdStats::notePullFailed(int atomId) { mPulledAtomStats[atomId].pullFailed++; } -void StatsdStats::noteStatsCompanionPullFailed(int atomId) { +void StatsdStats::notePullUidProviderNotFound(int atomId) { lock_guard<std::mutex> lock(mLock); - mPulledAtomStats[atomId].statsCompanionPullFailed++; + mPulledAtomStats[atomId].pullUidProviderNotFound++; } -void StatsdStats::noteStatsCompanionPullBinderTransactionFailed(int atomId) { +void StatsdStats::notePullerNotFound(int atomId) { lock_guard<std::mutex> lock(mLock); - mPulledAtomStats[atomId].statsCompanionPullBinderTransactionFailed++; + mPulledAtomStats[atomId].pullerNotFound++; +} + +void StatsdStats::notePullBinderCallFailed(int atomId) { + lock_guard<std::mutex> lock(mLock); + mPulledAtomStats[atomId].binderCallFailCount++; } void StatsdStats::noteEmptyData(int atomId) { @@ -608,6 +613,7 @@ void StatsdStats::resetInternalLocked() { for (auto& pullStats : mPulledAtomStats) { pullStats.second.totalPull = 0; pullStats.second.totalPullFromCache = 0; + pullStats.second.minPullIntervalSec = LONG_MAX; pullStats.second.avgPullTimeNs = 0; pullStats.second.maxPullTimeNs = 0; pullStats.second.numPullTime = 0; @@ -617,9 +623,13 @@ void StatsdStats::resetInternalLocked() { pullStats.second.dataError = 0; pullStats.second.pullTimeout = 0; pullStats.second.pullExceedMaxDelay = 0; + pullStats.second.pullFailed = 0; + pullStats.second.pullUidProviderNotFound = 0; + pullStats.second.pullerNotFound = 0; pullStats.second.registeredCount = 0; pullStats.second.unregisteredCount = 0; pullStats.second.atomErrorCount = 0; + pullStats.second.binderCallFailCount = 0; } mAtomMetricStats.clear(); mActivationBroadcastGuardrailStats.clear(); @@ -764,14 +774,16 @@ void StatsdStats::dumpStats(int out) const { " (average pull time nanos)%lld, (max pull time nanos)%lld, (average pull delay " "nanos)%lld, " " (max pull delay nanos)%lld, (data error)%ld\n" - " (pull timeout)%ld, (pull exceed max delay)%ld\n" - " (registered count) %ld, (unregistered count) %ld\n" + " (pull timeout)%ld, (pull exceed max delay)%ld" + " (no uid provider count)%ld, (no puller found count)%ld\n" + " (registered count) %ld, (unregistered count) %ld" " (atom error count) %d\n", (int)pair.first, (long)pair.second.totalPull, (long)pair.second.totalPullFromCache, (long)pair.second.pullFailed, (long)pair.second.minPullIntervalSec, (long long)pair.second.avgPullTimeNs, (long long)pair.second.maxPullTimeNs, (long long)pair.second.avgPullDelayNs, (long long)pair.second.maxPullDelayNs, pair.second.dataError, pair.second.pullTimeout, pair.second.pullExceedMaxDelay, + pair.second.pullUidProviderNotFound, pair.second.pullerNotFound, pair.second.registeredCount, pair.second.unregisteredCount, pair.second.atomErrorCount); } diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h index 805281ccd2d2..3d0eeb840064 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.h +++ b/cmds/statsd/src/guardrail/StatsdStats.h @@ -371,21 +371,30 @@ public: int32_t lastAtomTag, int32_t uid, int32_t pid); /** - * Records that the pull of an atom has failed + * Records that the pull of an atom has failed. Eg, if the client indicated the pull failed, if + * the pull timed out, or if the outgoing binder call failed. + * This count will only increment if the puller was actually invoked. + * + * It does not include a pull not occurring due to not finding the appropriate + * puller. These cases are covered in other counts. */ void notePullFailed(int atomId); /** - * Records that the pull of StatsCompanionService atom has failed + * Records that the pull of an atom has failed due to not having a uid provider. + */ + void notePullUidProviderNotFound(int atomId); + + /** + * Records that the pull of an atom has failed due not finding a puller registered by a + * trusted uid. */ - void noteStatsCompanionPullFailed(int atomId); + void notePullerNotFound(int atomId); /** - * Records that the pull of a StatsCompanionService atom has failed due to a failed binder - * transaction. This can happen when StatsCompanionService returns too - * much data (the max Binder parcel size is 1MB) + * Records that the pull has failed due to the outgoing binder call failing. */ - void noteStatsCompanionPullBinderTransactionFailed(int atomId); + void notePullBinderCallFailed(int atomId); /** * A pull with no data occurred @@ -503,12 +512,13 @@ public: long pullTimeout = 0; long pullExceedMaxDelay = 0; long pullFailed = 0; - long statsCompanionPullFailed = 0; - long statsCompanionPullBinderTransactionFailed = 0; + long pullUidProviderNotFound = 0; + long pullerNotFound = 0; long emptyData = 0; long registeredCount = 0; long unregisteredCount = 0; int32_t atomErrorCount = 0; + long binderCallFailCount = 0; } PulledAtomStats; typedef struct { diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index c4bd0549465a..cc4c56537c4c 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -326,13 +326,12 @@ void GaugeMetricProducer::pullAndMatchEventsLocked(const int64_t timestampNs) { return; } const int64_t pullDelayNs = getElapsedRealtimeNs() - timestampNs; + StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs); if (pullDelayNs > mMaxPullDelayNs) { ALOGE("Pull finish too late for atom %d", mPullTagId); StatsdStats::getInstance().notePullExceedMaxDelay(mPullTagId); - StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs); return; } - StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs); for (const auto& data : allData) { LogEvent localCopy = data->makeCopy(); localCopy.setElapsedTimestampNs(timestampNs); @@ -415,6 +414,13 @@ void GaugeMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEven if (!pullSuccess || allData.size() == 0) { return; } + const int64_t pullDelayNs = getElapsedRealtimeNs() - originalPullTimeNs; + StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs); + if (pullDelayNs > mMaxPullDelayNs) { + ALOGE("Pull finish too late for atom %d", mPullTagId); + StatsdStats::getInstance().notePullExceedMaxDelay(mPullTagId); + return; + } for (const auto& data : allData) { if (mEventMatcherWizard->matchLogEvent( *data, mWhatMatcherIndex) == MatchingState::kMatched) { diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index f34423a27aff..e5ec72e3d0f5 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -584,11 +584,6 @@ void ValueMetricProducer::accumulateEvents(const std::vector<std::shared_ptr<Log return; } - if (allData.size() == 0) { - VLOG("Data pulled is empty"); - StatsdStats::getInstance().noteEmptyData(mPullTagId); - } - mMatchedMetricDimensionKeys.clear(); for (const auto& data : allData) { LogEvent localCopy = data->makeCopy(); diff --git a/cmds/statsd/src/shell/ShellSubscriber.cpp b/cmds/statsd/src/shell/ShellSubscriber.cpp index bed836a1bd90..7b687210ce33 100644 --- a/cmds/statsd/src/shell/ShellSubscriber.cpp +++ b/cmds/statsd/src/shell/ShellSubscriber.cpp @@ -19,6 +19,7 @@ #include "ShellSubscriber.h" #include <android-base/file.h> + #include "matchers/matcher_util.h" #include "stats_log_util.h" @@ -32,42 +33,53 @@ const static int FIELD_ID_ATOM = 1; void ShellSubscriber::startNewSubscription(int in, int out, int timeoutSec) { int myToken = claimToken(); + VLOG("ShellSubscriber: new subscription %d has come in", myToken); mSubscriptionShouldEnd.notify_one(); shared_ptr<SubscriptionInfo> mySubscriptionInfo = make_shared<SubscriptionInfo>(in, out); - if (!readConfig(mySubscriptionInfo)) { - return; - } + if (!readConfig(mySubscriptionInfo)) return; + + { + std::unique_lock<std::mutex> lock(mMutex); + if (myToken != mToken) { + // Some other subscription has already come in. Stop. + return; + } + mSubscriptionInfo = mySubscriptionInfo; + + spawnHelperThreadsLocked(mySubscriptionInfo, myToken); + waitForSubscriptionToEndLocked(mySubscriptionInfo, myToken, lock, timeoutSec); + + if (mSubscriptionInfo == mySubscriptionInfo) { + mSubscriptionInfo = nullptr; + } - // critical-section - std::unique_lock<std::mutex> lock(mMutex); - if (myToken != mToken) { - // Some other subscription has already come in. Stop. - return; } - mSubscriptionInfo = mySubscriptionInfo; +} - if (mySubscriptionInfo->mPulledInfo.size() > 0 && mySubscriptionInfo->mPullIntervalMin > 0) { - // This thread terminates after it detects that mToken has changed. +void ShellSubscriber::spawnHelperThreadsLocked(shared_ptr<SubscriptionInfo> myInfo, int myToken) { + if (!myInfo->mPulledInfo.empty() && myInfo->mPullIntervalMin > 0) { std::thread puller([this, myToken] { startPull(myToken); }); puller.detach(); } - // Block until subscription has ended. + std::thread heartbeatSender([this, myToken] { sendHeartbeats(myToken); }); + heartbeatSender.detach(); +} + +void ShellSubscriber::waitForSubscriptionToEndLocked(shared_ptr<SubscriptionInfo> myInfo, + int myToken, + std::unique_lock<std::mutex>& lock, + int timeoutSec) { if (timeoutSec > 0) { - mSubscriptionShouldEnd.wait_for( - lock, timeoutSec * 1s, [this, myToken, &mySubscriptionInfo] { - return mToken != myToken || !mySubscriptionInfo->mClientAlive; - }); + mSubscriptionShouldEnd.wait_for(lock, timeoutSec * 1s, [this, myToken, &myInfo] { + return mToken != myToken || !myInfo->mClientAlive; + }); } else { - mSubscriptionShouldEnd.wait(lock, [this, myToken, &mySubscriptionInfo] { - return mToken != myToken || !mySubscriptionInfo->mClientAlive; + mSubscriptionShouldEnd.wait(lock, [this, myToken, &myInfo] { + return mToken != myToken || !myInfo->mClientAlive; }); } - - if (mSubscriptionInfo == mySubscriptionInfo) { - mSubscriptionInfo = nullptr; - } } // Atomically claim the next token. Token numbers denote subscriber ordering. @@ -129,51 +141,55 @@ bool ShellSubscriber::readConfig(shared_ptr<SubscriptionInfo> subscriptionInfo) return true; } -void ShellSubscriber::startPull(int64_t myToken) { +void ShellSubscriber::startPull(int myToken) { + VLOG("ShellSubscriber: pull thread %d starting", myToken); while (true) { - std::lock_guard<std::mutex> lock(mMutex); - if (!mSubscriptionInfo || mToken != myToken) { - VLOG("Pulling thread %lld done!", (long long)myToken); - return; - } + { + std::lock_guard<std::mutex> lock(mMutex); + if (!mSubscriptionInfo || mToken != myToken) { + VLOG("ShellSubscriber: pulling thread %d done!", myToken); + return; + } - int64_t nowMillis = getElapsedRealtimeMillis(); - for (auto& pullInfo : mSubscriptionInfo->mPulledInfo) { - if (pullInfo.mPrevPullElapsedRealtimeMs + pullInfo.mInterval < nowMillis) { - vector<std::shared_ptr<LogEvent>> data; - vector<int32_t> uids; - uids.insert(uids.end(), pullInfo.mPullUids.begin(), pullInfo.mPullUids.end()); - // This is slow. Consider storing the uids per app and listening to uidmap updates. - for (const string& pkg : pullInfo.mPullPackages) { - set<int32_t> uidsForPkg = mUidMap->getAppUid(pkg); - uids.insert(uids.end(), uidsForPkg.begin(), uidsForPkg.end()); + int64_t nowMillis = getElapsedRealtimeMillis(); + for (PullInfo& pullInfo : mSubscriptionInfo->mPulledInfo) { + if (pullInfo.mPrevPullElapsedRealtimeMs + pullInfo.mInterval >= nowMillis) { + continue; } - uids.push_back(DEFAULT_PULL_UID); + + vector<int32_t> uids; + getUidsForPullAtom(&uids, pullInfo); + + vector<std::shared_ptr<LogEvent>> data; mPullerMgr->Pull(pullInfo.mPullerMatcher.atom_id(), uids, &data); - VLOG("pulled %zu atoms with id %d", data.size(), pullInfo.mPullerMatcher.atom_id()); + VLOG("Pulled %zu atoms with id %d", data.size(), pullInfo.mPullerMatcher.atom_id()); + writePulledAtomsLocked(data, pullInfo.mPullerMatcher); - if (!writePulledAtomsLocked(data, pullInfo.mPullerMatcher)) { - mSubscriptionInfo->mClientAlive = false; - mSubscriptionShouldEnd.notify_one(); - return; - } pullInfo.mPrevPullElapsedRealtimeMs = nowMillis; } } - VLOG("Pulling thread %lld sleep....", (long long)myToken); + VLOG("ShellSubscriber: pulling thread %d sleeping for %d ms", myToken, + mSubscriptionInfo->mPullIntervalMin); std::this_thread::sleep_for(std::chrono::milliseconds(mSubscriptionInfo->mPullIntervalMin)); } } -// \return boolean indicating if writes were successful (will return false if -// client dies) -bool ShellSubscriber::writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data, +void ShellSubscriber::getUidsForPullAtom(vector<int32_t>* uids, const PullInfo& pullInfo) { + uids->insert(uids->end(), pullInfo.mPullUids.begin(), pullInfo.mPullUids.end()); + // This is slow. Consider storing the uids per app and listening to uidmap updates. + for (const string& pkg : pullInfo.mPullPackages) { + set<int32_t> uidsForPkg = mUidMap->getAppUid(pkg); + uids->insert(uids->end(), uidsForPkg.begin(), uidsForPkg.end()); + } + uids->push_back(DEFAULT_PULL_UID); +} + +void ShellSubscriber::writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data, const SimpleAtomMatcher& matcher) { mProto.clear(); int count = 0; for (const auto& event : data) { - VLOG("%s", event->ToString().c_str()); if (matchesSimple(*mUidMap, matcher, *event)) { count++; uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE | @@ -183,55 +199,67 @@ bool ShellSubscriber::writePulledAtomsLocked(const vector<std::shared_ptr<LogEve } } - if (count > 0) { - // First write the payload size. - size_t bufferSize = mProto.size(); - if (!android::base::WriteFully(mSubscriptionInfo->mOutputFd, &bufferSize, - sizeof(bufferSize))) { - return false; - } - - VLOG("%d atoms, proto size: %zu", count, bufferSize); - // Then write the payload. - if (!mProto.flush(mSubscriptionInfo->mOutputFd)) { - return false; - } - } - - return true; + if (count > 0) attemptWriteToSocketLocked(mProto.size()); } void ShellSubscriber::onLogEvent(const LogEvent& event) { std::lock_guard<std::mutex> lock(mMutex); - if (!mSubscriptionInfo) { - return; - } + if (!mSubscriptionInfo) return; mProto.clear(); for (const auto& matcher : mSubscriptionInfo->mPushedMatchers) { if (matchesSimple(*mUidMap, matcher, event)) { - VLOG("%s", event.ToString().c_str()); uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE | util::FIELD_COUNT_REPEATED | FIELD_ID_ATOM); event.ToProto(mProto); mProto.end(atomToken); + attemptWriteToSocketLocked(mProto.size()); + } + } +} - // First write the payload size. - size_t bufferSize = mProto.size(); - if (!android::base::WriteFully(mSubscriptionInfo->mOutputFd, &bufferSize, - sizeof(bufferSize))) { - mSubscriptionInfo->mClientAlive = false; - mSubscriptionShouldEnd.notify_one(); +// Tries to write the atom encoded in mProto to the socket. If the write fails +// because the read end of the pipe has closed, signals to other threads that +// the subscription should end. +void ShellSubscriber::attemptWriteToSocketLocked(size_t dataSize) { + // First write the payload size. + if (!android::base::WriteFully(mSubscriptionInfo->mOutputFd, &dataSize, sizeof(dataSize))) { + mSubscriptionInfo->mClientAlive = false; + mSubscriptionShouldEnd.notify_one(); + return; + } + + if (dataSize == 0) return; + + // Then, write the payload. + if (!mProto.flush(mSubscriptionInfo->mOutputFd)) { + mSubscriptionInfo->mClientAlive = false; + mSubscriptionShouldEnd.notify_one(); + return; + } + + mLastWriteMs = getElapsedRealtimeMillis(); +} + +// Send a heartbeat, consisting solely of a data size of 0, if perfd has not +// recently received any writes from statsd. When it receives the data size of +// 0, perfd will not expect any data and recheck whether the shell command is +// still running. +void ShellSubscriber::sendHeartbeats(int myToken) { + while (true) { + { + std::lock_guard<std::mutex> lock(mMutex); + if (!mSubscriptionInfo || myToken != mToken) { + VLOG("ShellSubscriber: heartbeat thread %d done!", myToken); return; } - // Then write the payload. - if (!mProto.flush(mSubscriptionInfo->mOutputFd)) { - mSubscriptionInfo->mClientAlive = false; - mSubscriptionShouldEnd.notify_one(); - return; + if (getElapsedRealtimeMillis() - mLastWriteMs > kMsBetweenHeartbeats) { + VLOG("ShellSubscriber: sending a heartbeat to perfd"); + attemptWriteToSocketLocked(/*dataSize=*/0); } } + std::this_thread::sleep_for(std::chrono::milliseconds(kMsBetweenHeartbeats)); } } diff --git a/cmds/statsd/src/shell/ShellSubscriber.h b/cmds/statsd/src/shell/ShellSubscriber.h index 61457d89f224..26c8a2a0b683 100644 --- a/cmds/statsd/src/shell/ShellSubscriber.h +++ b/cmds/statsd/src/shell/ShellSubscriber.h @@ -38,11 +38,11 @@ namespace statsd { * * A shell subscription lasts *until shell exits*. Unlike config based clients, a shell client * communicates with statsd via file descriptors. They can subscribe pushed and pulled atoms. - * The atoms are sent back to the client in real time, as opposed to - * keeping the data in memory. Shell clients do not subscribe aggregated metrics, as they are - * responsible for doing the aggregation after receiving the atom events. + * The atoms are sent back to the client in real time, as opposed to keeping the data in memory. + * Shell clients do not subscribe aggregated metrics, as they are responsible for doing the + * aggregation after receiving the atom events. * - * Shell client pass ShellSubscription in the proto binary format. Client can update the + * Shell clients pass ShellSubscription in the proto binary format. Clients can update the * subscription by sending a new subscription. The new subscription would replace the old one. * Input data stream format is: * @@ -54,7 +54,7 @@ namespace statsd { * The stream would be in the following format: * |size_t|shellData proto|size_t|shellData proto|.... * - * Only one shell subscriber allowed at a time, because each shell subscriber blocks one thread + * Only one shell subscriber is allowed at a time because each shell subscriber blocks one thread * until it exits. */ class ShellSubscriber : public virtual RefBase { @@ -100,11 +100,28 @@ private: bool readConfig(std::shared_ptr<SubscriptionInfo> subscriptionInfo); - void startPull(int64_t myToken); + void spawnHelperThreadsLocked(std::shared_ptr<SubscriptionInfo> myInfo, int myToken); - bool writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data, + void waitForSubscriptionToEndLocked(std::shared_ptr<SubscriptionInfo> myInfo, + int myToken, + std::unique_lock<std::mutex>& lock, + int timeoutSec); + + void startPull(int myToken); + + void writePulledAtomsLocked(const vector<std::shared_ptr<LogEvent>>& data, const SimpleAtomMatcher& matcher); + void getUidsForPullAtom(vector<int32_t>* uids, const PullInfo& pullInfo); + + void attemptWriteToSocketLocked(size_t dataSize); + + // Send ocassional heartbeats for two reasons: (a) for statsd to detect when + // the read end of the pipe has closed and (b) for perfd to escape a + // blocking read call and recheck if the user has terminated the + // subscription. + void sendHeartbeats(int myToken); + sp<UidMap> mUidMap; sp<StatsPullerManager> mPullerMgr; @@ -120,6 +137,11 @@ private: int mToken = 0; const int32_t DEFAULT_PULL_UID = AID_SYSTEM; + + // Tracks when we last send data to perfd. We need that time to determine + // when next to send a heartbeat. + int64_t mLastWriteMs = 0; + const int64_t kMsBetweenHeartbeats = 1000; }; } // namespace statsd diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index 868247bc9d64..1121392f1db0 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -456,12 +456,15 @@ message StatsdStatsReport { optional int64 pull_timeout = 10; optional int64 pull_exceed_max_delay = 11; optional int64 pull_failed = 12; - optional int64 stats_companion_pull_failed = 13; - optional int64 stats_companion_pull_binder_transaction_failed = 14; + optional int64 stats_companion_pull_failed = 13 [deprecated = true]; + optional int64 stats_companion_pull_binder_transaction_failed = 14 [deprecated = true]; optional int64 empty_data = 15; optional int64 registered_count = 16; optional int64 unregistered_count = 17; optional int32 atom_error_count = 18; + optional int64 binder_call_failed = 19; + optional int64 failed_uid_provider_not_found = 20; + optional int64 puller_not_found = 21; } repeated PulledAtomStats pulled_atom_stats = 10; diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 2acffee0f443..bafdfcba59b2 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -74,12 +74,13 @@ const int FIELD_ID_DATA_ERROR = 9; const int FIELD_ID_PULL_TIMEOUT = 10; const int FIELD_ID_PULL_EXCEED_MAX_DELAY = 11; const int FIELD_ID_PULL_FAILED = 12; -const int FIELD_ID_STATS_COMPANION_FAILED = 13; -const int FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED = 14; const int FIELD_ID_EMPTY_DATA = 15; const int FIELD_ID_PULL_REGISTERED_COUNT = 16; const int FIELD_ID_PULL_UNREGISTERED_COUNT = 17; const int FIELD_ID_ATOM_ERROR_COUNT = 18; +const int FIELD_ID_BINDER_CALL_FAIL_COUNT = 19; +const int FIELD_ID_PULL_UID_PROVIDER_NOT_FOUND = 20; +const int FIELD_ID_PULLER_NOT_FOUND = 21; // for AtomMetricStats proto const int FIELD_ID_ATOM_METRIC_STATS = 17; @@ -483,10 +484,6 @@ void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats> (long long)pair.second.pullExceedMaxDelay); protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_FAILED, (long long)pair.second.pullFailed); - protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_FAILED, - (long long)pair.second.statsCompanionPullFailed); - protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED, - (long long)pair.second.statsCompanionPullBinderTransactionFailed); protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_EMPTY_DATA, (long long)pair.second.emptyData); protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_REGISTERED_COUNT, @@ -494,6 +491,12 @@ void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats> protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_UNREGISTERED_COUNT, (long long) pair.second.unregisteredCount); protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_ATOM_ERROR_COUNT, pair.second.atomErrorCount); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BINDER_CALL_FAIL_COUNT, + (long long)pair.second.binderCallFailCount); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_UID_PROVIDER_NOT_FOUND, + (long long)pair.second.pullUidProviderNotFound); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULLER_NOT_FOUND, + (long long)pair.second.pullerNotFound); protoOutput->end(token); } diff --git a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp index cdde603f4c0b..948d58706971 100644 --- a/cmds/statsd/tests/guardrail/StatsdStats_test.cpp +++ b/cmds/statsd/tests/guardrail/StatsdStats_test.cpp @@ -302,7 +302,10 @@ TEST(StatsdStatsTest, TestPullAtomStats) { stats.notePullerCallbackRegistrationChanged(util::DISK_SPACE, true); stats.notePullerCallbackRegistrationChanged(util::DISK_SPACE, false); stats.notePullerCallbackRegistrationChanged(util::DISK_SPACE, true); - + stats.notePullBinderCallFailed(util::DISK_SPACE); + stats.notePullUidProviderNotFound(util::DISK_SPACE); + stats.notePullerNotFound(util::DISK_SPACE); + stats.notePullerNotFound(util::DISK_SPACE); vector<uint8_t> output; stats.dumpStats(&output, false); @@ -322,6 +325,9 @@ TEST(StatsdStatsTest, TestPullAtomStats) { EXPECT_EQ(3335L, report.pulled_atom_stats(0).max_pull_delay_nanos()); EXPECT_EQ(2L, report.pulled_atom_stats(0).registered_count()); EXPECT_EQ(1L, report.pulled_atom_stats(0).unregistered_count()); + EXPECT_EQ(1L, report.pulled_atom_stats(0).binder_call_failed()); + EXPECT_EQ(1L, report.pulled_atom_stats(0).failed_uid_provider_not_found()); + EXPECT_EQ(2L, report.pulled_atom_stats(0).puller_not_found()); } TEST(StatsdStatsTest, TestAtomMetricsStats) { diff --git a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp index 7b952d7a392e..363fcb4bf193 100644 --- a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp +++ b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp @@ -86,28 +86,34 @@ void runShellTest(ShellSubscription config, sp<MockUidMap> uidMap, // wait for the data to be written. std::this_thread::sleep_for(100ms); - int expected_data_size = expectedData.ByteSize(); - - // now read from the pipe. firstly read the atom size. - size_t dataSize = 0; - EXPECT_EQ((int)sizeof(dataSize), read(fds_data[0], &dataSize, sizeof(dataSize))); - - EXPECT_EQ(expected_data_size, (int)dataSize); - - // then read that much data which is the atom in proto binary format - vector<uint8_t> dataBuffer(dataSize); - EXPECT_EQ((int)dataSize, read(fds_data[0], dataBuffer.data(), dataSize)); - - // make sure the received bytes can be parsed to an atom - ShellData receivedAtom; - EXPECT_TRUE(receivedAtom.ParseFromArray(dataBuffer.data(), dataSize) != 0); + // Because we might receive heartbeats from statsd, consisting of data sizes + // of 0, encapsulate reads within a while loop. + bool readAtom = false; + while (!readAtom) { + // Read the atom size. + size_t dataSize = 0; + read(fds_data[0], &dataSize, sizeof(dataSize)); + if (dataSize == 0) continue; + EXPECT_EQ(expectedData.ByteSize(), int(dataSize)); + + // Read that much data in proto binary format. + vector<uint8_t> dataBuffer(dataSize); + EXPECT_EQ((int)dataSize, read(fds_data[0], dataBuffer.data(), dataSize)); + + // Make sure the received bytes can be parsed to an atom. + ShellData receivedAtom; + EXPECT_TRUE(receivedAtom.ParseFromArray(dataBuffer.data(), dataSize) != 0); + + // Serialize the expected atom to byte array and compare to make sure + // they are the same. + vector<uint8_t> expectedAtomBuffer(expectedData.ByteSize()); + expectedData.SerializeToArray(expectedAtomBuffer.data(), expectedData.ByteSize()); + EXPECT_EQ(expectedAtomBuffer, dataBuffer); + + readAtom = true; + } - // serialze the expected atom to bytes. and compare. to make sure they are the same. - vector<uint8_t> atomBuffer(expected_data_size); - expectedData.SerializeToArray(&atomBuffer[0], expected_data_size); - EXPECT_EQ(atomBuffer, dataBuffer); close(fds_data[0]); - if (reader.joinable()) { reader.join(); } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 833bfed573b2..e84c5e574713 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -99,7 +99,6 @@ interface IActivityManager { void unregisterUidObserver(in IUidObserver observer); boolean isUidActive(int uid, String callingPackage); int getUidProcessState(int uid, in String callingPackage); - boolean isUidActiveOrForeground(int uid, String callingPackage); // =============== End of transactions used on native side as well ============================ // Special low-level communication with activity manager. @@ -673,4 +672,9 @@ interface IActivityManager { * @param state The customized state data */ void setProcessStateSummary(in byte[] state); + + /** + * Return whether the app freezer is supported (true) or not (false) by this system. + */ + boolean isAppFreezerSupported(); } diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index 9372c957af34..cb2943122781 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -396,8 +396,13 @@ public class ParsingPackageUtils { } } - pkg.setVolumeUuid(volumeUuid) - .setSigningDetails(SigningDetails.UNKNOWN); + pkg.setVolumeUuid(volumeUuid); + + if ((flags & PackageParser.PARSE_COLLECT_CERTIFICATES) != 0) { + pkg.setSigningDetails(getSigningDetails(pkg, false)); + } else { + pkg.setSigningDetails(SigningDetails.UNKNOWN); + } return input.success(pkg); } catch (Exception e) { @@ -449,7 +454,7 @@ public class ParsingPackageUtils { */ private ParseResult<ParsingPackage> parseBaseApk(ParseInput input, String apkPath, String codePath, Resources res, XmlResourceParser parser, int flags) - throws XmlPullParserException, IOException { + throws XmlPullParserException, IOException, PackageParserException { final String splitName; final String pkgName; diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index 4d645e6052a7..0f9c7088a1d0 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -34,7 +34,6 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; -import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.util.SparseArray; @@ -74,6 +73,8 @@ public final class DisplayManagerGlobal { @UnsupportedAppUsage private static DisplayManagerGlobal sInstance; + // Guarded by mLock + private boolean mDispatchNativeCallbacks = false; private final Object mLock = new Object(); @UnsupportedAppUsage @@ -143,27 +144,35 @@ public final class DisplayManagerGlobal { @UnsupportedAppUsage public DisplayInfo getDisplayInfo(int displayId) { synchronized (mLock) { - DisplayInfo info = null; - if (mDisplayCache != null) { - info = mDisplayCache.query(displayId); - } else { - try { - info = mDm.getDisplayInfo(displayId); - } catch (RemoteException ex) { - ex.rethrowFromSystemServer(); - } - } - if (info == null) { - return null; + return getDisplayInfoLocked(displayId); + } + } + + /** + * Gets information about a particular logical display + * See {@link getDisplayInfo}, but assumes that {@link mLock} is held + */ + private @Nullable DisplayInfo getDisplayInfoLocked(int displayId) { + DisplayInfo info = null; + if (mDisplayCache != null) { + info = mDisplayCache.query(displayId); + } else { + try { + info = mDm.getDisplayInfo(displayId); + } catch (RemoteException ex) { + ex.rethrowFromSystemServer(); } + } + if (info == null) { + return null; + } - registerCallbackIfNeededLocked(); + registerCallbackIfNeededLocked(); - if (DEBUG) { - Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info); - } - return info; + if (DEBUG) { + Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info); } + return info; } /** @@ -341,6 +350,20 @@ public final class DisplayManagerGlobal { for (int i = 0; i < numListeners; i++) { mDisplayListeners.get(i).sendDisplayEvent(displayId, event); } + if (event == EVENT_DISPLAY_CHANGED && mDispatchNativeCallbacks) { + // Choreographer only supports a single display, so only dispatch refresh rate + // changes for the default display. + if (displayId == Display.DEFAULT_DISPLAY) { + // We can likely save a binder hop if we attach the refresh rate onto the + // listener. + DisplayInfo display = getDisplayInfoLocked(displayId); + if (display != null) { + float refreshRate = display.getMode().getRefreshRate(); + // Signal native callbacks if we ever set a refresh rate. + nSignalNativeCallbacks(refreshRate); + } + } + } } } @@ -800,4 +823,30 @@ public final class DisplayManagerGlobal { public void disableLocalDisplayInfoCaches() { mDisplayCache = null; } + + private static native void nSignalNativeCallbacks(float refreshRate); + + // Called from AChoreographer via JNI. + // Registers AChoreographer so that refresh rate callbacks can be dispatched from DMS. + private void registerNativeChoreographerForRefreshRateCallbacks() { + synchronized (mLock) { + registerCallbackIfNeededLocked(); + mDispatchNativeCallbacks = true; + DisplayInfo display = getDisplayInfoLocked(Display.DEFAULT_DISPLAY); + if (display != null) { + // We need to tell AChoreographer instances the current refresh rate so that apps + // can get it for free once a callback first registers. + float refreshRate = display.getMode().getRefreshRate(); + nSignalNativeCallbacks(refreshRate); + } + } + } + + // Called from AChoreographer via JNI. + // Unregisters AChoreographer from receiving refresh rate callbacks. + private void unregisterNativeChoreographerForRefreshRateCallbacks() { + synchronized (mLock) { + mDispatchNativeCallbacks = false; + } + } } diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index dfa5b26142f8..1a3cf2d2c634 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -550,11 +550,12 @@ public final class MessageQueue { if (msg.target == null) { throw new IllegalArgumentException("Message must have a target."); } - if (msg.isInUse()) { - throw new IllegalStateException(msg + " This message is already in use."); - } synchronized (this) { + if (msg.isInUse()) { + throw new IllegalStateException(msg + " This message is already in use."); + } + if (mQuitting) { IllegalStateException e = new IllegalStateException( msg.target + " sending message to a Handler on a dead thread"); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 187274a837a0..7912dacac377 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -635,10 +635,11 @@ public class UserManager { /** * Specifies if a user is disallowed from adding new users. This can only be set by device - * owners, profile owners on the primary user or profile owners of organization-owned managed - * profiles on the parent profile. The default value is <code>false</code>. + * owners or profile owners on the primary user. The default value is <code>false</code>. * <p>This restriction has no effect on secondary users and managed profiles since only the * primary user can add other users. + * <p> When the device is an organization-owned device provisioned with a managed profile, + * this restriction will be set as a base restriction which cannot be removed by any admin. * * <p>Key for user restrictions. * <p>Type: Boolean diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index ed429dd835c3..06caa03e3cb4 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -56,10 +56,15 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.RemoteStream; import com.android.internal.infra.ServiceConnector; +import com.android.internal.os.TransferPipe; import com.android.internal.util.CollectionUtils; import libcore.util.EmptyArray; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -67,7 +72,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; /** @@ -476,6 +483,36 @@ public final class PermissionControllerManager { } /** + * Dump permission controller state. + * + * @hide + */ + public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @Nullable String[] args) { + CompletableFuture<Throwable> dumpResult = new CompletableFuture<>(); + mRemoteService.postForResult( + service -> TransferPipe.dumpAsync(service.asBinder(), args)) + .whenComplete( + (dump, err) -> { + try (FileOutputStream out = new FileOutputStream(fd)) { + out.write(dump); + } catch (IOException | NullPointerException e) { + Log.e(TAG, "Could for forwards permission controller dump", e); + } + + dumpResult.complete(err); + }); + + try { + Throwable err = dumpResult.get(UNBIND_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + if (err != null) { + throw err; + } + } catch (Throwable e) { + Log.e(TAG, "Could not dump permission controller state", e); + } + } + + /** * Gets the runtime permissions for an app. * * @param packageName The package for which to query. diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index 82a7d788100d..c6ede32d0864 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -50,9 +50,11 @@ import com.android.internal.infra.AndroidFuture; import com.android.internal.util.CollectionUtils; import com.android.internal.util.Preconditions; +import java.io.FileDescriptor; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -494,6 +496,11 @@ public abstract class PermissionControllerService extends Service { "packageName cannot be null"); onOneTimePermissionSessionTimeout(packageName); } + + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + PermissionControllerService.this.dump(fd, writer, args); + } }; } } diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java index 2e00c0c9d2a4..327bca268a7b 100644 --- a/core/java/android/provider/DocumentsProvider.java +++ b/core/java/android/provider/DocumentsProvider.java @@ -1274,8 +1274,6 @@ public abstract class DocumentsProvider extends ContentProvider { out.putParcelable(DocumentsContract.EXTRA_RESULT, path); } else if (METHOD_GET_DOCUMENT_METADATA.equals(method)) { - enforceReadPermissionInner(documentUri, getCallingPackage(), - getCallingAttributionTag(), null); return getDocumentMetadata(documentId); } else { throw new UnsupportedOperationException("Method not supported " + method); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 6c8bd7f352d4..ae88ba5e08c5 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11956,8 +11956,24 @@ public final class Settings { "adaptive_battery_management_enabled"; /** + * Whether or not apps are allowed into the + * {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_RESTRICTED} bucket. + * Type: int (0 for false, 1 for true) + * Default: {@value #DEFAULT_ENABLE_RESTRICTED_BUCKET} + * + * @hide + */ + public static final String ENABLE_RESTRICTED_BUCKET = "enable_restricted_bucket"; + + /** + * @see #ENABLE_RESTRICTED_BUCKET + * @hide + */ + public static final int DEFAULT_ENABLE_RESTRICTED_BUCKET = 1; + + /** * Whether or not app auto restriction is enabled. When it is enabled, settings app will - * auto restrict the app if it has bad behavior(e.g. hold wakelock for long time). + * auto restrict the app if it has bad behavior (e.g. hold wakelock for long time). * * Type: boolean (0 for false, 1 for true) * Default: 1 @@ -14033,6 +14049,14 @@ public final class Settings { "zram_enabled"; /** + * Whether the app freezer is enabled on this device. + * The value of "enabled" enables the app freezer, "disabled" disables it and + * "device_default" will let the system decide whether to enable the freezer or not + * @hide + */ + public static final String CACHED_APPS_FREEZER_ENABLED = "cached_apps_freezer"; + + /** * Configuration flags for smart replies in notifications. * This is encoded as a key=value list, separated by commas. Ex: * diff --git a/core/java/android/service/autofill/IInlineSuggestionUi.aidl b/core/java/android/service/autofill/IInlineSuggestionUi.aidl new file mode 100644 index 000000000000..7289853064f8 --- /dev/null +++ b/core/java/android/service/autofill/IInlineSuggestionUi.aidl @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.autofill; + +import android.service.autofill.ISurfacePackageResultCallback; + +/** + * Interface to interact with a remote inline suggestion UI. + * + * @hide + */ +oneway interface IInlineSuggestionUi { + void getSurfacePackage(ISurfacePackageResultCallback callback); + void releaseSurfaceControlViewHost(); +} diff --git a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl index 172cfef9fee2..97eb790b9acc 100644 --- a/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl +++ b/core/java/android/service/autofill/IInlineSuggestionUiCallback.aidl @@ -18,17 +18,19 @@ package android.service.autofill; import android.content.IntentSender; import android.os.IBinder; +import android.service.autofill.IInlineSuggestionUi; import android.view.SurfaceControlViewHost; /** - * Interface to receive events from inline suggestions. + * Interface to receive events from a remote inline suggestion UI. * * @hide */ oneway interface IInlineSuggestionUiCallback { void onClick(); void onLongClick(); - void onContent(in SurfaceControlViewHost.SurfacePackage surface, int width, int height); + void onContent(in IInlineSuggestionUi content, in SurfaceControlViewHost.SurfacePackage surface, + int width, int height); void onError(); void onTransferTouchFocusToImeWindow(in IBinder sourceInputToken, int displayId); void onStartIntentSender(in IntentSender intentSender); diff --git a/core/java/android/service/autofill/ISurfacePackageResultCallback.aidl b/core/java/android/service/autofill/ISurfacePackageResultCallback.aidl new file mode 100644 index 000000000000..0c2c624952eb --- /dev/null +++ b/core/java/android/service/autofill/ISurfacePackageResultCallback.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.autofill; + +import android.view.SurfaceControlViewHost; + +/** + * Interface to receive a SurfaceControlViewHost.SurfacePackage. + * + * @hide + */ +oneway interface ISurfacePackageResultCallback { + void onResult(in SurfaceControlViewHost.SurfacePackage result); +} diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java index 6c22b1936d74..3ea443bab3f8 100644 --- a/core/java/android/service/autofill/InlineSuggestionRenderService.java +++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java @@ -33,6 +33,7 @@ import android.os.Looper; import android.os.RemoteCallback; import android.os.RemoteException; import android.util.Log; +import android.util.LruCache; import android.util.Size; import android.view.Display; import android.view.SurfaceControlViewHost; @@ -40,6 +41,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import java.lang.ref.WeakReference; + /** * A service that renders an inline presentation view given the {@link InlinePresentation}. * @@ -65,6 +68,27 @@ public abstract class InlineSuggestionRenderService extends Service { private IInlineSuggestionUiCallback mCallback; + + /** + * A local LRU cache keeping references to the inflated {@link SurfaceControlViewHost}s, so + * they can be released properly when no longer used. Each view needs to be tracked separately, + * therefore for simplicity we use the hash code of the value object as key in the cache. + */ + private final LruCache<InlineSuggestionUiImpl, Boolean> mActiveInlineSuggestions = + new LruCache<InlineSuggestionUiImpl, Boolean>(30) { + @Override + public void entryRemoved(boolean evicted, InlineSuggestionUiImpl key, + Boolean oldValue, + Boolean newValue) { + if (evicted) { + Log.w(TAG, + "Hit max=100 entries in the cache. Releasing oldest one to make " + + "space."); + key.releaseSurfaceControlViewHost(); + } + } + }; + /** * If the specified {@code width}/{@code height} is an exact value, then it will be returned as * is, otherwise the method tries to measure a size that is just large enough to fit the view @@ -169,8 +193,14 @@ public abstract class InlineSuggestionRenderService extends Service { return true; }); - sendResult(callback, host.getSurfacePackage(), measuredSize.getWidth(), - measuredSize.getHeight()); + try { + InlineSuggestionUiImpl uiImpl = new InlineSuggestionUiImpl(host, mHandler); + mActiveInlineSuggestions.put(uiImpl, true); + callback.onContent(new InlineSuggestionUiWrapper(uiImpl), host.getSurfacePackage(), + measuredSize.getWidth(), measuredSize.getHeight()); + } catch (RemoteException e) { + Log.w(TAG, "RemoteException calling onContent()"); + } } finally { updateDisplay(Display.DEFAULT_DISPLAY); } @@ -181,12 +211,87 @@ public abstract class InlineSuggestionRenderService extends Service { callback.sendResult(rendererInfo); } - private void sendResult(@NonNull IInlineSuggestionUiCallback callback, - @Nullable SurfaceControlViewHost.SurfacePackage surface, int width, int height) { - try { - callback.onContent(surface, width, height); - } catch (RemoteException e) { - Log.w(TAG, "RemoteException calling onContent(" + surface + ")"); + /** + * A wrapper class around the {@link InlineSuggestionUiImpl} to ensure it's not strongly + * reference by the remote system server process. + */ + private static final class InlineSuggestionUiWrapper extends + android.service.autofill.IInlineSuggestionUi.Stub { + + private final WeakReference<InlineSuggestionUiImpl> mUiImpl; + + InlineSuggestionUiWrapper(InlineSuggestionUiImpl uiImpl) { + mUiImpl = new WeakReference<>(uiImpl); + } + + @Override + public void releaseSurfaceControlViewHost() { + final InlineSuggestionUiImpl uiImpl = mUiImpl.get(); + if (uiImpl != null) { + uiImpl.releaseSurfaceControlViewHost(); + } + } + + @Override + public void getSurfacePackage(ISurfacePackageResultCallback callback) { + final InlineSuggestionUiImpl uiImpl = mUiImpl.get(); + if (uiImpl != null) { + uiImpl.getSurfacePackage(callback); + } + } + } + + /** + * Keeps track of a SurfaceControlViewHost to ensure it's released when its lifecycle ends. + * + * <p>This class is thread safe, because all the outside calls are piped into a single + * handler thread to be processed. + */ + private final class InlineSuggestionUiImpl { + + @Nullable + private SurfaceControlViewHost mViewHost; + @NonNull + private final Handler mHandler; + + InlineSuggestionUiImpl(SurfaceControlViewHost viewHost, Handler handler) { + this.mViewHost = viewHost; + this.mHandler = handler; + } + + /** + * Call {@link SurfaceControlViewHost#release()} to release it. After this, this view is + * not usable, and any further calls to the + * {@link #getSurfacePackage(ISurfacePackageResultCallback)} will get {@code null} result. + */ + public void releaseSurfaceControlViewHost() { + mHandler.post(() -> { + if (mViewHost == null) { + return; + } + Log.v(TAG, "Releasing inline suggestion view host"); + mViewHost.release(); + mViewHost = null; + InlineSuggestionRenderService.this.mActiveInlineSuggestions.remove( + InlineSuggestionUiImpl.this); + Log.v(TAG, "Removed the inline suggestion from the cache, current size=" + + InlineSuggestionRenderService.this.mActiveInlineSuggestions.size()); + }); + } + + /** + * Sends back a new {@link android.view.SurfaceControlViewHost.SurfacePackage} if the view + * is not released, {@code null} otherwise. + */ + public void getSurfacePackage(ISurfacePackageResultCallback callback) { + Log.d(TAG, "getSurfacePackage"); + mHandler.post(() -> { + try { + callback.onResult(mViewHost == null ? null : mViewHost.getSurfacePackage()); + } catch (RemoteException e) { + Log.w(TAG, "RemoteException calling onSurfacePackage"); + } + }); } } diff --git a/core/java/android/service/dreams/DreamActivity.java b/core/java/android/service/dreams/DreamActivity.java index 0a29edc81f2f..09d1bb9d2b12 100644 --- a/core/java/android/service/dreams/DreamActivity.java +++ b/core/java/android/service/dreams/DreamActivity.java @@ -21,6 +21,8 @@ import android.app.Activity; import android.os.Bundle; import android.view.WindowInsets; +import com.android.internal.R; + /** * The Activity used by the {@link DreamService} to draw screensaver content * on the screen. This activity runs in dream application's process, but is started by a @@ -56,8 +58,20 @@ public class DreamActivity extends Activity { if (callback != null) { callback.onActivityCreated(this); } + } + @Override + public void onResume() { + super.onResume(); // Hide all insets (nav bar, status bar, etc) when the dream is showing getWindow().getInsetsController().hide(WindowInsets.Type.systemBars()); + overridePendingTransition(R.anim.dream_activity_open_enter, + R.anim.dream_activity_open_exit); + } + + @Override + public void finishAndRemoveTask() { + super.finishAndRemoveTask(); + overridePendingTransition(0, R.anim.dream_activity_close_exit); } } diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 337027ef5bc9..d2dfb29ba25c 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -1052,7 +1052,6 @@ public class DreamService extends Service implements Window.Callback { mWindow.requestFeature(Window.FEATURE_NO_TITLE); WindowManager.LayoutParams lp = mWindow.getAttributes(); - lp.windowAnimations = com.android.internal.R.style.Animation_Dream; lp.flags |= (WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED @@ -1076,8 +1075,12 @@ public class DreamService extends Service implements Window.Callback { @Override public void onViewDetachedFromWindow(View v) { - mActivity = null; - finish(); + if (mActivity == null || !mActivity.isChangingConfigurations()) { + // Only stop the dream if the view is not detached by relaunching + // activity for configuration changes. + mActivity = null; + finish(); + } } }); } diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java index 92f3538a48de..aea94bfb1bbb 100644 --- a/core/java/android/speech/SpeechRecognizer.java +++ b/core/java/android/speech/SpeechRecognizer.java @@ -283,8 +283,8 @@ public class SpeechRecognizer { } else { serviceIntent.setComponent(mServiceComponent); } - - if (!mContext.bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE)) { + if (!mContext.bindService(serviceIntent, mConnection, + Context.BIND_AUTO_CREATE | Context.BIND_INCLUDE_CAPABILITIES)) { Log.e(TAG, "bind to recognition service failed"); mConnection = null; mService = null; diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index a135b0ca148b..2d17b6d2ae22 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -667,7 +667,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation if (hideTypes[0] != 0) { applyAnimation(hideTypes[0], false /* show */, false /* fromIme */); } - if (hasControl) { + if (hasControl && mRequestedState.getSourcesCount() > 0) { // We might have changed our requested visibilities while we don't have the control, // so we need to update our requested state once we have control. Otherwise, our // requested state at the server side might be incorrect. @@ -1065,9 +1065,16 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation if (consumer.getControl() != null) { final InsetsSource localSource = mState.getSource(type); if (!localSource.equals(mRequestedState.peekSource(type))) { + // Our requested state is stale. Update it here and send it to window manager. mRequestedState.addSource(new InsetsSource(localSource)); changed = true; } + if (!localSource.equals(mLastDispatchedState.peekSource(type))) { + // The server state is not what we expected. This can happen while we don't have + // the control. Since we have the control now, we need to send our request again + // to modify the server state. + changed = true; + } } } if (!changed) { @@ -1117,7 +1124,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation * Cancel on-going animation to show/hide {@link InsetsType}. */ @VisibleForTesting - public void cancelExistingAnimation() { + public void cancelExistingAnimations() { cancelExistingControllers(all()); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 42f11c162473..a17af6c90617 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4624,6 +4624,8 @@ public final class ViewRootImpl implements ViewParent, setAccessibilityFocus(null, null); + mInsetsController.cancelExistingAnimations(); + mView.assignParent(null); mView = null; mAttachInfo.mRootView = null; diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java index d8bf58f78339..9674a80c8159 100644 --- a/core/java/android/view/ViewRootInsetsControllerHost.java +++ b/core/java/android/view/ViewRootInsetsControllerHost.java @@ -104,10 +104,10 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host { @Override public void applySurfaceParams(SyncRtSurfaceTransactionApplier.SurfaceParams... params) { + if (mViewRoot.mView == null) { + throw new IllegalStateException("View of the ViewRootImpl is not initiated."); + } if (mApplier == null) { - if (mViewRoot.mView == null) { - throw new IllegalStateException("View of the ViewRootImpl is not initiated."); - } mApplier = new SyncRtSurfaceTransactionApplier(mViewRoot.mView); } if (mViewRoot.mView.isHardwareAccelerated()) { diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 1773ec2b17ee..76fe6b5f666d 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -1894,7 +1894,13 @@ public final class AutofillManager { final SyncResultReceiver receiver = new SyncResultReceiver(SYNC_CALLS_TIMEOUT_MS); mService.addClient(mServiceClient, client.autofillClientGetComponentName(), userId, receiver); - final int flags = receiver.getIntResult(); + int flags = 0; + try { + flags = receiver.getIntResult(); + } catch (SyncResultReceiver.TimeoutException e) { + Log.w(TAG, "Failed to initialize autofill: " + e); + return; + } mEnabled = (flags & FLAG_ADD_CLIENT_ENABLED) != 0; sDebug = (flags & FLAG_ADD_CLIENT_DEBUG) != 0; sVerbose = (flags & FLAG_ADD_CLIENT_VERBOSE) != 0; diff --git a/core/java/android/view/inputmethod/InlineSuggestion.java b/core/java/android/view/inputmethod/InlineSuggestion.java index 6b1a480986c8..4c72474435a4 100644 --- a/core/java/android/view/inputmethod/InlineSuggestion.java +++ b/core/java/android/view/inputmethod/InlineSuggestion.java @@ -18,11 +18,13 @@ package android.view.inputmethod; import android.annotation.BinderThread; import android.annotation.CallbackExecutor; +import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.content.Context; -import android.os.AsyncTask; +import android.os.Handler; +import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; @@ -42,26 +44,26 @@ import java.util.concurrent.Executor; import java.util.function.Consumer; /** - * This class represents an inline suggestion which is made by one app - * and can be embedded into the UI of another. Suggestions may contain - * sensitive information not known to the host app which needs to be - * protected from spoofing. To address that the suggestion view inflated - * on demand for embedding is created in such a way that the hosting app - * cannot introspect its content and cannot interact with it. + * This class represents an inline suggestion which is made by one app and can be embedded into the + * UI of another. Suggestions may contain sensitive information not known to the host app which + * needs to be protected from spoofing. To address that the suggestion view inflated on demand for + * embedding is created in such a way that the hosting app cannot introspect its content and cannot + * interact with it. */ -@DataClass( - genEqualsHashCode = true, - genToString = true, - genHiddenConstDefs = true, +@DataClass(genEqualsHashCode = true, genToString = true, genHiddenConstDefs = true, genHiddenConstructor = true) -@DataClass.Suppress({"getContentProvider"}) public final class InlineSuggestion implements Parcelable { private static final String TAG = "InlineSuggestion"; - private final @NonNull InlineSuggestionInfo mInfo; + @NonNull + private final InlineSuggestionInfo mInfo; - private final @Nullable IInlineContentProvider mContentProvider; + /** + * @hide + */ + @Nullable + private final IInlineContentProvider mContentProvider; /** * Used to keep a strong reference to the callback so it doesn't get garbage collected. @@ -69,7 +71,8 @@ public final class InlineSuggestion implements Parcelable { * @hide */ @DataClass.ParcelWith(InlineContentCallbackImplParceling.class) - private @Nullable InlineContentCallbackImpl mInlineContentCallback; + @Nullable + private InlineContentCallbackImpl mInlineContentCallback; /** * Creates a new {@link InlineSuggestion}, for testing purpose. @@ -87,8 +90,7 @@ public final class InlineSuggestion implements Parcelable { * * @hide */ - public InlineSuggestion( - @NonNull InlineSuggestionInfo info, + public InlineSuggestion(@NonNull InlineSuggestionInfo info, @Nullable IInlineContentProvider contentProvider) { this(info, contentProvider, /* inlineContentCallback */ null); } @@ -96,25 +98,30 @@ public final class InlineSuggestion implements Parcelable { /** * Inflates a view with the content of this suggestion at a specific size. * - * <p> The size must be either 1) between the - * {@link android.widget.inline.InlinePresentationSpec#getMinSize() min size} and the - * {@link android.widget.inline.InlinePresentationSpec#getMaxSize() max size} of the - * presentation spec returned by {@link InlineSuggestionInfo#getInlinePresentationSpec()}, - * or 2) {@link ViewGroup.LayoutParams#WRAP_CONTENT}. If the size is set to - * {@link ViewGroup.LayoutParams#WRAP_CONTENT}, then the size of the inflated view will be just - * large enough to fit the content, while still conforming to the min / max size specified by - * the {@link android.widget.inline.InlinePresentationSpec}. + * <p> Each dimension of the size must satisfy one of the following conditions: + * + * <ol> + * <li>between {@link android.widget.inline.InlinePresentationSpec#getMinSize()} and + * {@link android.widget.inline.InlinePresentationSpec#getMaxSize()} of the presentation spec + * from {@code mInfo} + * <li>{@link ViewGroup.LayoutParams#WRAP_CONTENT} + * </ol> + * + * If the size is set to {@link + * ViewGroup.LayoutParams#WRAP_CONTENT}, then the size of the inflated view will be just large + * enough to fit the content, while still conforming to the min / max size specified by the + * {@link android.widget.inline.InlinePresentationSpec}. * * <p> The caller can attach an {@link android.view.View.OnClickListener} and/or an - * {@link android.view.View.OnLongClickListener} to the view in the - * {@code callback} to receive click and long click events on the view. + * {@link android.view.View.OnLongClickListener} to the view in the {@code callback} to receive + * click and long click events on the view. * * @param context Context in which to inflate the view. - * @param size The size at which to inflate the suggestion. For each dimension, it maybe - * an exact value or {@link ViewGroup.LayoutParams#WRAP_CONTENT}. - * @param callback Callback for receiving the inflated view, where the - * {@link ViewGroup.LayoutParams} of the view is set as the actual size of - * the underlying remote view. + * @param size The size at which to inflate the suggestion. For each dimension, it maybe an + * exact value or {@link ViewGroup.LayoutParams#WRAP_CONTENT}. + * @param callback Callback for receiving the inflated view, where the {@link + * ViewGroup.LayoutParams} of the view is set as the actual size of the + * underlying remote view. * @throws IllegalArgumentException If an invalid argument is passed. * @throws IllegalStateException If this method is already called. */ @@ -130,19 +137,17 @@ public final class InlineSuggestion implements Parcelable { + ", nor wrap_content"); } mInlineContentCallback = getInlineContentCallback(context, callbackExecutor, callback); - AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { - if (mContentProvider == null) { - callback.accept(/* view */ null); - return; - } - try { - mContentProvider.provideContent(size.getWidth(), size.getHeight(), - new InlineContentCallbackWrapper(mInlineContentCallback)); - } catch (RemoteException e) { - Slog.w(TAG, "Error creating suggestion content surface: " + e); - callback.accept(/* view */ null); - } - }); + if (mContentProvider == null) { + callbackExecutor.execute(() -> callback.accept(/* view */ null)); + return; + } + try { + mContentProvider.provideContent(size.getWidth(), size.getHeight(), + new InlineContentCallbackWrapper(mInlineContentCallback)); + } catch (RemoteException e) { + Slog.w(TAG, "Error creating suggestion content surface: " + e); + callbackExecutor.execute(() -> callback.accept(/* view */ null)); + } } /** @@ -161,9 +166,14 @@ public final class InlineSuggestion implements Parcelable { if (mInlineContentCallback != null) { throw new IllegalStateException("Already called #inflate()"); } - return new InlineContentCallbackImpl(context, callbackExecutor, callback); + return new InlineContentCallbackImpl(context, mContentProvider, callbackExecutor, + callback); } + /** + * A wrapper class around the {@link InlineContentCallbackImpl} to ensure it's not strongly + * reference by the remote system server process. + */ private static final class InlineContentCallbackWrapper extends IInlineContentCallback.Stub { private final WeakReference<InlineContentCallbackImpl> mCallbackImpl; @@ -201,17 +211,68 @@ public final class InlineSuggestion implements Parcelable { } } + /** + * Handles the communication between the inline suggestion view in current (IME) process and + * the remote view provided from the system server. + * + * <p>This class is thread safe, because all the outside calls are piped into a single + * handler thread to be processed. + */ private static final class InlineContentCallbackImpl { - private final @NonNull Context mContext; - private final @NonNull Executor mCallbackExecutor; - private final @NonNull Consumer<InlineContentView> mCallback; - private @Nullable InlineContentView mView; + @NonNull + private final Handler mMainHandler = new Handler(Looper.getMainLooper()); + + @NonNull + private final Context mContext; + @Nullable + private final IInlineContentProvider mInlineContentProvider; + @NonNull + private final Executor mCallbackExecutor; + + /** + * Callback from the client (IME) that will receive the inflated suggestion view. It'll + * only be called once when the view SurfacePackage is first sent back to the client. Any + * updates to the view due to attach to window and detach from window events will be + * handled under the hood, transparent from the client. + */ + @NonNull + private final Consumer<InlineContentView> mCallback; + + /** + * Indicates whether the first content has been received or not. + */ + private boolean mFirstContentReceived = false; + + /** + * The client (IME) side view which internally wraps a remote view. It'll be set when + * {@link #onContent(SurfaceControlViewHost.SurfacePackage, int, int)} is called, which + * should only happen once in the lifecycle of this inline suggestion instance. + */ + @Nullable + private InlineContentView mView; + + /** + * The SurfacePackage pointing to the remote view. It's cached here to be sent to the next + * available consumer. + */ + @Nullable + private SurfaceControlViewHost.SurfacePackage mSurfacePackage; + + /** + * The callback (from the {@link InlineContentView}) which consumes the surface package. + * It's cached here to be called when the SurfacePackage is returned from the remote + * view owning process. + */ + @Nullable + private Consumer<SurfaceControlViewHost.SurfacePackage> mSurfacePackageConsumer; InlineContentCallbackImpl(@NonNull Context context, + @Nullable IInlineContentProvider inlineContentProvider, @NonNull @CallbackExecutor Executor callbackExecutor, @NonNull Consumer<InlineContentView> callback) { mContext = context; + mInlineContentProvider = inlineContentProvider; mCallbackExecutor = callbackExecutor; mCallback = callback; } @@ -219,28 +280,110 @@ public final class InlineSuggestion implements Parcelable { @BinderThread public void onContent(SurfaceControlViewHost.SurfacePackage content, int width, int height) { - if (content == null) { + mMainHandler.post(() -> handleOnContent(content, width, height)); + } + + @MainThread + private void handleOnContent(SurfaceControlViewHost.SurfacePackage content, int width, + int height) { + if (!mFirstContentReceived) { + handleOnFirstContentReceived(content, width, height); + mFirstContentReceived = true; + } else { + handleOnSurfacePackage(content); + } + } + + /** + * Called when the view content is returned for the first time. + */ + @MainThread + private void handleOnFirstContentReceived(SurfaceControlViewHost.SurfacePackage content, + int width, int height) { + mSurfacePackage = content; + if (mSurfacePackage == null) { mCallbackExecutor.execute(() -> mCallback.accept(/* view */null)); } else { mView = new InlineContentView(mContext); mView.setLayoutParams(new ViewGroup.LayoutParams(width, height)); - mView.setChildSurfacePackage(content); + mView.setChildSurfacePackageUpdater(getSurfacePackageUpdater()); mCallbackExecutor.execute(() -> mCallback.accept(mView)); } } + /** + * Called when any subsequent SurfacePackage is returned from the remote view owning + * process. + */ + @MainThread + private void handleOnSurfacePackage(SurfaceControlViewHost.SurfacePackage surfacePackage) { + mSurfacePackage = surfacePackage; + if (mSurfacePackage != null && mSurfacePackageConsumer != null) { + mSurfacePackageConsumer.accept(mSurfacePackage); + mSurfacePackageConsumer = null; + } + } + + @MainThread + private void handleOnSurfacePackageReleased() { + mSurfacePackage = null; + try { + mInlineContentProvider.onSurfacePackageReleased(); + } catch (RemoteException e) { + Slog.w(TAG, "Error calling onSurfacePackageReleased(): " + e); + } + } + + @MainThread + private void handleGetSurfacePackage( + Consumer<SurfaceControlViewHost.SurfacePackage> consumer) { + if (mSurfacePackage != null) { + consumer.accept(mSurfacePackage); + } else { + mSurfacePackageConsumer = consumer; + try { + mInlineContentProvider.requestSurfacePackage(); + } catch (RemoteException e) { + Slog.w(TAG, "Error calling getSurfacePackage(): " + e); + consumer.accept(null); + mSurfacePackageConsumer = null; + } + } + } + + private InlineContentView.SurfacePackageUpdater getSurfacePackageUpdater() { + return new InlineContentView.SurfacePackageUpdater() { + @Override + public void onSurfacePackageReleased() { + mMainHandler.post( + () -> InlineContentCallbackImpl.this.handleOnSurfacePackageReleased()); + } + + @Override + public void getSurfacePackage( + Consumer<SurfaceControlViewHost.SurfacePackage> consumer) { + mMainHandler.post( + () -> InlineContentCallbackImpl.this.handleGetSurfacePackage(consumer)); + } + }; + } + @BinderThread public void onClick() { - if (mView != null && mView.hasOnClickListeners()) { - mView.callOnClick(); - } + mMainHandler.post(() -> { + if (mView != null && mView.hasOnClickListeners()) { + mView.callOnClick(); + } + }); } @BinderThread public void onLongClick() { - if (mView != null && mView.hasOnLongClickListeners()) { - mView.performLongClick(); - } + mMainHandler.post(() -> { + if (mView != null && mView.hasOnLongClickListeners()) { + mView.performLongClick(); + } + }); } } @@ -262,6 +405,7 @@ public final class InlineSuggestion implements Parcelable { + // Code below generated by codegen v1.0.15. // // DO NOT MODIFY! @@ -302,6 +446,14 @@ public final class InlineSuggestion implements Parcelable { } /** + * @hide + */ + @DataClass.Generated.Member + public @Nullable IInlineContentProvider getContentProvider() { + return mContentProvider; + } + + /** * Used to keep a strong reference to the callback so it doesn't get garbage collected. * * @hide @@ -421,7 +573,7 @@ public final class InlineSuggestion implements Parcelable { }; @DataClass.Generated( - time = 1587771173367L, + time = 1588308946517L, codegenVersion = "1.0.15", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestion.java", inputSignatures = "private static final java.lang.String TAG\nprivate final @android.annotation.NonNull android.view.inputmethod.InlineSuggestionInfo mInfo\nprivate final @android.annotation.Nullable com.android.internal.view.inline.IInlineContentProvider mContentProvider\nprivate @com.android.internal.util.DataClass.ParcelWith(android.view.inputmethod.InlineSuggestion.InlineContentCallbackImplParceling.class) @android.annotation.Nullable android.view.inputmethod.InlineSuggestion.InlineContentCallbackImpl mInlineContentCallback\npublic static @android.annotation.TestApi @android.annotation.NonNull android.view.inputmethod.InlineSuggestion newInlineSuggestion(android.view.inputmethod.InlineSuggestionInfo)\npublic void inflate(android.content.Context,android.util.Size,java.util.concurrent.Executor,java.util.function.Consumer<android.widget.inline.InlineContentView>)\nprivate static boolean isValid(int,int,int)\nprivate synchronized android.view.inputmethod.InlineSuggestion.InlineContentCallbackImpl getInlineContentCallback(android.content.Context,java.util.concurrent.Executor,java.util.function.Consumer<android.widget.inline.InlineContentView>)\nclass InlineSuggestion extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genHiddenConstDefs=true, genHiddenConstructor=true)") diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 3cf61098f11c..71dd6653f6a6 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -645,6 +645,11 @@ public final class InputMethodManager { @Override public void setCurrentRootView(ViewRootImpl rootView) { synchronized (mH) { + if (mCurRootView != null) { + // Reset the last served view and restart window focus state of the root view. + mCurRootView.getImeFocusController().setServedView(null); + mRestartOnNextWindowFocus = true; + } mCurRootView = rootView; } } diff --git a/core/java/android/widget/inline/InlineContentView.java b/core/java/android/widget/inline/InlineContentView.java index 4f2af63626cf..8657e828a3f6 100644 --- a/core/java/android/widget/inline/InlineContentView.java +++ b/core/java/android/widget/inline/InlineContentView.java @@ -21,40 +21,45 @@ import android.annotation.Nullable; import android.content.Context; import android.graphics.PixelFormat; import android.util.AttributeSet; +import android.util.Log; import android.view.SurfaceControl; import android.view.SurfaceControlViewHost; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.ViewGroup; +import java.util.function.Consumer; + /** - * This class represents a view that holds opaque content from another app that - * you can inline in your UI. + * This class represents a view that holds opaque content from another app that you can inline in + * your UI. * * <p>Since the content presented by this view is from another security domain,it is - * shown on a remote surface preventing the host application from accessing that content. - * Also the host application cannot interact with the inlined content by injecting touch - * events or clicking programmatically. + * shown on a remote surface preventing the host application from accessing that content. Also the + * host application cannot interact with the inlined content by injecting touch events or clicking + * programmatically. * * <p>This view can be overlaid by other windows, i.e. redressed, but if this is the case - * the inined UI would not be interactive. Sometimes this is desirable, e.g. animating - * transitions. + * the inlined UI would not be interactive. Sometimes this is desirable, e.g. animating transitions. * * <p>By default the surface backing this view is shown on top of the hosting window such - * that the inlined content is interactive. However, you can temporarily move the surface - * under the hosting window which could be useful in some cases, e.g. animating transitions. - * At this point the inlined content will not be interactive and the touch events would - * be delivered to your app. - * <p> - * Instances of this class are created by the platform and can be programmatically attached - * to your UI. Once you attach and detach this view it can not longer be reused and you - * should obtain a new view from the platform via the dedicated APIs. + * that the inlined content is interactive. However, you can temporarily move the surface under the + * hosting window which could be useful in some cases, e.g. animating transitions. At this point the + * inlined content will not be interactive and the touch events would be delivered to your app. + * + * <p> Instances of this class are created by the platform and can be programmatically attached to + * your UI. Once the view is attached to the window, you may detach and reattach it to the window. + * It should work seamlessly from the hosting process's point of view. */ public class InlineContentView extends ViewGroup { + private static final String TAG = "InlineContentView"; + + private static final boolean DEBUG = false; + /** - * Callback for observing the lifecycle of the surface control - * that manipulates the backing secure embedded UI surface. + * Callback for observing the lifecycle of the surface control that manipulates the backing + * secure embedded UI surface. */ public interface SurfaceControlCallback { /** @@ -72,15 +77,41 @@ public class InlineContentView extends ViewGroup { void onDestroyed(@NonNull SurfaceControl surfaceControl); } - private final @NonNull SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() { + /** + * Callback for sending an updated surface package in case the previous one is released + * from the detached from window event, and for getting notified of such event. + * + * This is expected to be provided to the {@link InlineContentView} so it can get updates + * from and send updates to the remote content (i.e. surface package) provider. + * + * @hide + */ + public interface SurfacePackageUpdater { + + /** + * Called when the previous surface package is released due to view being detached + * from the window. + */ + void onSurfacePackageReleased(); + + /** + * Called to request an updated surface package. + * + * @param consumer consumes the updated surface package. + */ + void getSurfacePackage(Consumer<SurfaceControlViewHost.SurfacePackage> consumer); + } + + @NonNull + private final SurfaceHolder.Callback mSurfaceCallback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(@NonNull SurfaceHolder holder) { mSurfaceControlCallback.onCreated(mSurfaceView.getSurfaceControl()); } @Override - public void surfaceChanged(@NonNull SurfaceHolder holder, - int format, int width, int height) { + public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, + int height) { /* do nothing */ } @@ -90,13 +121,17 @@ public class InlineContentView extends ViewGroup { } }; - private final @NonNull SurfaceView mSurfaceView; + @NonNull + private final SurfaceView mSurfaceView; + + @Nullable + private SurfaceControlCallback mSurfaceControlCallback; - private @Nullable SurfaceControlCallback mSurfaceControlCallback; + @Nullable + private SurfacePackageUpdater mSurfacePackageUpdater; /** * @inheritDoc - * * @hide */ public InlineContentView(@NonNull Context context) { @@ -105,7 +140,6 @@ public class InlineContentView extends ViewGroup { /** * @inheritDoc - * * @hide */ public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs) { @@ -114,7 +148,6 @@ public class InlineContentView extends ViewGroup { /** * @inheritDoc - * * @hide */ public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs, @@ -123,20 +156,18 @@ public class InlineContentView extends ViewGroup { } /** - * Gets the surface control. If the surface is not created this method - * returns {@code null}. + * Gets the surface control. If the surface is not created this method returns {@code null}. * * @return The surface control. - * * @see #setSurfaceControlCallback(SurfaceControlCallback) */ - public @Nullable SurfaceControl getSurfaceControl() { + @Nullable + public SurfaceControl getSurfaceControl() { return mSurfaceView.getSurfaceControl(); } /** * @inheritDoc - * * @hide */ public InlineContentView(@NonNull Context context, @Nullable AttributeSet attrs, @@ -149,14 +180,35 @@ public class InlineContentView extends ViewGroup { } /** - * Sets the embedded UI. - * @param surfacePackage The embedded UI. + * Sets the embedded UI provider. * * @hide */ - public void setChildSurfacePackage( - @Nullable SurfaceControlViewHost.SurfacePackage surfacePackage) { - mSurfaceView.setChildSurfacePackage(surfacePackage); + public void setChildSurfacePackageUpdater( + @Nullable SurfacePackageUpdater surfacePackageUpdater) { + mSurfacePackageUpdater = surfacePackageUpdater; + } + + @Override + protected void onAttachedToWindow() { + if (DEBUG) Log.v(TAG, "onAttachedToWindow"); + super.onAttachedToWindow(); + if (mSurfacePackageUpdater != null) { + mSurfacePackageUpdater.getSurfacePackage( + sp -> { + if (DEBUG) Log.v(TAG, "Received new SurfacePackage"); + mSurfaceView.setChildSurfacePackage(sp); + }); + } + } + + @Override + protected void onDetachedFromWindow() { + if (DEBUG) Log.v(TAG, "onDetachedFromWindow"); + super.onDetachedFromWindow(); + if (mSurfacePackageUpdater != null) { + mSurfacePackageUpdater.onSurfacePackageReleased(); + } } @Override @@ -165,8 +217,8 @@ public class InlineContentView extends ViewGroup { } /** - * Sets a callback to observe the lifecycle of the surface control for - * managing the backing surface. + * Sets a callback to observe the lifecycle of the surface control for managing the backing + * surface. * * @param callback The callback to set or {@code null} to clear. */ @@ -182,7 +234,6 @@ public class InlineContentView extends ViewGroup { /** * @return Whether the surface backing this view appears on top of its parent. - * * @see #setZOrderedOnTop(boolean) */ public boolean isZOrderedOnTop() { @@ -190,17 +241,15 @@ public class InlineContentView extends ViewGroup { } /** - * Controls whether the backing surface is placed on top of this view's window. - * Normally, it is placed on top of the window, to allow interaction - * with the inlined UI. Via this method, you can place the surface below the - * window. This means that all of the contents of the window this view is in - * will be visible on top of its surface. + * Controls whether the backing surface is placed on top of this view's window. Normally, it is + * placed on top of the window, to allow interaction with the inlined UI. Via this method, you + * can place the surface below the window. This means that all of the contents of the window + * this view is in will be visible on top of its surface. * * <p> The Z ordering can be changed dynamically if the backing surface is * created, otherwise the ordering would be applied at surface construction time. * * @param onTop Whether to show the surface on top of this view's window. - * * @see #isZOrderedOnTop() */ public boolean setZOrderedOnTop(boolean onTop) { diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java index be66d0c238cc..891d53527f96 100644 --- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java +++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java @@ -73,8 +73,11 @@ public class AccessibilityShortcutController { new ComponentName("com.android.server.accessibility", "ColorInversion"); public static final ComponentName DALTONIZER_COMPONENT_NAME = new ComponentName("com.android.server.accessibility", "Daltonizer"); + // TODO(b/147990389): Use MAGNIFICATION_COMPONENT_NAME to replace. public static final String MAGNIFICATION_CONTROLLER_NAME = "com.android.server.accessibility.MagnificationController"; + public static final ComponentName MAGNIFICATION_COMPONENT_NAME = + new ComponentName("com.android.server.accessibility", "Magnification"); private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java index 7c4df52d1495..7eb09e59601b 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java @@ -19,10 +19,14 @@ package com.android.internal.accessibility.dialog; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; +import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityButtonLongPressStatus; import android.annotation.Nullable; import android.app.Activity; +import android.content.ComponentName; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; @@ -87,6 +91,12 @@ public class AccessibilityButtonChooserActivity extends Activity { gridview.setAdapter(new ButtonTargetAdapter(mTargets)); gridview.setOnItemClickListener((parent, view, position, id) -> { final String key = Settings.Secure.ACCESSIBILITY_BUTTON_TARGET_COMPONENT; + String name = mTargets.get(position).getId(); + if (name.equals(MAGNIFICATION_CONTROLLER_NAME)) { + name = MAGNIFICATION_COMPONENT_NAME.flattenToString(); + } + final ComponentName componentName = ComponentName.unflattenFromString(name); + logAccessibilityButtonLongPressStatus(componentName); Settings.Secure.putString(getContentResolver(), key, mTargets.get(position).getId()); finish(); }); diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java new file mode 100644 index 000000000000..c2e1426bc4fe --- /dev/null +++ b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.accessibility.util; + +import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTTON; +import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY; + +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__DISABLED; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__ENABLED; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__UNKNOWN; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON_LONG_PRESS; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__TRIPLE_TAP; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__UNKNOWN_TYPE; +import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__VOLUME_KEY; + +import android.content.ComponentName; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityManager.ShortcutType; + +import com.android.internal.util.FrameworkStatsLog; + +/** Methods for logging accessibility states. */ +public final class AccessibilityStatsLogUtils { + private static final int UNKNOWN_STATUS = + ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__UNKNOWN; + + private AccessibilityStatsLogUtils() {} + + /** + * Logs accessibility feature name that is assigned to the shortcut also its shortcut type. + * Calls this when clicking the shortcut {@link AccessibilityManager#ACCESSIBILITY_BUTTON} or + * {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} + * + * @param componentName component name of the accessibility feature + * @param shortcutType accessibility shortcut type {@link ShortcutType} + */ + public static void logAccessibilityShortcutActivated(ComponentName componentName, + @ShortcutType int shortcutType) { + logAccessibilityShortcutActivated(componentName, shortcutType, UNKNOWN_STATUS); + } + + /** + * Logs accessibility feature name that is assigned to the shortcut also its shortcut type and + * enabled status. Calls this when clicking the shortcut + * {@link AccessibilityManager#ACCESSIBILITY_BUTTON} + * or {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} + * + * @param componentName component name of the accessibility feature + * @param shortcutType accessibility shortcut type + * @param serviceEnabled {@code true} if the service is enabled + */ + public static void logAccessibilityShortcutActivated(ComponentName componentName, + @ShortcutType int shortcutType, boolean serviceEnabled) { + logAccessibilityShortcutActivated(componentName, shortcutType, + convertToLoggingServiceStatus(serviceEnabled)); + } + + /** + * Logs accessibility feature name that is assigned to the shortcut also its shortcut type and + * status code. Calls this when clicking the shortcut + * {@link AccessibilityManager#ACCESSIBILITY_BUTTON} + * or {@link AccessibilityManager#ACCESSIBILITY_SHORTCUT_KEY} + * + * @param componentName component name of the accessibility feature + * @param shortcutType accessibility shortcut type {@link ShortcutType} + * @param serviceStatus The service status code. 0 denotes unknown_status, 1 denotes enabled, 2 + * denotes disabled. + */ + private static void logAccessibilityShortcutActivated(ComponentName componentName, + @ShortcutType int shortcutType, int serviceStatus) { + FrameworkStatsLog.write(FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED, + componentName.flattenToString(), convertToLoggingShortcutType(shortcutType), + serviceStatus); + } + + /** + * Logs magnification that is assigned to the triple tap shortcut. Calls this when triggering + * the magnification triple tap shortcut. + */ + public static void logMagnificationTripleTap(boolean enabled) { + FrameworkStatsLog.write(FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED, + MAGNIFICATION_COMPONENT_NAME.flattenToString(), + ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__TRIPLE_TAP, + convertToLoggingServiceStatus(enabled)); + } + + /** + * Logs accessibility feature name that is assigned to the long pressed accessibility button + * shortcut. Calls this when clicking the long pressed accessibility button shortcut. + * + * @param componentName The component name of the accessibility feature. + */ + public static void logAccessibilityButtonLongPressStatus(ComponentName componentName) { + FrameworkStatsLog.write(FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_REPORTED, + componentName.flattenToString(), + ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON_LONG_PRESS, + UNKNOWN_STATUS); + } + + private static int convertToLoggingShortcutType(@ShortcutType int shortcutType) { + switch (shortcutType) { + case ACCESSIBILITY_BUTTON: + return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON; + case ACCESSIBILITY_SHORTCUT_KEY: + return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__VOLUME_KEY; + } + return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__UNKNOWN_TYPE; + } + + private static int convertToLoggingServiceStatus(boolean enabled) { + return enabled ? ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__ENABLED + : ACCESSIBILITY_SHORTCUT_REPORTED__SERVICE_STATUS__DISABLED; + } +} diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 11ac3881ee38..3fc3f3e65d37 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -158,6 +158,7 @@ public class ChooserActivity extends ResolverActivity implements private static final String TAG = "ChooserActivity"; private AppPredictor mPersonalAppPredictor; private AppPredictor mWorkAppPredictor; + private boolean mShouldDisplayLandscape; @UnsupportedAppUsage public ChooserActivity() { @@ -716,6 +717,8 @@ public class ChooserActivity extends ResolverActivity implements mCallerChooserTargets = targets; } + mShouldDisplayLandscape = shouldDisplayLandscape( + getResources().getConfiguration().orientation); setRetainInOnStop(intent.getBooleanExtra(EXTRA_PRIVATE_RETAIN_IN_ON_STOP, false)); super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents, null, false); @@ -1073,6 +1076,7 @@ public class ChooserActivity extends ResolverActivity implements public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); + mShouldDisplayLandscape = shouldDisplayLandscape(newConfig.orientation); adjustPreviewWidth(newConfig.orientation, null); updateStickyContentPreview(); } @@ -1086,7 +1090,7 @@ public class ChooserActivity extends ResolverActivity implements private void adjustPreviewWidth(int orientation, View parent) { int width = -1; - if (shouldDisplayLandscape(orientation)) { + if (mShouldDisplayLandscape) { width = getResources().getDimensionPixelSize(R.dimen.chooser_preview_width); } @@ -2940,6 +2944,19 @@ public class ChooserActivity extends ResolverActivity implements .setSubtype(previewType)); } + class ViewHolderBase extends RecyclerView.ViewHolder { + private int mViewType; + + ViewHolderBase(View itemView, int viewType) { + super(itemView); + this.mViewType = viewType; + } + + int getViewType() { + return mViewType; + } + } + /** * Used to bind types of individual item including * {@link ChooserGridAdapter#VIEW_TYPE_NORMAL}, @@ -2947,12 +2964,12 @@ public class ChooserActivity extends ResolverActivity implements * {@link ChooserGridAdapter#VIEW_TYPE_PROFILE}, * and {@link ChooserGridAdapter#VIEW_TYPE_AZ_LABEL}. */ - final class ItemViewHolder extends RecyclerView.ViewHolder { + final class ItemViewHolder extends ViewHolderBase { ResolverListAdapter.ViewHolder mWrappedViewHolder; int mListPosition = ChooserListAdapter.NO_POSITION; - ItemViewHolder(View itemView, boolean isClickable) { - super(itemView); + ItemViewHolder(View itemView, boolean isClickable, int viewType) { + super(itemView, viewType); mWrappedViewHolder = new ResolverListAdapter.ViewHolder(itemView); if (isClickable) { itemView.setOnClickListener(v -> startSelected(mListPosition, @@ -2970,9 +2987,9 @@ public class ChooserActivity extends ResolverActivity implements /** * Add a footer to the list, to support scrolling behavior below the navbar. */ - final class FooterViewHolder extends RecyclerView.ViewHolder { - FooterViewHolder(View itemView) { - super(itemView); + final class FooterViewHolder extends ViewHolderBase { + FooterViewHolder(View itemView, int viewType) { + super(itemView, viewType); } } @@ -3083,7 +3100,7 @@ public class ChooserActivity extends ResolverActivity implements int getMaxTargetsPerRow() { int maxTargets = MAX_TARGETS_PER_ROW_PORTRAIT; - if (shouldDisplayLandscape(getResources().getConfiguration().orientation)) { + if (mShouldDisplayLandscape) { maxTargets = MAX_TARGETS_PER_ROW_LANDSCAPE; } return maxTargets; @@ -3191,13 +3208,14 @@ public class ChooserActivity extends ResolverActivity implements public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case VIEW_TYPE_CONTENT_PREVIEW: - return new ItemViewHolder(createContentPreviewView(parent), false); + return new ItemViewHolder(createContentPreviewView(parent), false, viewType); case VIEW_TYPE_PROFILE: - return new ItemViewHolder(createProfileView(parent), false); + return new ItemViewHolder(createProfileView(parent), false, viewType); case VIEW_TYPE_AZ_LABEL: - return new ItemViewHolder(createAzLabelView(parent), false); + return new ItemViewHolder(createAzLabelView(parent), false, viewType); case VIEW_TYPE_NORMAL: - return new ItemViewHolder(mChooserListAdapter.createView(parent), true); + return new ItemViewHolder( + mChooserListAdapter.createView(parent), true, viewType); case VIEW_TYPE_DIRECT_SHARE: case VIEW_TYPE_CALLER_AND_RANK: return createItemGroupViewHolder(viewType, parent); @@ -3205,7 +3223,7 @@ public class ChooserActivity extends ResolverActivity implements Space sp = new Space(parent.getContext()); sp.setLayoutParams(new RecyclerView.LayoutParams( LayoutParams.MATCH_PARENT, mFooterHeight)); - return new FooterViewHolder(sp); + return new FooterViewHolder(sp, viewType); default: // Since we catch all possible viewTypes above, no chance this is being called. return null; @@ -3214,7 +3232,7 @@ public class ChooserActivity extends ResolverActivity implements @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - int viewType = getItemViewType(position); + int viewType = ((ViewHolderBase) holder).getViewType(); switch (viewType) { case VIEW_TYPE_DIRECT_SHARE: case VIEW_TYPE_CALLER_AND_RANK: @@ -3325,7 +3343,6 @@ public class ChooserActivity extends ResolverActivity implements } viewGroup.setTag(holder); - return holder; } @@ -3352,14 +3369,15 @@ public class ChooserActivity extends ResolverActivity implements parentGroup.addView(row2); mDirectShareViewHolder = new DirectShareViewHolder(parentGroup, - Lists.newArrayList(row1, row2), getMaxTargetsPerRow()); + Lists.newArrayList(row1, row2), getMaxTargetsPerRow(), viewType); loadViewsIntoGroup(mDirectShareViewHolder); return mDirectShareViewHolder; } else { ViewGroup row = (ViewGroup) mLayoutInflater.inflate(R.layout.chooser_row, parent, false); - ItemGroupViewHolder holder = new SingleRowViewHolder(row, getMaxTargetsPerRow()); + ItemGroupViewHolder holder = + new SingleRowViewHolder(row, getMaxTargetsPerRow(), viewType); loadViewsIntoGroup(holder); return holder; @@ -3521,14 +3539,14 @@ public class ChooserActivity extends ResolverActivity implements * {@link ChooserGridAdapter#VIEW_TYPE_DIRECT_SHARE}, * and {@link ChooserGridAdapter#VIEW_TYPE_CALLER_AND_RANK}. */ - abstract class ItemGroupViewHolder extends RecyclerView.ViewHolder { + abstract class ItemGroupViewHolder extends ViewHolderBase { protected int mMeasuredRowHeight; private int[] mItemIndices; protected final View[] mCells; private final int mColumnCount; - ItemGroupViewHolder(int cellCount, View itemView) { - super(itemView); + ItemGroupViewHolder(int cellCount, View itemView, int viewType) { + super(itemView, viewType); this.mCells = new View[cellCount]; this.mItemIndices = new int[cellCount]; this.mColumnCount = cellCount; @@ -3574,8 +3592,8 @@ public class ChooserActivity extends ResolverActivity implements class SingleRowViewHolder extends ItemGroupViewHolder { private final ViewGroup mRow; - SingleRowViewHolder(ViewGroup row, int cellCount) { - super(cellCount, row); + SingleRowViewHolder(ViewGroup row, int cellCount, int viewType) { + super(cellCount, row, viewType); this.mRow = row; } @@ -3617,8 +3635,9 @@ public class ChooserActivity extends ResolverActivity implements private final boolean[] mCellVisibility; - DirectShareViewHolder(ViewGroup parent, List<ViewGroup> rows, int cellCountPerRow) { - super(rows.size() * cellCountPerRow, parent); + DirectShareViewHolder(ViewGroup parent, List<ViewGroup> rows, int cellCountPerRow, + int viewType) { + super(rows.size() * cellCountPerRow, parent, viewType); this.mParent = parent; this.mRows = rows; diff --git a/core/java/com/android/internal/app/ChooserGridLayoutManager.java b/core/java/com/android/internal/app/ChooserGridLayoutManager.java new file mode 100644 index 000000000000..317a987cf359 --- /dev/null +++ b/core/java/com/android/internal/app/ChooserGridLayoutManager.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.app; + +import android.content.Context; +import android.util.AttributeSet; + +import com.android.internal.widget.GridLayoutManager; +import com.android.internal.widget.RecyclerView; + +/** + * For a11y and per {@link RecyclerView#onInitializeAccessibilityNodeInfo}, override + * methods to ensure proper row counts. + */ +public class ChooserGridLayoutManager extends GridLayoutManager { + + /** + * Constructor used when layout manager is set in XML by RecyclerView attribute + * "layoutManager". If spanCount is not specified in the XML, it defaults to a + * single column. + * + */ + public ChooserGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + /** + * Creates a vertical GridLayoutManager + * + * @param context Current context, will be used to access resources. + * @param spanCount The number of columns in the grid + */ + public ChooserGridLayoutManager(Context context, int spanCount) { + super(context, spanCount); + } + + /** + * @param context Current context, will be used to access resources. + * @param spanCount The number of columns or rows in the grid + * @param orientation Layout orientation. Should be {@link #HORIZONTAL} or {@link + * #VERTICAL}. + * @param reverseLayout When set to true, layouts from end to start. + */ + public ChooserGridLayoutManager(Context context, int spanCount, int orientation, + boolean reverseLayout) { + super(context, spanCount, orientation, reverseLayout); + } + + @Override + public int getRowCountForAccessibility(RecyclerView.Recycler recycler, + RecyclerView.State state) { + // Do not count the footer view in the official count + return super.getRowCountForAccessibility(recycler, state) - 1; + } +} diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 2f62f8e7a0c9..83dabe8d0525 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -182,6 +182,8 @@ public class ResolverActivity extends Activity implements private BroadcastReceiver mWorkProfileStateReceiver; private UserHandle mHeaderCreatorUser; + private UserHandle mWorkProfileUserHandle; + /** * Get the string resource to be used as a label for the link to the resolver activity for an * action. @@ -363,6 +365,7 @@ public class ResolverActivity extends Activity implements // a more complicated UI that the current voice interaction flow is not able // to handle. boolean filterLastUsed = mSupportsAlwaysUseOption && !isVoiceInteraction(); + mWorkProfileUserHandle = fetchWorkProfileUserProfile(); mMultiProfilePagerAdapter = createMultiProfilePagerAdapter(initialIntents, rList, filterLastUsed); if (configureContentView()) { return; @@ -527,13 +530,18 @@ public class ResolverActivity extends Activity implements return UserHandle.of(ActivityManager.getCurrentUser()); } protected @Nullable UserHandle getWorkProfileUserHandle() { + return mWorkProfileUserHandle; + } + + protected @Nullable UserHandle fetchWorkProfileUserProfile() { + mWorkProfileUserHandle = null; UserManager userManager = getSystemService(UserManager.class); for (final UserInfo userInfo : userManager.getProfiles(ActivityManager.getCurrentUser())) { if (userInfo.isManagedProfile()) { - return userInfo.getUserHandle(); + mWorkProfileUserHandle = userInfo.getUserHandle(); } } - return null; + return mWorkProfileUserHandle; } private boolean hasWorkProfile() { diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 2fd938f45291..24bf98b6502c 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -54,6 +54,7 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; import com.android.internal.app.chooser.DisplayResolveInfo; +import com.android.internal.app.chooser.SelectableTargetInfo; import com.android.internal.app.chooser.TargetInfo; import java.util.ArrayList; @@ -549,6 +550,15 @@ public class ResolverListAdapter extends BaseAdapter { getLoadLabelTask((DisplayResolveInfo) info, holder).execute(); } else { holder.bindLabel(info.getDisplayLabel(), info.getExtendedInfo()); + if (info instanceof SelectableTargetInfo) { + // direct share targets should append the application name for a better readout + DisplayResolveInfo rInfo = ((SelectableTargetInfo) info).getDisplayResolveInfo(); + CharSequence appName = rInfo != null ? rInfo.getDisplayLabel() : ""; + CharSequence extendedInfo = info.getExtendedInfo(); + String contentDescription = String.join(" ", info.getDisplayLabel(), + extendedInfo != null ? extendedInfo : "", appName); + holder.updateContentDescription(contentDescription); + } } if (info.isSuspended()) { @@ -697,6 +707,12 @@ public class ResolverListAdapter extends BaseAdapter { text2.setVisibility(View.VISIBLE); text2.setText(subLabel); } + + itemView.setContentDescription(null); + } + + public void updateContentDescription(String description) { + itemView.setContentDescription(description); } } diff --git a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java index 246a07d3d0fe..900e18d468bb 100644 --- a/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java +++ b/core/java/com/android/internal/app/chooser/SelectableTargetInfo.java @@ -44,7 +44,6 @@ import com.android.internal.app.ResolverListAdapter.ActivityInfoPresentationGett import com.android.internal.app.SimpleIconFactory; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -136,6 +135,10 @@ public final class SelectableTargetInfo implements ChooserTargetInfo { return mIsSuspended; } + public DisplayResolveInfo getDisplayResolveInfo() { + return mSourceInfo; + } + private Drawable getChooserTargetIconDrawable(ChooserTarget target, @Nullable ShortcutInfo shortcutInfo) { Drawable directShareIcon = null; diff --git a/core/java/com/android/internal/infra/AbstractRemoteService.java b/core/java/com/android/internal/infra/AbstractRemoteService.java index 3900f1674c13..7195b45a4055 100644 --- a/core/java/com/android/internal/infra/AbstractRemoteService.java +++ b/core/java/com/android/internal/infra/AbstractRemoteService.java @@ -321,6 +321,20 @@ public abstract class AbstractRemoteService<S extends AbstractRemoteService<S, I obtainMessage(AbstractRemoteService::handlePendingRequest, this, asyncRequest)); } + /** + * Executes an async request immediately instead of sending it to Handler queue as what + * {@link scheduleAsyncRequest} does. + * + * <p>This request is not expecting a callback from the service, hence it's represented by + * a simple {@link Runnable}. + */ + protected void executeAsyncRequest(@NonNull AsyncRequest<I> request) { + // TODO(b/117779333): fix generics below + @SuppressWarnings({"unchecked", "rawtypes"}) + final MyAsyncPendingRequest<S, I> asyncRequest = new MyAsyncPendingRequest(this, request); + handlePendingRequest(asyncRequest); + } + private void cancelScheduledUnbind() { mHandler.removeMessages(MSG_UNBIND); } diff --git a/core/java/com/android/internal/policy/TaskResizingAlgorithm.java b/core/java/com/android/internal/policy/TaskResizingAlgorithm.java index 1fce098fb93e..1ec020696cf3 100644 --- a/core/java/com/android/internal/policy/TaskResizingAlgorithm.java +++ b/core/java/com/android/internal/policy/TaskResizingAlgorithm.java @@ -91,14 +91,14 @@ public class TaskResizingAlgorithm { int width = right - left; int height = bottom - top; if ((ctrlType & CTRL_LEFT) != 0) { - width = Math.max(minVisibleWidth, width - deltaX); + width = Math.max(minVisibleWidth, Math.min(width - deltaX, maxVisibleSize.x)); } else if ((ctrlType & CTRL_RIGHT) != 0) { - width = Math.max(minVisibleWidth, width + deltaX); + width = Math.max(minVisibleWidth, Math.min(width + deltaX, maxVisibleSize.x)); } if ((ctrlType & CTRL_TOP) != 0) { - height = Math.max(minVisibleHeight, height - deltaY); + height = Math.max(minVisibleHeight, Math.min(height - deltaY, maxVisibleSize.y)); } else if ((ctrlType & CTRL_BOTTOM) != 0) { - height = Math.max(minVisibleHeight, height + deltaY); + height = Math.max(minVisibleHeight, Math.min(height + deltaY, maxVisibleSize.y)); } // If we have to preserve the orientation - check that we are doing so. diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 38f5f3279c8e..8c5fdf5822e8 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -137,7 +137,7 @@ oneway interface IStatusBar // Used to show the authentication dialog (Biometrics, Device Credential) void showAuthenticationDialog(in Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId); + long operationId, int sysUiSessionId); // Used to notify the authentication dialog that a biometric has been authenticated void onBiometricAuthenticated(); // Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 24fe0638b091..c32082418bc5 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -106,7 +106,7 @@ interface IStatusBarService // Used to show the authentication dialog (Biometrics, Device Credential) void showAuthenticationDialog(in Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId); + long operationId, int sysUiSessionId); // Used to notify the authentication dialog that a biometric has been authenticated void onBiometricAuthenticated(); // Used to set a temporary message, e.g. fingerprint not recognized, finger moved too fast, etc diff --git a/core/java/com/android/internal/view/inline/IInlineContentProvider.aidl b/core/java/com/android/internal/view/inline/IInlineContentProvider.aidl index 08a349c21c8b..78df3eb660a5 100644 --- a/core/java/com/android/internal/view/inline/IInlineContentProvider.aidl +++ b/core/java/com/android/internal/view/inline/IInlineContentProvider.aidl @@ -24,4 +24,6 @@ import com.android.internal.view.inline.IInlineContentCallback; */ oneway interface IInlineContentProvider { void provideContent(int width, int height, in IInlineContentCallback callback); + void requestSurfacePackage(); + void onSurfacePackageReleased(); } diff --git a/core/java/com/android/internal/widget/GridLayoutManager.java b/core/java/com/android/internal/widget/GridLayoutManager.java index e0502f129f7f..09e6a991b1ac 100644 --- a/core/java/com/android/internal/widget/GridLayoutManager.java +++ b/core/java/com/android/internal/widget/GridLayoutManager.java @@ -153,13 +153,11 @@ public class GridLayoutManager extends LinearLayoutManager { if (mOrientation == HORIZONTAL) { info.setCollectionItemInfo(AccessibilityNodeInfo.CollectionItemInfo.obtain( glp.getSpanIndex(), glp.getSpanSize(), - spanGroupIndex, 1, - mSpanCount > 1 && glp.getSpanSize() == mSpanCount, false)); + spanGroupIndex, 1, false, false)); } else { // VERTICAL info.setCollectionItemInfo(AccessibilityNodeInfo.CollectionItemInfo.obtain( spanGroupIndex, 1, - glp.getSpanIndex(), glp.getSpanSize(), - mSpanCount > 1 && glp.getSpanSize() == mSpanCount, false)); + glp.getSpanIndex(), glp.getSpanSize(), false, false)); } } diff --git a/core/java/com/android/internal/widget/ResolverDrawerLayout.java b/core/java/com/android/internal/widget/ResolverDrawerLayout.java index fb2ecf3a478f..3f708f84750c 100644 --- a/core/java/com/android/internal/widget/ResolverDrawerLayout.java +++ b/core/java/com/android/internal/widget/ResolverDrawerLayout.java @@ -825,18 +825,6 @@ public class ResolverDrawerLayout extends ViewGroup { return true; } break; - case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: - case R.id.accessibilityActionScrollUp: - if (mCollapseOffset < mCollapsibleHeight) { - smoothScrollTo(mCollapsibleHeight, 0); - return true; - } else if ((mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight) - && isDismissable()) { - smoothScrollTo(mCollapsibleHeight + mUncollapsibleHeight, 0); - mDismissOnScrollerFinished = true; - return true; - } - break; case AccessibilityNodeInfo.ACTION_COLLAPSE: if (mCollapseOffset < mCollapsibleHeight) { smoothScrollTo(mCollapsibleHeight, 0); @@ -886,7 +874,6 @@ public class ResolverDrawerLayout extends ViewGroup { } if ((mCollapseOffset < mCollapsibleHeight + mUncollapsibleHeight) && ((mCollapseOffset < mCollapsibleHeight) || isDismissable())) { - info.addAction(AccessibilityAction.ACTION_SCROLL_BACKWARD); info.addAction(AccessibilityAction.ACTION_SCROLL_UP); info.setScrollable(true); } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index bd7bc4cf4ceb..5a66f4394ead 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -158,6 +158,7 @@ cc_library_shared { "android_hardware_camera2_legacy_LegacyCameraDevice.cpp", "android_hardware_camera2_legacy_PerfMeasurement.cpp", "android_hardware_camera2_DngCreator.cpp", + "android_hardware_display_DisplayManagerGlobal.cpp", "android_hardware_display_DisplayViewport.cpp", "android_hardware_HardwareBuffer.cpp", "android_hardware_SensorManager.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 6fcaddf34322..a420ba67868f 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -18,39 +18,37 @@ #define LOG_TAG "AndroidRuntime" #define LOG_NDEBUG 1 -#include <android_runtime/AndroidRuntime.h> - #include <android-base/macros.h> #include <android-base/properties.h> #include <android/graphics/jni_runtime.h> +#include <android_runtime/AndroidRuntime.h> +#include <assert.h> #include <binder/IBinder.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> -#include <utils/Log.h> -#include <utils/misc.h> -#include <utils/Trace.h> #include <binder/Parcel.h> -#include <utils/threads.h> +#include <bionic/malloc.h> #include <cutils/properties.h> -#include <server_configurable_flags/get_flags.h> - -#include "jni.h" +#include <dirent.h> +#include <dlfcn.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/JniInvocation.h> -#include "android_util_Binder.h" - -#include <stdio.h> +#include <server_configurable_flags/get_flags.h> #include <signal.h> +#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> -#include <signal.h> -#include <dirent.h> -#include <assert.h> -#include <bionic/malloc.h> +#include <utils/Log.h> +#include <utils/Trace.h> +#include <utils/misc.h> +#include <utils/threads.h> #include <string> #include <vector> +#include "android_util_Binder.h" +#include "jni.h" + using namespace android; using android::base::GetProperty; @@ -78,6 +76,7 @@ extern int register_android_hardware_camera2_CameraMetadata(JNIEnv *env); extern int register_android_hardware_camera2_legacy_LegacyCameraDevice(JNIEnv *env); extern int register_android_hardware_camera2_legacy_PerfMeasurement(JNIEnv *env); extern int register_android_hardware_camera2_DngCreator(JNIEnv *env); +extern int register_android_hardware_display_DisplayManagerGlobal(JNIEnv* env); extern int register_android_hardware_HardwareBuffer(JNIEnv *env); extern int register_android_hardware_SensorManager(JNIEnv *env); extern int register_android_hardware_SerialPort(JNIEnv *env); @@ -1519,6 +1518,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_hardware_camera2_legacy_LegacyCameraDevice), REG_JNI(register_android_hardware_camera2_legacy_PerfMeasurement), REG_JNI(register_android_hardware_camera2_DngCreator), + REG_JNI(register_android_hardware_display_DisplayManagerGlobal), REG_JNI(register_android_hardware_HardwareBuffer), REG_JNI(register_android_hardware_SensorManager), REG_JNI(register_android_hardware_SerialPort), diff --git a/core/jni/android_hardware_display_DisplayManagerGlobal.cpp b/core/jni/android_hardware_display_DisplayManagerGlobal.cpp new file mode 100644 index 000000000000..9f316714a55c --- /dev/null +++ b/core/jni/android_hardware_display_DisplayManagerGlobal.cpp @@ -0,0 +1,55 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "DisplayManagerGlobal-JNI" + +#include <nativehelper/JNIHelp.h> +#include <nativehelper/ScopedUtfChars.h> +#include <private/android/choreographer.h> + +#include <vector> + +#include "core_jni_helpers.h" + +using namespace android; + +namespace android { + +// Dispatches the current refresh rate for the default display to all +// choreographer instances +void android_hardware_display_DisplayManagerGlobal_signalNativeCallbacks(JNIEnv* env, jobject, + jfloat refreshRate) { + const constexpr int64_t kNanosPerSecond = 1000 * 1000 * 1000; + const nsecs_t vsyncPeriod = kNanosPerSecond / refreshRate; + + AChoreographer_signalRefreshRateCallbacks(vsyncPeriod); +} + +} // namespace android + +// ---------------------------------------------------------------------------- + +const char* const kClassPathName = "android/hardware/display/DisplayManagerGlobal"; + +static const JNINativeMethod gMethods[] = { + {"nSignalNativeCallbacks", "(F)V", + (void*)android_hardware_display_DisplayManagerGlobal_signalNativeCallbacks}, +}; + +int register_android_hardware_display_DisplayManagerGlobal(JNIEnv* env) { + AChoreographer_initJVM(env); + return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); +} diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index c5a45882ecea..22bb2102a6e1 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1149,6 +1149,21 @@ static constexpr size_t array_size(const T (&)[N]) { return N; } +static jintArray convertEncapsulationInfoFromNative(JNIEnv *env, uint32_t encapsulationInfo) { + std::vector<int> encapsulation; + // Ignore the first bit, which is ENCAPSULATION_.*_NONE, as an empty array + // should be returned if no encapsulation is supported. + encapsulationInfo >>= 1; + for (int bitPosition = 1; encapsulationInfo; encapsulationInfo >>= 1, bitPosition++) { + if (encapsulationInfo & 1) { + encapsulation.push_back(bitPosition); + } + } + jintArray result = env->NewIntArray(encapsulation.size()); + env->SetIntArrayRegion(result, 0, encapsulation.size(), (jint *)encapsulation.data()); + return result; +} + static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, const struct audio_port *nAudioPort) { @@ -1156,6 +1171,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, jintArray jSamplingRates = NULL; jintArray jChannelMasks = NULL; jintArray jChannelIndexMasks = NULL; + jintArray jEncapsulationModes = NULL; + jintArray jEncapsulationMetadataTypes = NULL; int* cFormats = NULL; jintArray jFormats = NULL; jobjectArray jGains = NULL; @@ -1316,11 +1333,16 @@ static jint convertAudioPortFromNative(JNIEnv *env, if (nAudioPort->type == AUDIO_PORT_TYPE_DEVICE) { ALOGV("convertAudioPortFromNative is a device %08x", nAudioPort->ext.device.type); jstring jAddress = env->NewStringUTF(nAudioPort->ext.device.address); - *jAudioPort = env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor, - jHandle, jDeviceName, - jSamplingRates, jChannelMasks, jChannelIndexMasks, - jFormats, jGains, - nAudioPort->ext.device.type, jAddress); + jEncapsulationModes = + convertEncapsulationInfoFromNative(env, nAudioPort->ext.device.encapsulation_modes); + jEncapsulationMetadataTypes = + convertEncapsulationInfoFromNative(env, + nAudioPort->ext.device + .encapsulation_metadata_types); + *jAudioPort = env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor, jHandle, + jDeviceName, jSamplingRates, jChannelMasks, jChannelIndexMasks, + jFormats, jGains, nAudioPort->ext.device.type, jAddress, + jEncapsulationModes, jEncapsulationMetadataTypes); env->DeleteLocalRef(jAddress); } else if (nAudioPort->type == AUDIO_PORT_TYPE_MIX) { ALOGV("convertAudioPortFromNative is a mix"); @@ -1362,6 +1384,12 @@ exit: if (jChannelIndexMasks != NULL) { env->DeleteLocalRef(jChannelIndexMasks); } + if (jEncapsulationModes != NULL) { + env->DeleteLocalRef(jEncapsulationModes); + } + if (jEncapsulationMetadataTypes != NULL) { + env->DeleteLocalRef(jEncapsulationMetadataTypes); + } if (cFormats != NULL) { delete[] cFormats; } @@ -2615,8 +2643,10 @@ int register_android_media_AudioSystem(JNIEnv *env) jclass audioDevicePortClass = FindClassOrDie(env, "android/media/AudioDevicePort"); gAudioDevicePortClass = MakeGlobalRefOrDie(env, audioDevicePortClass); - gAudioDevicePortCstor = GetMethodIDOrDie(env, audioDevicePortClass, "<init>", - "(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I[Landroid/media/AudioGain;ILjava/lang/String;)V"); + gAudioDevicePortCstor = + GetMethodIDOrDie(env, audioDevicePortClass, "<init>", + "(Landroid/media/AudioHandle;Ljava/lang/String;[I[I[I[I" + "[Landroid/media/AudioGain;ILjava/lang/String;[I[I)V"); // When access AudioPort as AudioDevicePort gAudioPortFields.mType = GetFieldIDOrDie(env, audioDevicePortClass, "mType", "I"); diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 3a5720fd8c4c..c5bc083dfabf 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -1552,8 +1552,8 @@ static void isolateJitProfile(JNIEnv* env, jobjectArray pkg_data_info_list, } } -static void BindMountStorageToLowerFs(const userid_t user_id, const char* dir_name, - const char* package, fail_fn_t fail_fn) { +static void BindMountStorageToLowerFs(const userid_t user_id, const uid_t uid, + const char* dir_name, const char* package, fail_fn_t fail_fn) { bool hasSdcardFs = IsFilesystemSupported("sdcardfs"); std::string source; @@ -1565,6 +1565,9 @@ static void BindMountStorageToLowerFs(const userid_t user_id, const char* dir_na } std::string target = StringPrintf("/storage/emulated/%d/%s/%s", user_id, dir_name, package); + // As the parent is mounted as tmpfs, we need to create the target dir here. + PrepareDirIfNotPresent(target, 0700, uid, uid, fail_fn); + if (access(source.c_str(), F_OK) != 0) { fail_fn(CREATE_ERROR("Error accessing %s: %s", source.c_str(), strerror(errno))); } @@ -1574,9 +1577,8 @@ static void BindMountStorageToLowerFs(const userid_t user_id, const char* dir_na BindMount(source, target, fail_fn); } -// Bind mount all obb & data directories that are visible to this app. -// If app data isolation is not enabled for this process, bind mount the whole obb -// and data directory instead. +// Mount tmpfs on Android/data and Android/obb, then bind mount all app visible package +// directories in data and obb directories. static void BindMountStorageDirs(JNIEnv* env, jobjectArray pkg_data_info_list, uid_t uid, const char* process_name, jstring managed_nice_name, fail_fn_t fail_fn) { @@ -1590,12 +1592,18 @@ static void BindMountStorageDirs(JNIEnv* env, jobjectArray pkg_data_info_list, fail_fn(CREATE_ERROR("Data package list cannot be empty")); } + // Create tmpfs on Android/obb and Android/data so these 2 dirs won't enter fuse anymore. + std::string androidObbDir = StringPrintf("/storage/emulated/%d/Android/obb", user_id); + MountAppDataTmpFs(androidObbDir, fail_fn); + std::string androidDataDir = StringPrintf("/storage/emulated/%d/Android/data", user_id); + MountAppDataTmpFs(androidDataDir, fail_fn); + // Bind mount each package obb directory for (int i = 0; i < size; i += 3) { jstring package_str = (jstring) (env->GetObjectArrayElement(pkg_data_info_list, i)); std::string packageName = extract_fn(package_str).value(); - BindMountStorageToLowerFs(user_id, "Android/obb", packageName.c_str(), fail_fn); - BindMountStorageToLowerFs(user_id, "Android/data", packageName.c_str(), fail_fn); + BindMountStorageToLowerFs(user_id, uid, "Android/obb", packageName.c_str(), fail_fn); + BindMountStorageToLowerFs(user_id, uid, "Android/data", packageName.c_str(), fail_fn); } } @@ -1648,9 +1656,10 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, uid, process_name, managed_nice_name, fail_fn); isolateJitProfile(env, pkg_data_info_list, uid, process_name, managed_nice_name, fail_fn); } - if (mount_external != MOUNT_EXTERNAL_INSTALLER && - mount_external != MOUNT_EXTERNAL_PASS_THROUGH && - mount_storage_dirs) { + // MOUNT_EXTERNAL_INSTALLER, MOUNT_EXTERNAL_PASS_THROUGH, MOUNT_EXTERNAL_ANDROID_WRITABLE apps + // will have mount_storage_dirs == false here (set by ProcessList.needsStorageDataIsolation()), + // and hence they won't bind mount storage dirs. + if (mount_storage_dirs) { BindMountStorageDirs(env, pkg_data_info_list, uid, process_name, managed_nice_name, fail_fn); } diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h index 235127266926..d86d9340e667 100644 --- a/core/jni/include/android_runtime/AndroidRuntime.h +++ b/core/jni/include/android_runtime/AndroidRuntime.h @@ -19,15 +19,14 @@ #ifndef _RUNTIME_ANDROID_RUNTIME_H #define _RUNTIME_ANDROID_RUNTIME_H -#include <utils/Errors.h> #include <binder/IBinder.h> -#include <utils/String8.h> +#include <jni.h> +#include <pthread.h> +#include <utils/Errors.h> #include <utils/String16.h> +#include <utils/String8.h> #include <utils/Vector.h> #include <utils/threads.h> -#include <pthread.h> -#include <jni.h> - namespace android { @@ -154,6 +153,6 @@ private: static int javaThreadShell(void* args); }; -} +} // namespace android #endif diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index d5384a1c2fdd..762895b6320f 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -169,6 +169,7 @@ message GlobalSettingsProto { optional SettingProto boot_count = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto bugreport_in_power_menu = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto cached_apps_freezer_enabled = 152 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto call_auto_retry = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; message CaptivePortal { @@ -1059,5 +1060,5 @@ message GlobalSettingsProto { // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 152; + // Next tag = 153; } diff --git a/core/proto/android/server/usagestatsservice.proto b/core/proto/android/server/usagestatsservice.proto index f26eefad24e1..e32c07f50ff2 100644 --- a/core/proto/android/server/usagestatsservice.proto +++ b/core/proto/android/server/usagestatsservice.proto @@ -93,6 +93,8 @@ message IntervalStatsProto { optional int32 task_root_package_index = 15; // task_root_class_index contains the index + 1 of the task root class name in the string pool optional int32 task_root_class_index = 16; + // locus_id_index contains the index + 1 of the locus id in the string pool + optional int32 locus_id_index = 17; } // The following fields contain supplemental data used to build IntervalStats, such as a string diff --git a/core/res/res/anim/dream_activity_close_exit.xml b/core/res/res/anim/dream_activity_close_exit.xml new file mode 100644 index 000000000000..c4599dad31a0 --- /dev/null +++ b/core/res/res/anim/dream_activity_close_exit.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2020, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<alpha xmlns:android="http://schemas.android.com/apk/res/android" + android:fromAlpha="1.0" + android:toAlpha="0.0" + android:duration="100" /> + diff --git a/core/res/res/anim/dream_activity_open_enter.xml b/core/res/res/anim/dream_activity_open_enter.xml new file mode 100644 index 000000000000..9e1c6e2ee0d7 --- /dev/null +++ b/core/res/res/anim/dream_activity_open_enter.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2020, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- During this animation we keep the previous activity on the screen +using a noop animation for it (dream_activity_open_exit). The duration of +those two has to be the same. --> +<alpha xmlns:android="http://schemas.android.com/apk/res/android" + android:fromAlpha="0.0" + android:toAlpha="1.0" + android:duration="1000" /> + diff --git a/core/res/res/anim/dream_activity_open_exit.xml b/core/res/res/anim/dream_activity_open_exit.xml new file mode 100644 index 000000000000..740f52856b7f --- /dev/null +++ b/core/res/res/anim/dream_activity_open_exit.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2020, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- A noop animation to keep the previous activity alive during the dream +enter animation. The duration should match the duration of the +dream_activity_open_enter animation. --> +<alpha xmlns:android="http://schemas.android.com/apk/res/android" + android:fromAlpha="1.0" + android:toAlpha="1.0" + android:duration="1000" /> diff --git a/core/res/res/layout/chooser_list_per_profile.xml b/core/res/res/layout/chooser_list_per_profile.xml index 6b1b002267cb..86dc71cbbfb8 100644 --- a/core/res/res/layout/chooser_list_per_profile.xml +++ b/core/res/res/layout/chooser_list_per_profile.xml @@ -20,7 +20,7 @@ <com.android.internal.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" - android:layoutManager="com.android.internal.widget.GridLayoutManager" + android:layoutManager="com.android.internal.app.ChooserGridLayoutManager" android:id="@+id/resolver_list" android:clipToPadding="false" android:background="?attr/colorBackgroundFloating" @@ -29,4 +29,4 @@ android:nestedScrollingEnabled="true" /> <include layout="@layout/resolver_empty_states" /> -</RelativeLayout>
\ No newline at end of file +</RelativeLayout> diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml index 4d0837f495df..446ce3fbaf4b 100644 --- a/core/res/res/layout/resolver_list.xml +++ b/core/res/res/layout/resolver_list.xml @@ -83,6 +83,7 @@ android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" + android:accessibilityTraversalAfter="@id/title" android:background="?attr/colorBackgroundFloating"> <LinearLayout android:orientation="vertical" diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index a1a84ae16ebf..787f519ed199 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kragdialoog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sluitskerm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skermkiekie"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Toeganklikheidkortpad op skerm"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Toeganklikheidkortpadkieser op skerm"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Toeganklikheidkortpad"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> se onderskrifbalk."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID-ontsluiting suksesvol."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-ontsluiting suksesvol."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Netwerksubstel se diensverskafferontsluiting suksesvol."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a32e6919f0be..425a47fe53ed 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"የኃይል መገናኛ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"የማያ ገጽ ቁልፍ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገጽ እይታ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"የማያ ገጽ ላይ ተደራሽነት አቋራጭ መራጭ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"የተደራሽነት አቋራጭ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"የ<xliff:g id="APP_NAME">%1$s</xliff:g> የሥዕል ገላጭ ጽሑፍ አሞሌ።"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"የICCID መክፈቻ ስኬታማ ነበረ።"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"የIMPI መክፈቻ ስኬታማ ነበረ።"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"የአውታረ መረብ ንኡስ ስብስብ አገልግሎት አቅራቢ መክፈቻ ስኬታማ ነበረ።"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 4faac2ad1de4..06af5325f82b 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -2016,7 +2016,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"التطبيق <xliff:g id="APP_NAME_0">%1$s</xliff:g> غير متاح الآن، وهو مُدار بواسطة <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"مزيد من المعلومات"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"استئناف تشغيل التطبيق"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"تفعيل الملف الشخصي للعمل؟"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"هل تريد تفعيل الملف الشخصي للعمل؟"</string> <string name="work_mode_off_message" msgid="8417484421098563803">"سيتم تفعيل تطبيقات العمل التي تستخدمها والإشعارات والبيانات وغيرها من ميزات الملف الشخصي للعمل"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"تفعيل"</string> <string name="app_blocked_title" msgid="7353262160455028160">"التطبيق غير متاح"</string> @@ -2178,12 +2178,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"مربّع حوار الطاقة"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"شاشة القفل"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"لقطة شاشة"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"اختصار أدوات تمكين الوصول على الشاشة"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"أداة اختيار اختصارات أدوات تمكين الوصول على الشاشة"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"اختصارات أدوات تمكين الوصول"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"شريط الشرح لتطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2317,4 +2314,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"تم إلغاء قفل ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"تم إلغاء قفل IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"تم إلغاء قفل مقدم خدمة المجموعة الفرعية للشبكة."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index b56470759107..a78e08ad2adf 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাৱাৰ ডায়লগ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্ৰীন"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্ৰীণশ্বট"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"স্ক্ৰীনত সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"স্ক্ৰীনত সাধ্য সুবিধাসমূহৰ শ্বৰ্টকাট বাছনি কৰাৰ সুবিধা"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"সাধ্য সুবিধাৰ শ্বৰ্টকাট"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ কেপশ্বন বাৰ।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID আনলক কৰাৰ অনুৰোধ সফল হ\'ল।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI আনলক কৰাটো সফল হ\'ল।"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"নেটৱৰ্ক ছাবছেট সেৱা প্ৰদানকাৰীক আনলক কৰাটো সফল হ\'ল।"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 0f0c717a3cf8..06b40101a0be 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Yandırıb-söndürmə dialoqu"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilid Ekranı"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran şəkli"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda Əlçatımlılıq Qısayolu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda Əlçatımlılıq Qısayolu Seçicisi"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Əlçatımlılıq Qısayolu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> başlıq paneli."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID kilidaçması uğurlu oldu."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI kilidaçması uğurlu oldu."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Şəbəkə alt dəstinin xidmət provayderi kilidaçması uğurlu oldu."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 61342ac63767..0f282224b830 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -2076,12 +2076,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključani ekran"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alatka za biranje prečica za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka sa naslovima aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2215,4 +2212,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Otključavanje ICCID-a je uspelo."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Otključavanje IMPI-ja je uspelo."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Zahtev za otključavanje dobavljača usluge podskupa mreže je uspeo."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0fc6572ec98f..e22fceea49b5 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дыялогавае акно сілкавання"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Экран блакіроўкі"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Здымак экрана"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Хуткі доступ да спецыяльных магчымасцей на экране"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Налада хуткага доступу да спецыяльных магчымасцей на экране"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хуткі доступ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Панэль субцітраў праграмы \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Разблакіроўка ICCID выканана."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Разблакіроўка IMPI выканана."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Паслугі аператара падмноства сеткі разблакіраваны."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 579c80d5c206..105c3ea977d6 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалогов прозорец за захранването"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заключен екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Екранна снимка"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пряк път към достъпността на екрана"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Инструмент за избор на пряк път към достъпността на екрана"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пряк път за достъпност"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Лента за надписи на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Отключването на ICCID бе успешно."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Отключването на IMPI бе успешно."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Отключването на доставчика на услуги за подмножеството от мрежи бе успешно."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 0505a3ecd840..8c7270beaa36 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1888,8 +1888,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> এখন উপলভ্য নয়। এই অ্যাপটিকে <xliff:g id="APP_NAME_1">%2$s</xliff:g> অ্যাপ ম্যানেজ করে।"</string> <string name="app_suspended_more_details" msgid="211260942831587014">"আরও জানুন"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"অ্যাপ আবার চালু করুন"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"কাজের প্রোফাইল চালু করবেন?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"আপনার কাজের অ্যাপ, বিজ্ঞপ্তি, ডেটা এবং কাজের প্রোফাইলের অন্যান্য বৈশিষ্ট্য চালু করা হবে"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"অফিস প্রোফাইল চালু করবেন?"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"আপনার অফিস অ্যাপ, বিজ্ঞপ্তি, ডেটা এবং অফিস প্রোফাইলের অন্যান্য বৈশিষ্ট্য চালু করা হবে"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"চালু করুন"</string> <string name="app_blocked_title" msgid="7353262160455028160">"অ্যাপ পাওয়া যাচ্ছে না"</string> <string name="app_blocked_message" msgid="542972921087873023">"এই মুহূর্তে <xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপ পাওয়া যাচ্ছে না।"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"পাওয়ার ডায়লগ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"লক স্ক্রিন"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"স্ক্রিনশট"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"অন-স্ক্রিন অ্যাক্সেসিবিলিটি শর্টকাট বেছে নেওয়ার বিকল্প"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"অ্যাক্সেসিবিলিটি শর্টকাট"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর ক্যাপশন বার।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID আনলক করা হয়েছে।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI আনলক করা হয়েছে।"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"নেটওয়ার্ক সাবসেট পরিষেবা প্রদানকারী আনলক করা হয়েছে।"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 23b3cc0f95c6..04116a96c192 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2078,12 +2078,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijaloški okvir za napajanje"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključavanje ekrana"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimak ekrana"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečica za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Okvir za odabir prečice za pristupačnost na ekranu"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečica za pristupačnost"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka za natpis aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2217,4 +2214,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Otključavanje ICCID-a je uspjelo."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Otključavanje IMPI-ja je uspjelo."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Otključavanje mrežne podgrupe pružaoca usluge je uspjelo."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 23863a50526c..347633f0d804 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quadre de diàleg d\'engegada"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueig"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Drecera d\'accessibilitat en pantalla"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de dreceres d\'accessibilitat en pantalla"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Drecera d\'accessibilitat"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de títol de l\'aplicació <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"L\'ICCID s\'ha desbloquejat correctament."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"L\'IMPI s\'ha desbloquejat correctament."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"El proveïdor de serveis del subconjunt de la xarxa s\'ha desbloquejat correctament."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 03f36913ddbb..7e70874f817b 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogové okno k napájení"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Obrazovka uzamčení"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímek obrazovky"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zkratka přístupnosti na obrazovce"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výběr zkratky přístupnosti na obrazovce"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Zkratka přístupnosti"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popisek aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Odemknutí čísla ICCID proběhlo úspěšně."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Odemknutí identity IMPI proběhlo úspěšně."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Odblokování poskytovatelů služeb pro podskupinu sítí proběhlo úspěšně."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 916565f9312a..e140cd408dc0 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks om strøm"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskærm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Genvej til hjælpefunktioner på skærmen"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valg af genvej til hjælpefunktioner på skærmen"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Genvej til hjælpefunktioner"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Titellinje for <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID blev låst op."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI blev låst op."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Tjenesteudbyderens netværksdelmængde blev låst op."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index e5c269ec8fa4..d94ccc041bde 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kleines Fenster für Akkustand"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Sperrbildschirm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Kurzbefehl für Bildschirmbedienungshilfen"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Auswahl für Kurzbefehle für Bildschirmbedienungshilfen"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Kurzbefehl für Bedienungshilfen"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Untertitelleiste von <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID-Entsperrung war erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-Entsperrung war erfolgreich."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Entsperrung des subnetz- und mobilfunkanbietergebundenen Geräts war erfolgreich."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 6a2ceb3cb8d5..685a0f0c5ae5 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Παράθυρο διαλόγου λειτουργίας συσκευής"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Οθόνη κλειδώματος"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Στιγμιότυπο οθόνης"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Συντόμευση οθόνης για την προσβασιμότητα"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Επιλογέας συντόμευσης οθόνης για την προσβασιμότητα"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Συντόμευση προσβασιμότητας"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Γραμμή υποτίτλων για την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Επιτυχία ξεκλειδώματος ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Επιτυχία ξεκλειδώματος IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Επιτυχία ξεκλειδώματος παρόχου υπηρεσιών υποσυνόλου δικτύου."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9020dae6b280..2c9e0ef1135c 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID unlock successful."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI unlock successful."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider unlock successful."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 51397c720f2e..5a17123c673f 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID unlock successful."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI unlock successful."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider unlock successful."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9020dae6b280..2c9e0ef1135c 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID unlock successful."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI unlock successful."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider unlock successful."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 9020dae6b280..2c9e0ef1135c 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialogue"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"On-screen accessibility shortcut"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"On-screen accessibility shortcut chooser"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Accessibility shortcut"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar of <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID unlock successful."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI unlock successful."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider unlock successful."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 9787079c5e23..dab5009c86eb 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -2178,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID unlock successful."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI unlock successful."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider unlock successful."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index a7a053405742..64d8d31a960c 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"Más información"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Reanudar app"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"¿Activar el perfil de trabajo?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Se activaran las apps de trabajo, los datos, las notificaciones y otras funciones del perfil de trabajo"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Se activarán las apps de trabajo, los datos, las notificaciones y otras funciones del perfil de trabajo"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Activar"</string> <string name="app_blocked_title" msgid="7353262160455028160">"La app no está disponible"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> no está disponible en este momento."</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Diálogo de encendido"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear pantalla"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector del acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el depósito RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Se desbloqueó correctamente el dispositivo para ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Se desbloqueó correctamente el dispositivo para IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Se desbloqueó correctamente el dispositivo para el proveedor de servicios del subconjunto de redes."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a3a9f78b383b..f19b65d3fa01 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Abrir cuadro de diálogo"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Menú de acceso directo de accesibilidad en pantalla"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Acceso directo de accesibilidad"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Desbloqueo de ICCID correcto."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Desbloqueo de IMPI correcto."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Desbloqueo del proveedor de servicios de subconjunto de red correcto."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index ddb89afaa7c9..0d2cdeab50c8 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Energiasäästja dialoog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukustuskuva"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekraanipilt"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekraanil kuvatav juurdepääsetavuse otsetee"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekraanil kuvatav juurdepääsetavuse otsetee valija"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Juurdepääsetavuse otsetee"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> pealkirjariba."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID avamine õnnestus."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI avamine õnnestus."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Võrgu alamhulga teenusepakkuja avamise PIN-kood."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 26bbaa57b193..0a96862ff373 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Piztu edo itzaltzeko leihoa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantaila blokeatua"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pantaila-argazkia"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pantailako erabilerraztasun-lasterbidea"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pantailako erabilerraztasun-lasterbideen hautatzailea"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Erabilerraztasun-lasterbidea"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioko azpitituluen barra."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Desblokeatu da ICCIDaren bidez."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Desblokeatu da IMPIaren bidez."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Desblokeatu da sareko azpimultzoaren zerbitzu-hornitzailearen bidez."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index f77d015b0892..c77fd56cef1e 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -703,7 +703,7 @@ <string-array name="phoneTypes"> <item msgid="8996339953292723951">"خانه"</item> <item msgid="7740243458912727194">"تلفن همراه"</item> - <item msgid="8526146065496663766">"محل کار"</item> + <item msgid="8526146065496663766">"کاری"</item> <item msgid="8150904584178569699">"نمابر محل کار"</item> <item msgid="4537253139152229577">"نمابر خانه"</item> <item msgid="6751245029698664340">"پیجو"</item> @@ -712,7 +712,7 @@ </string-array> <string-array name="emailAddressTypes"> <item msgid="7786349763648997741">"خانه"</item> - <item msgid="435564470865989199">"محل کار"</item> + <item msgid="435564470865989199">"کاری"</item> <item msgid="4199433197875490373">"سایر موارد"</item> <item msgid="3233938986670468328">"سفارشی"</item> </string-array> @@ -724,7 +724,7 @@ </string-array> <string-array name="imAddressTypes"> <item msgid="588088543406993772">"خانه"</item> - <item msgid="5503060422020476757">"محل کار"</item> + <item msgid="5503060422020476757">"کاری"</item> <item msgid="2530391194653760297">"سایر موارد"</item> <item msgid="7640927178025203330">"سفارشی"</item> </string-array> @@ -746,7 +746,7 @@ <string name="phoneTypeCustom" msgid="5120365721260686814">"سفارشی"</string> <string name="phoneTypeHome" msgid="3880132427643623588">"خانه"</string> <string name="phoneTypeMobile" msgid="1178852541462086735">"تلفن همراه"</string> - <string name="phoneTypeWork" msgid="6604967163358864607">"محل کار"</string> + <string name="phoneTypeWork" msgid="6604967163358864607">"کاری"</string> <string name="phoneTypeFaxWork" msgid="6757519896109439123">"نمابر محل کار"</string> <string name="phoneTypeFaxHome" msgid="6678559953115904345">"نمابر خانه"</string> <string name="phoneTypePager" msgid="576402072263522767">"پیجو"</string> @@ -761,7 +761,7 @@ <string name="phoneTypeTelex" msgid="2558783611711876562">"تلکس"</string> <string name="phoneTypeTtyTdd" msgid="532038552105328779">"TTY TDD"</string> <string name="phoneTypeWorkMobile" msgid="7522314392003565121">"تلفن همراه محل کار"</string> - <string name="phoneTypeWorkPager" msgid="3748332310638505234">"پیجوی محل کار"</string> + <string name="phoneTypeWorkPager" msgid="3748332310638505234">"پیجوی کاری"</string> <string name="phoneTypeAssistant" msgid="757550783842231039">"دستیار"</string> <string name="phoneTypeMms" msgid="1799747455131365989">"فراپیام"</string> <string name="eventTypeCustom" msgid="3257367158986466481">"سفارشی"</string> @@ -770,7 +770,7 @@ <string name="eventTypeOther" msgid="530671238533887997">"سایر موارد"</string> <string name="emailTypeCustom" msgid="1809435350482181786">"سفارشی"</string> <string name="emailTypeHome" msgid="1597116303154775999">"خانه"</string> - <string name="emailTypeWork" msgid="2020095414401882111">"محل کار"</string> + <string name="emailTypeWork" msgid="2020095414401882111">"کاری"</string> <string name="emailTypeOther" msgid="5131130857030897465">"سایر موارد"</string> <string name="emailTypeMobile" msgid="787155077375364230">"تلفن همراه"</string> <string name="postalTypeCustom" msgid="5645590470242939129">"سفارشی"</string> @@ -791,7 +791,7 @@ <string name="imProtocolIcq" msgid="2410325380427389521">"ICQ"</string> <string name="imProtocolJabber" msgid="7919269388889582015">"Jabber"</string> <string name="imProtocolNetMeeting" msgid="4985002408136148256">"NetMeeting"</string> - <string name="orgTypeWork" msgid="8684458700669564172">"محل کار"</string> + <string name="orgTypeWork" msgid="8684458700669564172">"کاری"</string> <string name="orgTypeOther" msgid="5450675258408005553">"سایر موارد"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"سفارشی"</string> <string name="relationTypeCustom" msgid="282938315217441351">"سفارشی"</string> @@ -1148,7 +1148,7 @@ <string name="whichImageCaptureApplication" msgid="2737413019463215284">"تصویربرداری با"</string> <string name="whichImageCaptureApplicationNamed" msgid="8820702441847612202">"تصویربرداری با %1$s"</string> <string name="whichImageCaptureApplicationLabel" msgid="6505433734824988277">"تصویربرداری"</string> - <string name="alwaysUse" msgid="3153558199076112903">"استفاده به صورت پیشفرض برای این عملکرد."</string> + <string name="alwaysUse" msgid="3153558199076112903">"استفاده بهصورت پیشفرض برای این عملکرد."</string> <string name="use_a_different_app" msgid="4987790276170972776">"استتفاده از یک برنامه دیگر"</string> <string name="clearDefaultHintMsg" msgid="1325866337702524936">"پیشفرض را در تنظیمات سیستم> برنامهها> مورد بارگیری شده پاک کنید."</string> <string name="chooseActivity" msgid="8563390197659779956">"انتخاب عملکرد"</string> @@ -1427,7 +1427,7 @@ <string name="vpn_text_long" msgid="278540576806169831">"به <xliff:g id="SESSION">%s</xliff:g> متصل شد. برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"در حال اتصال VPN همیشه فعال…"</string> <string name="vpn_lockdown_connected" msgid="2853127976590658469">"VPN همیشه فعال متصل شد"</string> - <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"ارتباط VPN همیشه روشن قطع شد"</string> + <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"از «VPN همیشه روشن» قطع شد"</string> <string name="vpn_lockdown_error" msgid="4453048646854247947">"به «VPN همیشه روشن» متصل نشد"</string> <string name="vpn_lockdown_config" msgid="8331697329868252169">"تغییر شبکه یا تنظیمات VPN"</string> <string name="upload_file" msgid="8651942222301634271">"انتخاب فایل"</string> @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"بیشتر بدانید"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"لغو توقف موقت برنامه"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"نمایه کاری روشن شود؟"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"برنامهها، اعلانها، دادهها و سایر قابلیتهای نمایه کاری شما روشن خواهد شد"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"برنامهها، اعلانها، دادهها، و سایر ویژگیهای نمایه کاری شما روشن خواهد شد"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"روشن کردن"</string> <string name="app_blocked_title" msgid="7353262160455028160">"برنامه در دسترس نیست"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> درحالحاضر در دسترس نیست."</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"کادر گفتگوی روشن/خاموش"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"صفحه قفل"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"نماگرفت"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"میانبر دسترسپذیری روی صفحه"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"انتخابگر میانبر دسترسپذیری روی صفحه"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"میانبر دسترسیپذیری"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"نوار شرح <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"قفل ICCID باز شد."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"قفل IMPI باز شد."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"قفل ارائهدهنده خدمات زیرمجموعه شبکه باز شد."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 9f50d775c693..f7f2e94596c5 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Virran valintaikkuna"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lukitusnäyttö"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Kuvakaappaus"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Näytöllä näkyvä esteettömyyspainike"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Näytöllä näkyvän esteettömyyspainikkeen valitsin"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Esteettömyyspainike"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstityspalkki: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID:n lukituksen avaaminen onnistui."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI:n lukituksen avaaminen onnistui."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Verkon alijoukon palveluntarjoajan lukituksen avaaminen onnistui."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 2a9de6638c11..f1a9b7a42ac8 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue sur l\'alimentation"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Écran de verrouillage"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Sélecteur de raccourci d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Déverrouillage ICCID effectué."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Déverrouillage IMPI effectué."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Déverrouillage du sous-ensemble du réseau du fournisseur de services effectué."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 224dcfeb9855..8e3440efd70b 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1888,7 +1888,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"L\'application <xliff:g id="APP_NAME_0">%1$s</xliff:g> n\'est pas disponible pour le moment. Cette suspension est gérée par l\'application <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"En savoir plus"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Débloquer l\'application"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"Activer profil professionnel ?"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"Activer le profil pro. ?"</string> <string name="work_mode_off_message" msgid="8417484421098563803">"Vos applications professionnelles, notifications, données et d\'autres fonctionnalités de votre profil professionnel seront activées"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Activer"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Application non disponible"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue Marche/Arrêt"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Verrouiller l\'écran"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Raccourci d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Outil de sélection des raccourcis d\'accessibilité à l\'écran"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Raccourci d\'accessibilité"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barre de légende de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Déblocage ICCID effectué."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Déblocage IMPI effectué."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Déblocage du sous-réseau du fournisseur de services effectué."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index cfd555a21c9a..29183d02d2e6 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1047,8 +1047,8 @@ <item quantity="one">en <xliff:g id="COUNT_0">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344"> - <item quantity="other">hai <xliff:g id="COUNT_1">%d</xliff:g> minutos</item> - <item quantity="one">hai <xliff:g id="COUNT_0">%d</xliff:g> minuto</item> + <item quantity="other">Hai <xliff:g id="COUNT_1">%d</xliff:g> minutos</item> + <item quantity="one">Hai <xliff:g id="COUNT_0">%d</xliff:g> minuto</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019"> <item quantity="other">hai <xliff:g id="COUNT_1">%d</xliff:g> horas</item> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Cadro de diálogo de acendido/apagado"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Pantalla de bloqueo"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de pantalla"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atallo de accesibilidade en pantalla"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de atallos de accesibilidade en pantalla"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atallo de accesibilidade"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de subtítulos de <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"O desbloqueo do ICCID realizouse correctamente."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"O desbloqueo da IMPI realizouse correctamente."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"O desbloqueo do fornecedor de servizo do subconxunto da rede realizouse correctamente."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index cf7afb5e9e9c..f8b03b32f71f 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -703,7 +703,7 @@ <string-array name="phoneTypes"> <item msgid="8996339953292723951">"ઘર"</item> <item msgid="7740243458912727194">"મોબાઇલ"</item> - <item msgid="8526146065496663766">"કાર્યાલય"</item> + <item msgid="8526146065496663766">"ઑફિસ"</item> <item msgid="8150904584178569699">"કાર્ય ફૅક્સ"</item> <item msgid="4537253139152229577">"ઘરનો ફૅક્સ"</item> <item msgid="6751245029698664340">"પેજર"</item> @@ -712,24 +712,24 @@ </string-array> <string-array name="emailAddressTypes"> <item msgid="7786349763648997741">"હોમ"</item> - <item msgid="435564470865989199">"કાર્યાલય"</item> + <item msgid="435564470865989199">"ઑફિસ"</item> <item msgid="4199433197875490373">"અન્ય"</item> <item msgid="3233938986670468328">"કસ્ટમ"</item> </string-array> <string-array name="postalAddressTypes"> <item msgid="3861463339764243038">"ઘર"</item> - <item msgid="5472578890164979109">"કાર્યાલય"</item> + <item msgid="5472578890164979109">"ઑફિસ"</item> <item msgid="5718921296646594739">"અન્ય"</item> <item msgid="5523122236731783179">"કસ્ટમ"</item> </string-array> <string-array name="imAddressTypes"> <item msgid="588088543406993772">"હોમ"</item> - <item msgid="5503060422020476757">"કાર્યાલય"</item> + <item msgid="5503060422020476757">"ઑફિસ"</item> <item msgid="2530391194653760297">"અન્ય"</item> <item msgid="7640927178025203330">"કસ્ટમ"</item> </string-array> <string-array name="organizationTypes"> - <item msgid="6144047813304847762">"કાર્યાલય"</item> + <item msgid="6144047813304847762">"ઑફિસ"</item> <item msgid="7402720230065674193">"અન્ય"</item> <item msgid="808230403067569648">"કસ્ટમ"</item> </string-array> @@ -746,7 +746,7 @@ <string name="phoneTypeCustom" msgid="5120365721260686814">"કસ્ટમ"</string> <string name="phoneTypeHome" msgid="3880132427643623588">"હોમ"</string> <string name="phoneTypeMobile" msgid="1178852541462086735">"મોબાઇલ"</string> - <string name="phoneTypeWork" msgid="6604967163358864607">"કાર્યાલય"</string> + <string name="phoneTypeWork" msgid="6604967163358864607">"ઑફિસ"</string> <string name="phoneTypeFaxWork" msgid="6757519896109439123">"કાર્ય ફૅક્સ"</string> <string name="phoneTypeFaxHome" msgid="6678559953115904345">"ઘરનો ફૅક્સ"</string> <string name="phoneTypePager" msgid="576402072263522767">"પેજર"</string> @@ -770,16 +770,16 @@ <string name="eventTypeOther" msgid="530671238533887997">"અન્ય"</string> <string name="emailTypeCustom" msgid="1809435350482181786">"કસ્ટમ"</string> <string name="emailTypeHome" msgid="1597116303154775999">"ઘર"</string> - <string name="emailTypeWork" msgid="2020095414401882111">"કાર્યાલય"</string> + <string name="emailTypeWork" msgid="2020095414401882111">"ઑફિસ"</string> <string name="emailTypeOther" msgid="5131130857030897465">"અન્ય"</string> <string name="emailTypeMobile" msgid="787155077375364230">"મોબાઇલ"</string> <string name="postalTypeCustom" msgid="5645590470242939129">"કસ્ટમ"</string> <string name="postalTypeHome" msgid="7562272480949727912">"ઘર"</string> - <string name="postalTypeWork" msgid="8553425424652012826">"કાર્યાલય"</string> + <string name="postalTypeWork" msgid="8553425424652012826">"ઑફિસ"</string> <string name="postalTypeOther" msgid="7094245413678857420">"અન્ય"</string> <string name="imTypeCustom" msgid="5653384545085765570">"કસ્ટમ"</string> <string name="imTypeHome" msgid="6996507981044278216">"હોમ"</string> - <string name="imTypeWork" msgid="2099668940169903123">"કાર્યાલય"</string> + <string name="imTypeWork" msgid="2099668940169903123">"ઑફિસ"</string> <string name="imTypeOther" msgid="8068447383276219810">"અન્ય"</string> <string name="imProtocolCustom" msgid="4437878287653764692">"કસ્ટમ"</string> <string name="imProtocolAim" msgid="4050198236506604378">"AIM"</string> @@ -791,7 +791,7 @@ <string name="imProtocolIcq" msgid="2410325380427389521">"ICQ"</string> <string name="imProtocolJabber" msgid="7919269388889582015">"Jabber"</string> <string name="imProtocolNetMeeting" msgid="4985002408136148256">"NetMeeting"</string> - <string name="orgTypeWork" msgid="8684458700669564172">"કાર્યાલય"</string> + <string name="orgTypeWork" msgid="8684458700669564172">"ઑફિસ"</string> <string name="orgTypeOther" msgid="5450675258408005553">"અન્ય"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"કસ્ટમ"</string> <string name="relationTypeCustom" msgid="282938315217441351">"કસ્ટમ"</string> @@ -811,7 +811,7 @@ <string name="relationTypeSpouse" msgid="6916682664436031703">"જીવનસાથી"</string> <string name="sipAddressTypeCustom" msgid="6283889809842649336">"કસ્ટમ"</string> <string name="sipAddressTypeHome" msgid="5918441930656878367">"ઘર"</string> - <string name="sipAddressTypeWork" msgid="7873967986701216770">"કાર્યાલય"</string> + <string name="sipAddressTypeWork" msgid="7873967986701216770">"ઑફિસ"</string> <string name="sipAddressTypeOther" msgid="6317012577345187275">"અન્ય"</string> <string name="quick_contacts_not_available" msgid="1262709196045052223">"આ સંપર્ક જોવા માટે કોઈ ઍપ્લિકેશન મળી નથી."</string> <string name="keyguard_password_enter_pin_code" msgid="6401406801060956153">"પિન કોડ લખો"</string> @@ -1650,7 +1650,7 @@ <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"થઈ ગયું"</string> <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"શૉર્ટકટ બંધ કરો"</string> <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"શૉર્ટકટનો ઉપયોગ કરો"</string> - <string name="color_inversion_feature_name" msgid="326050048927789012">"રંગનો વ્યુત્ક્રમ"</string> + <string name="color_inversion_feature_name" msgid="326050048927789012">"વિપરીત રંગમાં બદલવું"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"રંગ સુધારણા"</string> <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"વૉલ્યૂમ કી દબાવી રાખો. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ચાલુ કરી."</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"વૉલ્યૂમ કી દબાવી રાખો. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> બંધ કરી."</string> @@ -1784,7 +1784,7 @@ <string name="select_day" msgid="2060371240117403147">"મહિનો અને દિવસ પસંદ કરો"</string> <string name="select_year" msgid="1868350712095595393">"વર્ષ પસંદ કરો"</string> <string name="deleted_key" msgid="9130083334943364001">"<xliff:g id="KEY">%1$s</xliff:g> કાઢી નાખી"</string> - <string name="managed_profile_label_badge" msgid="6762559569999499495">"કાર્યાલય <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="managed_profile_label_badge" msgid="6762559569999499495">"ઑફિસ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"અનપિન કરતા પહેલાં પિન માટે પૂછો"</string> @@ -1854,7 +1854,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS વિનંતીને વીડિઓ કૉલમાં બદલવામાં આવી છે"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS વિનંતીને USSD વિનંતીમાં બદલવામાં આવી છે"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"નવી SS વિનંતીમાં બદલવામાં આવી છે"</string> - <string name="notification_work_profile_content_description" msgid="5296477955677725799">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ઑફિસની પ્રોફાઇલ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"અલર્ટ કરેલ"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"વિસ્તૃત કરો"</string> <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"સંકુચિત કરો"</string> @@ -1888,8 +1888,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> હમણાં ઉપલબ્ધ નથી. આને <xliff:g id="APP_NAME_1">%2$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"વધુ જાણો"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ઍપ ફરી શરૂ કરો"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"ઑફિસ માટેની પ્રોફાઇલ ચાલુ કરીએ?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"તમારી ઑફિસ માટેની ઍપ, નોટિફિકેશન, ડેટા અને અન્ય ઑફિસ માટેની પ્રોફાઇલ સુવિધાઓ ચાલુ કરવામાં આવશે"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"ઑફિસની પ્રોફાઇલ ચાલુ કરીએ?"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"તમારી ઑફિસ માટેની ઍપ, નોટિફિકેશન, ડેટા અને અન્ય ઑફિસની પ્રોફાઇલ સુવિધાઓ ચાલુ કરવામાં આવશે"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"ચાલુ કરો"</string> <string name="app_blocked_title" msgid="7353262160455028160">"ઍપ ઉપલબ્ધ નથી"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> હાલમાં ઉપલબ્ધ નથી."</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"પાવર સંવાદ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"લૉક સ્ક્રીન"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"સ્ક્રીનશૉટ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"સ્ક્રીન પરના ઍક્સેસિબિલિટી શૉર્ટકટના પસંદકર્તા"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ઍક્સેસિબિલિટી શૉર્ટકટ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>નું કૅપ્શન બાર."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2056,7 +2053,7 @@ <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"ગ્રૂપ વાતચીત"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"વ્યક્તિગત"</string> - <string name="resolver_work_tab" msgid="2690019516263167035">"કાર્યાલય"</string> + <string name="resolver_work_tab" msgid="2690019516263167035">"ઑફિસ"</string> <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"વ્યક્તિગત વ્યૂ"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"ઑફિસ વ્યૂ"</string> <string name="resolver_cant_share_with_work_apps" msgid="637686613606502219">"આને ઑફિસ માટેની ઍપ સાથે શેર કરી શકતાં નથી"</string> @@ -2067,7 +2064,7 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"તમારા IT વ્યવસ્થાપક તમને તમારી વ્યક્તિગત પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ શેર કરવાની મંજૂરી આપતા નથી"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"વ્યક્તિગત ઍપ વડે આને ખોલી શકતાં નથી"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"તમારા IT વ્યવસ્થાપક તમને તમારી વ્યક્તિગત પ્રોફાઇલમાંની ઍપ વડે આ કન્ટેન્ટ ખોલવાની મંજૂરી આપતા નથી"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"કાર્યાલયની પ્રોફાઇલ થોભાવી છે"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"ઑફિસની પ્રોફાઇલ થોભાવી છે"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"ચાલુ કરો"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"કોઈ ઑફિસ માટેની ઍપ આ કન્ટેન્ટને સપોર્ટ કરી શકતી નથી"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"કોઈ ઑફિસ માટેની ઍપ આ કન્ટેન્ટ ખોલી શકતી નથી"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCIDને અનલૉક કરવાનું સફળ રહ્યું."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPIને અનલૉક કરવાનું સફળ રહ્યું."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"નેટવર્ક સબસેટ સેવા પ્રદાતાના લૉકને અનલૉક કરવાનું સફળ રહ્યું."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5038d72734ab..a15c6798c460 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1796,7 +1796,7 @@ <string name="confirm_battery_saver" msgid="5247976246208245754">"ठीक है"</string> <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n•गहरे रंग वाली थीम चालू करता है\n•बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या उन्हें बंद कर देता है\n\n"<annotation id="url">"ज़्यादा जानें"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"बैटरी लाइफ़ बढ़ाने के लिए, बैटरी सेवर:\n\n•गहरे रंग वाली थीम चालू करता है\n•बैकग्राउंड की गतिविधि, कुछ विज़ुअल इफ़ेक्ट, और \"Hey Google\" जैसी दूसरी सुविधाएं इस्तेमाल करने से रोकता है या उन्हें बंद कर देता है"</string> - <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा सेवर कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकता है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन पर टैप नहीं करते."</string> + <string name="data_saver_description" msgid="4995164271550590517">"डेटा खर्च को कम करने के लिए, डेटा बचाने की सेटिंग कुछ ऐप्लिकेशन को बैकग्राउंड में डेटा भेजने या डेटा पाने से रोकती है. फ़िलहाल, आप जिस ऐप्लिकेशन का इस्तेमाल कर रहे हैं वह डेटा ऐक्सेस कर सकता है, लेकिन ऐसा कभी-कभी ही हो पाएगा. उदाहरण के लिए, इमेज तब तक दिखाई नहीं देंगी जब तक कि आप उन पर टैप नहीं करते."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा बचाने की सेटिंग चालू करें?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"चालू करें"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर डायलॉग खोलें"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्क्रीन लॉक करें"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट लें"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"स्क्रीन पर दिखने वाला सुलभता का शॉर्टकट"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"स्क्रीन पर दिखने वाले सुलभता के शॉर्टकट को चुनने का मेन्यू"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"सुलभता का शॉर्टकट"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> का कैप्शन बार."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"आईसीसीआईडी को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"आईएमपीआई को अनलॉक किया गया."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"नेटवर्क के सबसेट की सेवा देने वाली कंपनी के लॉक को अनलॉक किया गया."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index a4586136eac5..a6db95e271b2 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1920,8 +1920,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"Aplikacija <xliff:g id="APP_NAME_0">%1$s</xliff:g> trenutačno nije dostupna. Ovime upravlja aplikacija <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Saznajte više"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Prekini pauzu aplikacije"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"Želite uključiti radni profil?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Uključit će se vaše radne aplikacije, obavijesti, podaci i druge značajke radnog profila"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"Želite li uključiti poslovni profil?"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Uključit će se vaše poslovne aplikacije, obavijesti, podaci i druge značajke poslovnog profila"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Uključi"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Aplikacija nije dostupna"</string> <string name="app_blocked_message" msgid="542972921087873023">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> trenutačno nije dostupna."</string> @@ -2076,12 +2076,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dijalog napajanja"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaključajte zaslon"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snimka zaslona"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Prečac pristupačnosti na zaslonu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Alat za odabir prečaca pristupačnosti na zaslonu"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Prečac pristupačnosti"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Traka naslova aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2215,4 +2212,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID je otključan."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI je otključan."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Davatelj usluge podskupa mreže je otključan."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index f2e024d5e7ad..8eb56b491be2 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Akkumulátorral kapcsolatos párbeszédpanel"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lezárási képernyő"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Képernyőkép"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancs"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Képernyőn megjelenő kisegítő lehetőségekre vonatkozó parancsválasztó"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Kisegítő lehetőségek gyorsparancsa"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás címsora."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2067,7 +2064,7 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"Rendszergazdája nem engedélyezi, hogy ezt a tartalmat a személyes profiljában lévő alkalmazásokkal ossza meg"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Ez a tartalom nem nyitható meg személyes alkalmazásokkal"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"Rendszergazdája nem engedélyezi, hogy ezt a tartalmat a személyes profiljában lévő alkalmazásokkal nyissa meg"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"A munkaprofil szüneteltetve van"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"A munkaprofil használata szünetel"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Bekapcsolás"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"A munkahelyi alkalmazások nem támogatják ezt a tartalmat"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Munkahelyi alkalmazásokkal nem nyitható meg ez a tartalom"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Sikerült az ICCID feloldása."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Sikerült az IMPI feloldása."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Sikerült a szolgáltató hálózati alkészletének feloldása."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index bf7ec3897303..48b088b73042 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -301,7 +301,7 @@ <string name="permgroupdesc_calendar" msgid="6762751063361489379">"օգտագործել օրացույցը"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"ուղարկել և դիտել SMS-ները"</string> - <string name="permgrouplab_storage" msgid="1938416135375282333">"Ֆայլեր և մեդիա"</string> + <string name="permgrouplab_storage" msgid="1938416135375282333">"Ֆայլեր և մեդիաֆայլեր"</string> <string name="permgroupdesc_storage" msgid="6351503740613026600">"օգտագործել լուսանկարները, մեդիա ֆայլերը և ձեր սարքում պահվող մյուս ֆայլերը"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"Խոսափող"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"ձայնագրել"</string> @@ -1794,10 +1794,10 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Թարմացվել է ձեր ադմինիստրատորի կողմից"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Ջնջվել է ձեր ադմինիստրատորի կողմից"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"Եղավ"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «OK Google» հրահանգը։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «OK Google» հրահանգը:"</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգը։\n\n"<annotation id="url">"Իմանալ ավելին"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Մարտկոցի աշխատաժամանակը երկարացնելու համար «Մարտկոցի տնտեսում» գործառույթը.\n\n•Միացնում է մուգ թեման։\n•Անջատում կամ սահմանափակում է աշխատանքը ֆոնային ռեժիմում, որոշ վիզուալ էֆեկտներ և այլ գործառույթներ, օրինակ՝ «Ok Google» հրահանգը:"</string> <string name="data_saver_description" msgid="4995164271550590517">"Թրաֆիկի տնտեսման ռեժիմում որոշ հավելվածների համար տվյալների ֆոնային փոխանցումն անջատված է։ Հավելվածը, որն օգտագործում եք, կարող է տվյալներ փոխանցել և ստանալ, սակայն ոչ այնքան հաճախ: Օրինակ՝ պատկերները կցուցադրվեն միայն դրանց վրա սեղմելուց հետո։"</string> - <string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի խնայումը:"</string> + <string name="data_saver_enable_title" msgid="7080620065745260137">"Միացնե՞լ թրաֆիկի տնտեսումը"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Միացնել"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">%1$d րոպե (մինչև <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"Մանրամասն"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Չեղարկել դադարեցումը"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"Միացնե՞լ աշխատանքային պրոֆիլը"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Ձեր աշխատանքային հավելվածները, ծանուցումները, տվյալները և աշխատանքային պրոֆիլի մյուս գործառույթները կմիանան"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Ձեր աշխատանքային հավելվածները, ծանուցումները, տվյալները և աշխատանքային պրոֆիլի մյուս գործառույթները կմիացվեն։"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Միացնել"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Հավելվածը հասանելի չէ"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն այս պահին հասանելի չէ։"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Սնուցման պատուհան"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Կողպէկրան"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Սքրինշոթ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Հատուկ գործառույթների դյուրանցում"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Հատուկ գործառույթների դյուրանցման ընտրիչ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Հատուկ գործառույթների դյուրանցում"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի ենթագրերի գոտին։"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID քարտի ապակողպումը հաջողվեց։"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI քարտի ապակողպումը հաջողվեց։"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider քարտի ապակողպումը հաջողվեց։"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index c4ff2e39b215..f2c34b47e2c0 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Daya"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Layar Kunci"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Aksesibilitas di layar"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Aksesibilitas di layar"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Aksesibilitas"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Kolom teks <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID berhasil dibuka kuncinya."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI berhasil dibuka kuncinya."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Network subset service provider berhasil dibuka."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 168c63092abb..9fb5b7865439 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Gluggi til að slökkva/endurræsa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lásskjár"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjámynd"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Flýtileið í aðgengiseiginleika á skjánum"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Val um flýtileið í aðgengiseiginleika á skjánum"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Flýtileið aðgengisstillingar"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Skjátextastika <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Opnun ICCID tókst."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Opnun IMPI tókst."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Opnun þjónustuaðila netkerfishlutmengis tókst."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index f4794a2d5c22..b6be231f0fc0 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1794,8 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Aggiornato dall\'amministratore"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Eliminato dall\'amministratore"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il Tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\"\n\n"<annotation id="url">"Ulteriori informazioni"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il Tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\""</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\"\n\n"<annotation id="url">"Ulteriori informazioni"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Per estendere la durata della batteria, la funzionalità di risparmio energetico:\n\n•Attiva il tema scuro\n•Disattiva o limita le attività in background, alcuni effetti visivi e altre funzionalità come \"Ok Google\""</string> <string name="data_saver_description" msgid="4995164271550590517">"Per contribuire a ridurre l\'utilizzo dei dati, la funzione Risparmio dati impedisce ad alcune app di inviare o ricevere dati in background. Un\'app in uso può accedere ai dati, ma potrebbe farlo con meno frequenza. Esempio: le immagini non vengono visualizzate finché non le tocchi."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Attivare Risparmio dati?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Attiva"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Finestra di dialogo Alimentazione"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Schermata di blocco"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Scorciatoia Accessibilità sullo schermo"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selettore scorciatoia Accessibilità sullo schermo"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Scorciatoia Accessibilità"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra del titolo di <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Sblocco ICCID riuscito."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Sblocco IMPI riuscito."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Sblocco fornitore di servizi sottoinsieme rete riuscito."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index c1580da63c12..403bcaf787c8 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"תיבת דו-שיח לגבי הסוללה"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"מסך הנעילה"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"צילום מסך"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"קיצור דרך לנגישות במסך"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"בורר קיצורי דרך לנגישות במסך"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"קיצור דרך לנגישות"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"סרגל כיתוב של <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ביטול הנעילה של ICCID בוצע בהצלחה."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"ביטול הנעילה של IMPI בוצע בהצלחה."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ביטול הנעילה של ספק שירות של תת-קבוצה ברשת בוצע בהצלחה."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 1ba098f13f11..3de09a0e3cbe 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源ダイアログ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ロック画面"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"スクリーンショット"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"画面上のユーザー補助のショートカット"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"画面上のユーザー補助のショートカットの選択メニュー"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ユーザー補助のショートカット"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> のキャプション バーです。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID をロック解除しました。"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI をロック解除しました。"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ネットワーク サブセットのサービス プロバイダをロック解除しました。"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index f21668099eb5..3a2d22c90b3b 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ელკვების დიალოგი"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ჩაკეტილი ეკრანი"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ეკრანის ანაბეჭდი"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"მისაწვდომობის ეკრანული მალსახმობი"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"მისაწვდომობის ეკრანული მალსახმობის ამომრჩევი"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"მისაწვდომობის მალსახმობი"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ის სუბტიტრების ზოლი."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID- წარმატებით შესრულდა."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-ის განბლოკვა წარმატებით შესრულდა."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ქსელის ყვედანაყოფის სერვისის მომწოდებლის განბლოკვა წარმატებით შესრულდა."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index d905d460ed36..1853aba86bc3 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Қуат диалогтік терезесі"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Құлып экраны"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Экрандағы арнайы мүмкіндіктерді жылдам қосу"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Экрандағы арнайы мүмкіндіктерді жылдам қосу әрекетін таңдау"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Арнайы мүмкіндіктерді жылдам қосу"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасының жазу жолағы."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID құлпы ашылды."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI құлпы ашылды."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Қызмет көрсетуші желісінің ішкі жиынтығы құлпы ашылды."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 4ec4c14e3d23..e544a84255dd 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -2044,12 +2044,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ប្រអប់ថាមពល"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"អេក្រង់ចាក់សោ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"រូបថតអេក្រង់"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ម៉ឺនុយជ្រើសរើសផ្លូវកាត់ភាពងាយស្រួលនៅលើអេក្រង់"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ផ្លូវកាត់ភាពងាយស្រួល"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"របារពណ៌នាអំពី <xliff:g id="APP_NAME">%1$s</xliff:g>។"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់ទៅក្នុងធុងដែលបានដាក់កំហិត"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string> @@ -2183,4 +2180,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ការដោះសោ ICCID ទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"ការដោះសោ IMPI ទទួលបានជោគជ័យហើយ។"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ការដោះសោក្រុមហ៊ុនផ្ដល់សេវាសំណុំរងនៃបណ្ដាញទទួលបានជោគជ័យហើយ។"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 5c8068498373..cc2760ff4304 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ಪವರ್ ಡೈಲಾಗ್"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ಸ್ಕ್ರೀನ್ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ಸ್ಕ್ರೀನ್ನಲ್ಲಿನ ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್ ಆಯ್ಕೆ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ಪ್ರವೇಶಿಸುವಿಕೆ ಶಾರ್ಟ್ಕಟ್"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ನ ಶೀರ್ಷಿಕೆಯ ಪಟ್ಟಿ."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್ಗೆ ಹಾಕಲಾಗಿದೆ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ನೆಟ್ವರ್ಕ್ ಸಬ್ಸೆಟ್ ಸೇವಾ ಒದಗಿಸುವವರ ಅನ್ಲಾಕ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 79cd4fe7c8d3..d9f9ee2c5f63 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"자세히 알아보기"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"앱 일시중지 해제"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"직장 프로필을 사용 설정하시겠어요?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"업무용 앱, 알림, 데이터 및 기타 직장 프로필 기능이 사용 설정됩니다."</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"직장 앱, 알림, 데이터 및 기타 직장 프로필 기능이 사용 설정됩니다."</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"사용 설정"</string> <string name="app_blocked_title" msgid="7353262160455028160">"앱을 사용할 수 없습니다"</string> <string name="app_blocked_message" msgid="542972921087873023">"현재 <xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 사용할 수 없습니다."</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"전원 대화상자"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"잠금 화면"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"스크린샷"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"화면상의 접근성 바로가기"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"화면상의 접근성 바로가기 선택 도구"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"접근성 단축키"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 자막 표시줄입니다."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID 잠금 해제가 완료되었습니다."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI 잠금 해제가 완료되었습니다."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"네트워크 하위 집합 서비스 제공업체 잠금 해제가 완료되었습니다."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 9dc6e4656d2b..7cc29580dc06 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -253,8 +253,8 @@ <item quantity="other">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_1">%d</xliff:g> секундда скриншот алынат.</item> <item quantity="one">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_0">%d</xliff:g> секундда скриншот алынат.</item> </plurals> - <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Мүчүлүштүк тууралуу кабар берүү үчүн скриншот тартылды"</string> - <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Мүчүлүштүк тууралуу кабар берүү үчүн скриншот тартылган жок"</string> + <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Мүчүлүштүк тууралуу кабарлоо үчүн скриншот тартылды"</string> + <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Мүчүлүштүк тууралуу кабарлоо үчүн скриншот тартылган жок"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Үнсүз режим"</string> <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"Добушу ӨЧҮК"</string> <string name="global_action_silent_mode_off_status" msgid="6608006545950920042">"Добушу КҮЙҮК"</string> @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"Кеңири маалымат"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Колдонмону иштетүү"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"Жумуш профили күйгүзүлсүнбү?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Жумуш колдонмолоруңуз, эскертмелериңиз, дайын-даректериңиз жана жумуш профилинин башка функциялары күйгүзүлөт."</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Жумуш колдонмолоруңуз, билдирмелериңиз, дайын-даректериңиз жана жумуш профилинин башка функциялары күйгүзүлөт."</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Күйгүзүү"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Колдонмо учурда жеткиликсиз"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> учурда жеткиликсиз"</string> @@ -1922,7 +1922,7 @@ <string name="app_category_maps" msgid="6395725487922533156">"Карталар жана чабыттоо"</string> <string name="app_category_productivity" msgid="1844422703029557883">"Өндүрүш категориясы"</string> <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"Түзмөктүн сактагычы"</string> - <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB аркылуу мүчүлүштүктөрдү оңдоо"</string> + <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB аркылуу мүчүлүштүктөрдү аныктоо"</string> <string name="time_picker_hour_label" msgid="4208590187662336864">"саат"</string> <string name="time_picker_minute_label" msgid="8307452311269824553">"мүнөт"</string> <string name="time_picker_header_text" msgid="9073802285051516688">"Убакытты коюу"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Кубат диалогу"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Кулпуланган экран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ыкчам иштетүү"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ыкчам иштетүү менюсу"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Ыкчам иштетүү"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунун маалымат тилкеси."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID кулпусу ийгиликтүү ачылды."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI кулпусу ийгиликтүү ачылды."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Кичи тармак операторунун кулпусу ийгиликтүү ачылды."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index cd597600642d..d41aba6a9143 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ກ່ອງໂຕ້ຕອບການເປີດປິດ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ໜ້າຈໍລັອກ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ຮູບໜ້າຈໍ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ຕົວເລືອກທາງລັດການຊ່ວຍເຂົ້າເຖິງຢູ່ໜ້າຈໍ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ທາງລັດການຊ່ວຍເຂົ້າເຖິງ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"ແຖບຄຳບັນຍາຍຂອງ <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ປົດລັອກ ICCID ສຳເລັດແລ້ວ."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"ປົດລັອກ IMPI ສຳເລັດແລ້ວ."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ປົດລັອກຜູ້ໃຫ້ບໍລິການຊຸດຍ່ອຍເຄືອຂ່າຍສຳເລັດແລ້ວ."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index e0132e45da0e..636ba1836f0b 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Maitinimo dialogo langas"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Užrakinimo ekranas"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrano kopija"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrano pritaikomumo šaukinys"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrano pritaikomumo šaukinių parinkiklis"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pritaikomumo šaukinys"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Programos „<xliff:g id="APP_NAME">%1$s</xliff:g>“ antraštės juosta."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID operatoriaus pasirinkimo ribojimas sėkmingai panaikintas."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI operatoriaus pasirinkimo ribojimas sėkmingai panaikintas."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Tinklo poaibio paslaugos teikėjo operatoriaus pasirinkimo ribojimas sėkmingai panaikintas."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index eeaf12ffa93d..3b57500c950b 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -2076,12 +2076,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Barošanas dialoglodziņš"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloķēt ekrānu"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekrānuzņēmums"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekrāna pieejamības saīsne"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekrāna pieejamības saīsnes atlasītājs"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pieejamības saīsne"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> subtitru josla."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2215,4 +2212,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID atbloķēšana bija veiksmīga."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI atbloķēšana bija veiksmīga."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Tīkla apakškopas pakalpojuma sniedzēja atbloķēšana bija veiksmīga."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-mcc334-mnc020/config.xml b/core/res/res/values-mcc334-mnc020/config.xml index 0970517835b6..c64acc7c29db 100644 --- a/core/res/res/values-mcc334-mnc020/config.xml +++ b/core/res/res/values-mcc334-mnc020/config.xml @@ -18,4 +18,7 @@ --> <resources> <bool name="config_use_sim_language_file">false</bool> + + <bool name="config_pdp_rejeect_enable_retry">true</bool> + <integer name="config_pdp_reject_retry_delay_ms">45000</integer> </resources>
\ No newline at end of file diff --git a/core/res/res/values-mcc334-mnc020/strings.xml b/core/res/res/values-mcc334-mnc020/strings.xml new file mode 100644 index 000000000000..a8a78d5ef3fc --- /dev/null +++ b/core/res/res/values-mcc334-mnc020/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2020, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="config_pdp_reject_dialog_title"></string> + <string name="config_pdp_reject_user_authentication_failed">AUTHENTICATION FAILURE -29-</string> + <string name="config_pdp_reject_service_not_subscribed">NOT SUBSCRIBED TO SERVICE -33-</string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed">Multiple PDN connections for a given APN not allowed -55-</string> +</resources>
\ No newline at end of file diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 7c0cff19cef5..ab4c1a54542c 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -2044,12 +2044,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог за напојување"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заклучен екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Слика од екранот"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Кратенка за пристапност на екранот"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Избирач на кратенка за пристапност на екранот"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Кратенка за пристапност"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Насловна лента на <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2183,4 +2180,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Отклучувањето на ICCID е успешно."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Отклучувањето на IMPI е успешно."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Отклучувањето на операторот на подмножеството на мрежата е успешно."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index bd1193eb16ab..9e90637fac59 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"പവർ ഡയലോഗ്"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ലോക്ക് സ്ക്രീൻ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"സ്ക്രീൻഷോട്ട്"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"സ്ക്രീനിലെ ഉപയോഗസഹായി കുറുക്കുവഴി ചൂസർ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ഉപയോഗസഹായി കുറുക്കുവഴി"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> എന്നതിന്റെ അടിക്കുറിപ്പ് ബാർ."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID അൺലോക്ക് ചെയ്തു."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI അൺലോക്ക് ചെയ്തു."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"നെറ്റ്വർക്ക് സബ്സെറ്റ് സേവനദാതാവിനെ അൺലോക്ക് ചെയ്തു."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 51138a7afe50..902aa16af077 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Тэжээлийн харилцах цонх"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Дэлгэцийг түгжих"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Дэлгэцийн зураг дарах"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Дэлгэц дээрх хандалтын товчлол"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Дэлгэц дээрх хандалтын товчлол сонгогч"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Хандалтын товчлол"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н гарчгийн талбар."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID-н түгжээг амжилттай тайллаа."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-н түгжээг амжилттай тайллаа."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Сүлжээний дэд олонлогийн үйлчилгээ үзүүлэгчийн түгжээг амжилттай тайллаа."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 7943bd47c656..fbeb31099335 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पॉवर डायलॉग"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"स्क्रीन लॉक करा"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रीनशॉट"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ऑन-स्क्रीन ॲक्सेसिबिलिटी शॉर्टकट निवडकर्ता"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"अॅक्सेसिबिलिटी शॉर्टकट"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> चा शीर्षक बार."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID अनलॉक करणे यशस्वी झाले."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI अनलॉक करणे यशस्वी झाले."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"नेटवर्क सबसेट सेवा पुरवठादार अनलॉक करणे यशस्वी झाले."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 23808b82af08..189821cd3460 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog Kuasa"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrin Kunci"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Tangkapan skrin"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Pintasan Kebolehaksesan Pada Skrin"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Pemilih Pintasan Kebolehaksesan Pada Skrin"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Pintasan Kebolehaksesan"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bar kapsyen <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Buka kunci ICCID berjaya."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Buka kunci IMPI berjaya."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Buka kunci penyedia perkhidmatan subset rangkaian berjaya."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f8e409d3abb2..80611df5963e 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ပါဝါ ဒိုင်ယာလော့"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"လော့ခ်မျက်နှာပြင်"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ဖန်သားပြင်ဓာတ်ပုံ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ်"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ဖန်သားပြင်အတွက် အများသုံးစွဲနိုင်မှုဖြတ်လမ်းလင့်ခ် ရွေးချယ်စနစ်"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>၏ ခေါင်းစီး ဘား။"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID လော့ခ်ဖွင့်၍ ရပါပြီ။"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI လော့ခ်ဖွင့်၍ ရပါပြီ။"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ကွန်ရက်ခွဲ ဝန်ဆောင်မှုပေးသူ လော့ခ်ဖွင့်၍ ရပါပြီ။"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index f4b7ec3b16d5..37127d0d568c 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogboks for å slå av/på"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låseskjerm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skjermdump"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tilgjengelighetssnarvei på skjermen"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Velger for tilgjengelighetssnarvei på skjermen"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tilgjengelighetssnarvei"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Tekstingsfelt i <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID-opplåsingen er fullført."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI-opplåsingen er fullført."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Bestemte operatørlåser er blitt fjernet."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index ba599e84f88d..79d097428026 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -191,7 +191,7 @@ <string name="device_ownership_relinquished" msgid="4080886992183195724">"व्यवस्थापकले यन्त्रलाई व्यक्तिगत प्रयोगका लागि अस्वीकार गर्नुभयो"</string> <string name="network_logging_notification_title" msgid="554983187553845004">"यन्त्र व्यवस्थित गरिएको छ"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"तपाईंको संगठनले यस यन्त्रको व्यवस्थापन गर्दछ र नेटवर्क ट्राफिकको अनुगमन गर्न सक्छ। विवरणहरूका लागि ट्याप गर्नुहोस्।"</string> - <string name="location_changed_notification_title" msgid="3620158742816699316">"अनुप्रयोगहरूले तपाईंको स्थान प्रयोग गर्न सक्छन्"</string> + <string name="location_changed_notification_title" msgid="3620158742816699316">"एपहरूले तपाईंको स्थान प्रयोग गर्न सक्छन्"</string> <string name="location_changed_notification_text" msgid="7158423339982706912">"थप जानकारी प्राप्त गर्न आफ्ना IT प्रशासकसँग सम्पर्क गर्नुहोस्"</string> <string name="country_detector" msgid="7023275114706088854">"देश पत्ता लगाउने सुविधा"</string> <string name="location_service" msgid="2439187616018455546">"स्थानसम्बन्धी सेवा"</string> @@ -284,9 +284,9 @@ <string name="notification_channel_retail_mode" msgid="3732239154256431213">"खुद्रा बिक्री सम्बन्धी डेमो"</string> <string name="notification_channel_usb" msgid="1528280969406244896">"USB जडान"</string> <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"एप चलिरहेको छ"</string> - <string name="notification_channel_foreground_service" msgid="7102189948158885178">"अनुप्रयोगहरूले ब्याट्री खपत गर्दै छन्"</string> + <string name="notification_channel_foreground_service" msgid="7102189948158885178">"एपहरूले ब्याट्री खपत गर्दै छन्"</string> <string name="foreground_service_app_in_background" msgid="1439289699671273555">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले ब्याट्री प्रयोग गर्दै छ"</string> - <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> अनुप्रयोगहरूले ब्याट्री प्रयोग गर्दै छन्"</string> + <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"<xliff:g id="NUMBER">%1$d</xliff:g> एपहरूले ब्याट्री प्रयोग गर्दै छन्"</string> <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"ब्याट्री र डेटाका प्रयोग सम्बन्धी विवरणहरूका लागि ट्याप गर्नुहोस्"</string> <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="8974401416068943888">"सुरक्षित मोड"</string> @@ -330,47 +330,47 @@ <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"स्क्रिनसट लिनुहोस्"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"डिस्प्लेको स्क्रिनसट लिन सकिन्छ।"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"स्थिति पट्टिलाई अक्षम वा संशोधित गर्नुहोस्"</string> - <string name="permdesc_statusBar" msgid="5809162768651019642">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_statusBar" msgid="5809162768651019642">"स्थिति पट्टि असक्षम पार्न वा प्रणाली आइकनहरू थप्न र हटाउन एपलाई अनुमति दिन्छ।"</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"स्टाटस बार हुन दिनुहोस्"</string> - <string name="permdesc_statusBarService" msgid="6652917399085712557">"अनुप्रयोगलाई स्थिति पट्टि हुन अनुमति दिन्छ।"</string> + <string name="permdesc_statusBarService" msgid="6652917399085712557">"एपलाई स्थिति पट्टि हुन अनुमति दिन्छ।"</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"स्थिति पट्टिलाई विस्तृत/सङ्कुचित गर्नुहोस्"</string> - <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"अनुप्रयोगलाई स्थिति पट्टि विस्तार वा संकुचन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"एपलाई स्थिति पट्टि विस्तार वा संकुचन गर्न अनुमति दिन्छ।"</string> <string name="permlab_install_shortcut" msgid="7451554307502256221">"सर्टकट स्थापना गर्नुहोस्"</string> - <string name="permdesc_install_shortcut" msgid="4476328467240212503">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा अनुप्रयोगलाई सर्टकटमा थप्नको लागि अनुमति दिन्छ।"</string> + <string name="permdesc_install_shortcut" msgid="4476328467240212503">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा एपलाई सर्टकटमा थप्नको लागि अनुमति दिन्छ।"</string> <string name="permlab_uninstall_shortcut" msgid="295263654781900390">"सर्टकटहरूको स्थापन रद्द गर्नुहोस्"</string> - <string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा अनुप्रयोगलाई सर्टकटमा हटाउनको लागि अनुमति दिन्छ।"</string> + <string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा एपलाई सर्टकटमा हटाउनको लागि अनुमति दिन्छ।"</string> <string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"बहिर्गमन कलहरूलाई अर्को मार्ग दिनुहोस्"</string> - <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"अनुप्रयोगलाई अन्य नम्बरमा कल पुर्ननिर्देश वा समग्र कल परित्याग विकल्प सहित बहिर्गमन कल समयमा डायल गर्दाको नम्बर हेर्न अनुमति दिन्छ।"</string> + <string name="permdesc_processOutgoingCalls" msgid="7833149750590606334">"एपलाई अन्य नम्बरमा कल पुर्ननिर्देश वा समग्र कल परित्याग विकल्प सहित बहिर्गमन कल समयमा डायल गर्दाको नम्बर हेर्न अनुमति दिन्छ।"</string> <string name="permlab_answerPhoneCalls" msgid="4131324833663725855">"फोन कलहरूको जवाफ दिनुहोस्"</string> - <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"अनुप्रयोगलाई आगमन फोन कलको जवाफ दिन अनुमति दिन्छ।"</string> + <string name="permdesc_answerPhoneCalls" msgid="894386681983116838">"एपलाई आगमन फोन कलको जवाफ दिन अनुमति दिन्छ।"</string> <string name="permlab_receiveSms" msgid="505961632050451881">"पाठ सन्देशहरू (SMS) प्राप्त गर्नुहोस्"</string> - <string name="permdesc_receiveSms" msgid="1797345626687832285">"अनुप्रयोगलाई SMS सन्देशहरू प्राप्त गर्न र प्रक्रिया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string> + <string name="permdesc_receiveSms" msgid="1797345626687832285">"एपलाई SMS सन्देशहरू प्राप्त गर्न र प्रक्रिया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string> <string name="permlab_receiveMms" msgid="4000650116674380275">"पाठ सन्देश (MMS) प्राप्त गर्नुहोस्"</string> - <string name="permdesc_receiveMms" msgid="958102423732219710">"अनुप्रयोगलाई MMS सन्देशहरू प्राप्त गर्न र प्रकृया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string> + <string name="permdesc_receiveMms" msgid="958102423732219710">"एपलाई MMS सन्देशहरू प्राप्त गर्न र प्रकृया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string> <string name="permlab_bindCellBroadcastService" msgid="586746677002040651">"मोबाइल प्रसारणसम्बन्धी सन्देशहरू फर्वार्ड गर्नुहोस्"</string> - <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"मोबाइल प्रसारणसम्बन्धी सन्देशहरू प्राप्त हुनासाथै तिनीहरूलाई फर्वार्ड गर्नका लागि यसले अनुप्रयोगलाई मोबाइल प्रसारण मोड्युलमा जोडिने अनुमति दिन्छ। तपाईंलाई कतिपय स्थानमा आपत्कालीन अवस्थाका बारेमा जानकारी दिनका लागि मोबाइल प्रसारणसम्बन्धी अलर्टहरू पठाइन्छ। हानिकारक अनुप्रयोगहरूले आपत्कालीन मोबाइल प्रसारण प्राप्त हुँदा तपाईंको यन्त्रलाई कार्य सम्पादन गर्ने वा सञ्चालित हुने क्रममा हस्तक्षेप गर्न सक्छन्।"</string> + <string name="permdesc_bindCellBroadcastService" msgid="6540910200973641606">"मोबाइल प्रसारणसम्बन्धी सन्देशहरू प्राप्त हुनासाथै तिनीहरूलाई फर्वार्ड गर्नका लागि यसले एपलाई मोबाइल प्रसारण मोड्युलमा जोडिने अनुमति दिन्छ। तपाईंलाई कतिपय स्थानमा आपत्कालीन अवस्थाका बारेमा जानकारी दिनका लागि मोबाइल प्रसारणसम्बन्धी अलर्टहरू पठाइन्छ। हानिकारक एपहरूले आपत्कालीन मोबाइल प्रसारण प्राप्त हुँदा तपाईंको यन्त्रलाई कार्य सम्पादन गर्ने वा सञ्चालित हुने क्रममा हस्तक्षेप गर्न सक्छन्।"</string> <string name="permlab_readCellBroadcasts" msgid="5869884450872137693">"सेल प्रसारित सन्देशहरू पढ्नुहोस्"</string> - <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"तपाईंको उपकरणद्वारा प्राप्त सेल प्रसारण सन्देशहरू अनुप्रयोगलाई पढ्न अनुमति दिन्छ। सेल प्रसारण चेतावनीहरू केही स्थानहरूमा तपाईंलाई आपतकालीन गतिविधिहरूको बारेमा सचेत गराउन गरिएका छन्। खराब अनुप्रयोगहरूले एउटा आपतकालीन सेल प्रसारण प्राप्त गर्दछ जब तपाईंको उपकरणको प्रदर्शन वा अपरेशनको साथ हस्तक्षेप गर्न सक्दछन्।"</string> + <string name="permdesc_readCellBroadcasts" msgid="672513437331980168">"तपाईंको उपकरणद्वारा प्राप्त सेल प्रसारण सन्देशहरू एपलाई पढ्न अनुमति दिन्छ। सेल प्रसारण चेतावनीहरू केही स्थानहरूमा तपाईंलाई आपतकालीन गतिविधिहरूको बारेमा सचेत गराउन गरिएका छन्। खराब एपहरूले एउटा आपतकालीन सेल प्रसारण प्राप्त गर्दछ जब तपाईंको उपकरणको प्रदर्शन वा अपरेशनको साथ हस्तक्षेप गर्न सक्दछन्।"</string> <string name="permlab_subscribedFeedsRead" msgid="217624769238425461">"सदस्य बनाइका फिडहरू पढ्नुहोस्"</string> - <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"अनुप्रयोगलाई अहिलेको समीकरण गरिएका सूचकहरू बारे विवरणहरू लिने अनुमति दिन्छ।"</string> + <string name="permdesc_subscribedFeedsRead" msgid="6911349196661811865">"एपलाई अहिलेको समीकरण गरिएका सूचकहरू बारे विवरणहरू लिने अनुमति दिन्छ।"</string> <string name="permlab_sendSms" msgid="7757368721742014252">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string> - <string name="permdesc_sendSms" msgid="6757089798435130769">"अनुप्रयोगलाई SMS सन्देशहरू पठाउन अनुमति दिन्छ। यसले अप्रत्यासित चार्जहरूको परिणाम दिन सक्दछ। खराब अनुप्रयोगहरूले तपाईंको पुष्टि बिना सन्देशहरू पठाएर तपाईंको पैसा खर्च गराउन सक्दछ।"</string> + <string name="permdesc_sendSms" msgid="6757089798435130769">"एपलाई SMS सन्देशहरू पठाउन अनुमति दिन्छ। यसले अप्रत्यासित चार्जहरूको परिणाम दिन सक्दछ। खराब एपहरूले तपाईंको पुष्टि बिना सन्देशहरू पठाएर तपाईंको पैसा खर्च गराउन सक्दछ।"</string> <string name="permlab_readSms" msgid="5164176626258800297">"तपाईंका पाठ सन्देशहरू (SMS वा MMS) पढ्नुहोस्"</string> <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"यस अनुप्रयोगले तपाईंको ट्याब्लेटमा भण्डारण गरिएका सबै SMS (पाठ) सन्देशहरू पढ्न सक्छ।"</string> <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"यस अनुप्रयोगले तपाईंको Android TV यन्त्रमा भण्डार गरिएका सबै SMS.(पाठ) सन्देशहरू पढ्न सक्छ।"</string> <string name="permdesc_readSms" product="default" msgid="774753371111699782">"यस अनुप्रयोगले तपाईंको फोनमा भण्डारण गरिएका सबै SMS (पाठ) सन्देशहरू पढ्न सक्छ।"</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"पाठ सन्देशहरू (WAP) प्राप्त गर्नुहोस्"</string> - <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP सन्देशहरू प्राप्त गर्न र प्रशोधन गर्न अनुप्रयोगलाई अनुमति दिन्छ। यो अनुमतिमा मोनिटर गर्ने वा तपाईँलाई पठाइएका सन्देशहरू तपाईँलाई नदेखाई मेट्ने क्षमता समावेश हुन्छ।"</string> + <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"WAP सन्देशहरू प्राप्त गर्न र प्रशोधन गर्न एपलाई अनुमति दिन्छ। यो अनुमतिमा मोनिटर गर्ने वा तपाईँलाई पठाइएका सन्देशहरू तपाईँलाई नदेखाई मेट्ने क्षमता समावेश हुन्छ।"</string> <string name="permlab_getTasks" msgid="7460048811831750262">"चलिरहेका एपहरू पुनःबहाली गर्नुहोस्"</string> - <string name="permdesc_getTasks" msgid="7388138607018233726">"वर्तमानमा र भरखरै चलिरहेका कार्यहरू बारेको सूचना पुनःबहाली गर्न अनुप्रयोगलाई अनुमित दिन्छ। यसले उपकरणमा प्रयोग भएका अनुप्रयोगहरूको बारेमा सूचना पत्ता लगाउन अनुप्रयोगलाई अनुमति दिन सक्छ।"</string> + <string name="permdesc_getTasks" msgid="7388138607018233726">"वर्तमानमा र भरखरै चलिरहेका कार्यहरू बारेको सूचना पुनःबहाली गर्न एपलाई अनुमित दिन्छ। यसले उपकरणमा प्रयोग भएका अनुप्रयोगहरूको बारेमा सूचना पत्ता लगाउन एपलाई अनुमति दिन सक्छ।"</string> <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"प्रोफाइल र यन्त्र मालिकहरूको व्यवस्थापन गराउनुहोस्"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"अनुप्रयोगहरूलाई प्रोफाइल र यन्त्र मालिकहरू सेट गर्न अनुमति दिनुहोस्।"</string> <string name="permlab_reorderTasks" msgid="7598562301992923804">"चलिरहेका अनुप्रयोगहरूलाई पुनःक्रम गराउनुहोस्"</string> - <string name="permdesc_reorderTasks" msgid="8796089937352344183">"कामहरूलाई अग्रभाग र पृष्ठभूमिमा सार्न अनुप्रयोगलाई अनुमति दिन्छ। अनुप्रयोगले यो तपाईँको इनपुट बिना नै गर्न सक्छ।"</string> + <string name="permdesc_reorderTasks" msgid="8796089937352344183">"कामहरूलाई अग्रभाग र पृष्ठभूमिमा सार्न एपलाई अनुमति दिन्छ। अनुप्रयोगले यो तपाईँको इनपुट बिना नै गर्न सक्छ।"</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"कार मोड सक्षम गर्नुहोस्"</string> - <string name="permdesc_enableCarMode" msgid="56419168820473508">"कार मोडलाई सक्षम पार्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_enableCarMode" msgid="56419168820473508">"कार मोडलाई सक्षम पार्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"एपहरू बन्द गर्नुहोस्"</string> - <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"अनुप्रयोगलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य अनुप्रयोगहरूलाई चल्नबाट रोक्न सक्दछ।"</string> + <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"एपलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य अनुप्रयोगहरूलाई चल्नबाट रोक्न सक्दछ।"</string> <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"यो एप अन्य एपहरूमाथि देखा पर्न सक्छ"</string> <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"यो एप अन्य एपहरूमाथि वा स्क्रिनका अन्य भागहरूमा देखा पर्न सक्छ। यसले एपको सामान्य प्रयोगमा अवरोध पुर्याउन सक्छ र अन्य एपहरू देखा पर्ने तरिकालाई परिवर्तन गर्न सक्छ।"</string> <string name="permlab_runInBackground" msgid="541863968571682785">"पृष्ठभूमिमा चलाउनुहोस्"</string> @@ -378,37 +378,37 @@ <string name="permlab_useDataInBackground" msgid="783415807623038947">"पृष्ठभूमिमा डेटा प्रयोग गर्नुहोस्"</string> <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"यो अनुप्रयोगले पृष्ठभूमिमा डेटा प्रयोग गर्नसक्छ। यसले गर्दा धेरै डेटा प्रयोग हुनसक्छ।"</string> <string name="permlab_persistentActivity" msgid="464970041740567970">"एपहरू जहिले पनि चल्ने बनाउनुहोस्"</string> - <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि अनुप्रयोगलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य अनुप्रयोगहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string> - <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"अनुप्रयोगलाई आफ्ना केही अंशहरू मेमोरीमा स्थायी रूपमा राख्ने अनुमति दिन्छ। यसले गर्दा अन्य अनुप्रयोगहरूका लागि मेमोरीको अभाव हुन सक्ने भएकाले तपाईंको Android TV यन्त्र सुस्त हुन सक्छ।"</string> - <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"अनुप्रयोगलाई मेमोरीमा आफैंको निरन्तरको अंश बनाउन अनुमति दिन्छ। यसले फोनलाई ढिला बनाएर अन्य अनुप्रयोगहरूमा मेमोरी SIMित गर्न सक्दछन्।"</string> + <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि एपलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य अनुप्रयोगहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string> + <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"एपलाई आफ्ना केही अंशहरू मेमोरीमा स्थायी रूपमा राख्ने अनुमति दिन्छ। यसले गर्दा अन्य अनुप्रयोगहरूका लागि मेमोरीको अभाव हुन सक्ने भएकाले तपाईंको Android TV यन्त्र सुस्त हुन सक्छ।"</string> + <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"एपलाई मेमोरीमा आफैंको निरन्तरको अंश बनाउन अनुमति दिन्छ। यसले फोनलाई ढिला बनाएर अन्य अनुप्रयोगहरूमा मेमोरी SIMित गर्न सक्दछन्।"</string> <string name="permlab_foregroundService" msgid="1768855976818467491">"अग्रभूमिको सेवा सञ्चालन गर्नुहोस्"</string> - <string name="permdesc_foregroundService" msgid="8720071450020922795">"अनुप्रयोगलाई अग्रभूमिका सेवाहरू प्रयोग गर्ने अनुमति दिन्छ।"</string> + <string name="permdesc_foregroundService" msgid="8720071450020922795">"एपलाई अग्रभूमिका सेवाहरू प्रयोग गर्ने अनुमति दिन्छ।"</string> <string name="permlab_getPackageSize" msgid="375391550792886641">"एप भण्डारण ठाउँको मापन गर्नुहोस्"</string> - <string name="permdesc_getPackageSize" msgid="742743530909966782">"अनुप्रयोगलाई यसको कोड, डेटा, र क्यास आकारहरू पुनःप्राप्त गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_getPackageSize" msgid="742743530909966782">"एपलाई यसको कोड, डेटा, र क्यास आकारहरू पुनःप्राप्त गर्न अनुमति दिन्छ।"</string> <string name="permlab_writeSettings" msgid="8057285063719277394">"प्रणाली सेटिङहरू परिमार्जन गर्नुहोस्"</string> - <string name="permdesc_writeSettings" msgid="8293047411196067188">"प्रणालीका सेटिङ डेटालाई परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले सायद तपाईँको प्रणालीको कन्फिगरेसनलाई क्षति पुर्याउन सक्छन्।"</string> + <string name="permdesc_writeSettings" msgid="8293047411196067188">"प्रणालीका सेटिङ डेटालाई परिवर्तन गर्नको लागि एपलाई अनुमति दिन्छ। खराब एपहरूले सायद तपाईँको प्रणालीको कन्फिगरेसनलाई क्षति पुर्याउन सक्छन्।"</string> <string name="permlab_receiveBootCompleted" msgid="6643339400247325379">"स्टार्टअपमा चलाउनुहोस्"</string> - <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"आनुप्रयोगलाई प्रणाली बुट प्रक्रिया पूर्ण हुने बितिकै आफैलाई सुरु गर्ने अनुमति दिन्छ। यसले ट्याब्लेट सुरु गर्नमा ढिला गर्न सक्दछ र अनुप्रयोगलाई समग्रमा ट्याब्लेट सधैँ चालु गरेर ढिला बनाउँदछ।"</string> + <string name="permdesc_receiveBootCompleted" product="tablet" msgid="5565659082718177484">"आनुप्रयोगलाई प्रणाली बुट प्रक्रिया पूर्ण हुने बितिकै आफैलाई सुरु गर्ने अनुमति दिन्छ। यसले ट्याब्लेट सुरु गर्नमा ढिला गर्न सक्दछ र एपलाई समग्रमा ट्याब्लेट सधैँ चालु गरेर ढिला बनाउँदछ।"</string> <string name="permdesc_receiveBootCompleted" product="tv" msgid="4900842256047614307">"एपलाई प्रणाली बुट हुने बित्तिकै स्वत: सुरु हुने अनुमति दिन्छ। यसो गर्दा एप सधैँ चलिरहने भएकाले तपाईंको Android TV यन्त्र सुरु हुन बढी समय लाग्नुका साथै यन्त्रको समग्र कार्यसम्पादन सुस्त हुन सक्छ।"</string> - <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"अनुप्रयोगलाई प्रणाली बुट गरी सकेपछि जति सक्दो चाँडो आफैंमा सुरु गर्न अनुमति दिन्छ। यसले फोन सुरु गर्नमा ढिला गर्न सक्दछ र अनप्रयोगलाई समग्रमा फोन सधैँ चालु गरेर ढिला बनाउँदछ।"</string> + <string name="permdesc_receiveBootCompleted" product="default" msgid="7912677044558690092">"एपलाई प्रणाली बुट गरी सकेपछि जति सक्दो चाँडो आफैंमा सुरु गर्न अनुमति दिन्छ। यसले फोन सुरु गर्नमा ढिला गर्न सक्दछ र अनप्रयोगलाई समग्रमा फोन सधैँ चालु गरेर ढिला बनाउँदछ।"</string> <string name="permlab_broadcastSticky" msgid="4552241916400572230">"स्टिकि प्रसारण पठाउनुहोस्"</string> - <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"औपचारिक प्रसारणलाई पठाउनको लागि एउटा अनुप्रयोगलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले ट्याब्लेटलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> - <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"अनुप्रयोगलाई प्रसारण समाप्त भइसकेपछि पनि रहिरहने स्टिकी प्रसारणहरू पठाउने अनुमति दिन्छ। यो सुविधाको अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग हुने भएकाले तपाईंको Android TV यन्त्र सुस्त वा अस्थिर हुन सक्छ।"</string> - <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"औपचारिक प्रसारणलाई पठाउनको लागि एक अनुप्रयोगलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले फोनलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> + <string name="permdesc_broadcastSticky" product="tablet" msgid="5058486069846384013">"औपचारिक प्रसारणलाई पठाउनको लागि एउटा एपलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले ट्याब्लेटलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> + <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"एपलाई प्रसारण समाप्त भइसकेपछि पनि रहिरहने स्टिकी प्रसारणहरू पठाउने अनुमति दिन्छ। यो सुविधाको अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग हुने भएकाले तपाईंको Android TV यन्त्र सुस्त वा अस्थिर हुन सक्छ।"</string> + <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"औपचारिक प्रसारणलाई पठाउनको लागि एक एपलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले फोनलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> <string name="permlab_readContacts" msgid="8776395111787429099">"तपाईँका सम्पर्कहरू पढ्नुहोस्"</string> - <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"अनुप्रयोगलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। अनुप्रयोगहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका अनुप्रयोगहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक अनुप्रयोगहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> - <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। अनुप्रयोगहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android TV यन्त्रमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका अनुप्रयोगहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक अनुप्रयोगहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> - <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"अनुप्रयोगलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। अनुप्रयोगहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका अनुप्रयोगहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक अनुप्रयोगहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"एपलाई तपाईंको Android TV यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android TV यन्त्रमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"एपलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> <string name="permlab_writeContacts" msgid="8919430536404830430">"तपाईँका सम्पर्कहरू परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"अनुप्रयोगलाई तपाईंको ट्याब्लेटमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले अनुप्रयोगलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> - <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले अनुप्रयोगलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> - <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"अनुप्रयोगलाई तपाईंको फोनमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले अनुप्रयोगलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> + <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"एपलाई तपाईंको ट्याब्लेटमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> + <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"एपलाई तपाईंको Android TV यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> + <string name="permdesc_writeContacts" product="default" msgid="8304795696237065281">"एपलाई तपाईंको फोनमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> <string name="permlab_readCallLog" msgid="1739990210293505948">"कल लग पढ्नुहोस्"</string> <string name="permdesc_readCallLog" msgid="8964770895425873433">"यस अनुप्रयोगले तपाईंको फोन सम्पर्कको इतिहास पढ्न सक्छ।"</string> <string name="permlab_writeCallLog" msgid="670292975137658895">"कल लग लेख्नुहोस्"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"आगमन तथा बहर्गमन डेटासहित तपाईँको ट्याब्लेटको कल लगको परिमार्जन गर्न अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले यसलाई तपाईँको कल लग परिमार्जन गर्न वा मेटाउन प्रयोग गर्न सक्छन्।"</string> - <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको आगमन र बहिर्गमन कलसम्बन्धी डेटासहित कल लग परिमार्जन गर्ने अनुमति दिन्छ। हानिकारक अनुप्रयोगहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्छन्।"</string> - <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"अनुप्रयोगलाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमार्जन गर्न अनुमति दिन्छ। खराब अनुप्रयोगहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्दछ।"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"आगमन तथा बहर्गमन डेटासहित तपाईँको ट्याब्लेटको कल लगको परिमार्जन गर्न एपलाई अनुमति दिन्छ। खराब एपहरूले यसलाई तपाईँको कल लग परिमार्जन गर्न वा मेटाउन प्रयोग गर्न सक्छन्।"</string> + <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"एपलाई तपाईंको Android TV यन्त्रको आगमन र बहिर्गमन कलसम्बन्धी डेटासहित कल लग परिमार्जन गर्ने अनुमति दिन्छ। हानिकारक एपहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्छन्।"</string> + <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"एपलाई तपाईंको फोनको आउने र बाहिर जाने कलहरूको बारेको डेटा सहित कल लग परिमार्जन गर्न अनुमति दिन्छ। खराब एपहरूले यसलाई तपाईंको कल लग मेटाउन वा परिमार्जन गर्न प्रयोग गर्न सक्दछ।"</string> <string name="permlab_bodySensors" msgid="3411035315357380862">"शरीरका सेन्सरहरूमा पहुँच गराउनुहोस् (जस्तै हृदय धड्कन निगरानीहरू)"</string> <string name="permdesc_bodySensors" product="default" msgid="2365357960407973997">"तपाईँको हृदय गति जस्तो सेंसर बाट डेटा पहुँचको लागि एप अनुमति दिन्छ जसले तपाईँको भौतिक अवस्था अनुगमन गर्छ।"</string> <string name="permlab_readCalendar" msgid="6408654259475396200">"पात्रोका कार्यक्रम र विवरणहरू पढ्ने"</string> @@ -420,7 +420,7 @@ <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"यस अनुप्रयोगले तपाईंको Android TV यन्त्रमा पात्रोका कार्यक्रमहरू थप्न, हटाउन वा परिवर्तन गर्न सक्छ। यस अनुप्रयोगले पात्रोका मालिकहरूले पठाएको जस्तै देखिने सन्देशहरू पठाउन वा कार्यक्रमका मालिकहरूलाई सूचित नगरिकन कार्यक्रमहरू परिवर्तन गर्न सक्छ।"</string> <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"यस अनुप्रयोगले तपाईंको फोनमा पात्रोका कार्यक्रमहरू थप्न, हटाउन वा परिवर्तन गर्न सक्छ। यस अनुप्रयोगले पात्रोका मालिकहरू मार्फत आएको जस्तो लाग्ने सन्देशहरू पठाउन वा तिनीहरूका मालिकहरूलाई सूचित नगरिकन कार्यक्रमहरू परिवर्तन गर्न सक्छ।"</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"अधिक स्थान प्रदायक आदेशहरू पहुँच गर्नुहोस्"</string> - <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"अनुप्रयोगलाई अतिरिक्त स्थान प्रदायक आदेशहरू पहुँच गर्न अनुमति दिन्छ। यो अनुप्रयोगलाई GPS वा अन्य स्थान स्रोतहरूको संचालन साथै हस्तक्षेप गर्न अनुमति दिन सक्छ।"</string> + <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"एपलाई अतिरिक्त स्थान प्रदायक आदेशहरू पहुँच गर्न अनुमति दिन्छ। यो एपलाई GPS वा अन्य स्थान स्रोतहरूको संचालन साथै हस्तक्षेप गर्न अनुमति दिन सक्छ।"</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"अग्रभूमिमा मात्र सटीक स्थानमाथि पहुँच राख्नुहोस्"</string> <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"यो एप चलाएका बेला यसले स्थानसम्बन्धी सेवाहरूबाट तपाईंको स्थानको सटीक जानकारी प्राप्त गर्न सक्छ। तपाईंको यन्त्रमा स्थानसम्बन्धी सेवाहरू सक्रिय गरिएको छ भने मात्र यो एपले स्थानको जानकारी प्राप्त गर्न सक्छ। यसले ब्याट्रीको उपयोग बढाउन सक्छ।"</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"अग्रभागमा मात्र अनुमानित स्थानमाथि पहुँच राख्नुहोस्"</string> @@ -428,11 +428,11 @@ <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"पृष्ठभूमिमा स्थानसम्बन्धी पहुँच"</string> <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"यो एपले जुनसुकै बेला (एप नचलाएका बेलामा पनि) स्थानमाथि पहुँच राख्न सक्छ।"</string> <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै भोल्युम र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string> + <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"एपलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै भोल्युम र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string> <string name="permlab_recordAudio" msgid="1208457423054219147">"अडियो रेकर्ड गर्नुहोस्"</string> <string name="permdesc_recordAudio" msgid="3976213377904701093">"यस अनुप्रयोगले जुनसुकै समय माइक्रोफोनको प्रयोग गरी अडियो रेकर्ड गर्न सक्छ।"</string> <string name="permlab_sim_communication" msgid="176788115994050692">"SIM मा आदेशहरू पठाउन दिनुहोस्"</string> - <string name="permdesc_sim_communication" msgid="4179799296415957960">"SIM लाई आदेश पठाउन अनुप्रयोगलाई अनुमति दिन्छ। यो निकै खतरनाक हुन्छ।"</string> + <string name="permdesc_sim_communication" msgid="4179799296415957960">"SIM लाई आदेश पठाउन एपलाई अनुमति दिन्छ। यो निकै खतरनाक हुन्छ।"</string> <string name="permlab_activityRecognition" msgid="1782303296053990884">"शारीरिक गतिविधि पहिचान गर्नुहोस्"</string> <string name="permdesc_activityRecognition" msgid="8667484762991357519">"यो अनुप्रयोगले तपाईंको शारीरिक गतिविधिको पहिचान गर्न सक्छ।"</string> <string name="permlab_camera" msgid="6320282492904119413">"तस्बिरहरू र भिडियोहरू लिनुहोस्।"</string> @@ -442,100 +442,100 @@ <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"कुनै एप वा सेवालाई खोलिँदै वा बन्द गरिँदै गरेका क्यामेरा यन्त्रहरूका बारेमा कलब्याक प्राप्त गर्ने अनुमति दिनुहोस्।"</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"कुनै क्यामेरा यन्त्र खोलिँदा (कुन अनुप्रयोगले खोलेको भन्ने बारेमा) वा बन्द गरिँदा यो अनुप्रयोगले कलब्याक प्राप्त गर्न सक्छ।"</string> <string name="permlab_vibrate" msgid="8596800035791962017">"कम्पन नियन्त्रण गर्नुहोस्"</string> - <string name="permdesc_vibrate" msgid="8733343234582083721">"अनुप्रयोगलाई भाइब्रेटर नियन्त्रण गर्न अनुमति दिन्छ।"</string> - <string name="permdesc_vibrator_state" msgid="7050024956594170724">"यो अनुप्रयोगलाई कम्पनको स्थितिमाथि पहुँच राख्न दिनुहोस्।"</string> + <string name="permdesc_vibrate" msgid="8733343234582083721">"एपलाई भाइब्रेटर नियन्त्रण गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_vibrator_state" msgid="7050024956594170724">"यो एपलाई कम्पनको स्थितिमाथि पहुँच राख्न दिनुहोस्।"</string> <string name="permlab_callPhone" msgid="1798582257194643320">"फोन नम्बरहरूमा सीधै कल गर्नुहोस्"</string> - <string name="permdesc_callPhone" msgid="5439809516131609109">"तपाईँको हस्तक्षेप बेगरै फोन नम्बर कल गर्न अनुप्रयोगलाई अनुमति दिन्छ। यसले अनपेक्षित शुल्क वा कलहरू गराउन सक्छ। यसले अनुप्रयोगलाई आपतकालीन नम्बरहरू कल गर्न अनुमति दिँदैन विचार गर्नुहोस्। खराब अनुप्रयोगहरूले तपाईँको स्वीकार बिना कलहरू गरेर तपाईँलाई बढी पैसा तिराउन सक्छ।"</string> + <string name="permdesc_callPhone" msgid="5439809516131609109">"तपाईँको हस्तक्षेप बेगरै फोन नम्बर कल गर्न एपलाई अनुमति दिन्छ। यसले अनपेक्षित शुल्क वा कलहरू गराउन सक्छ। यसले एपलाई आपतकालीन नम्बरहरू कल गर्न अनुमति दिँदैन विचार गर्नुहोस्। खराब एपहरूले तपाईँको स्वीकार बिना कलहरू गरेर तपाईँलाई बढी पैसा तिराउन सक्छ।"</string> <string name="permlab_accessImsCallService" msgid="442192920714863782">"IMS कल सेवा पहुँच गर्नुहोस्"</string> - <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"तपाईँको हस्तक्षेप बिना नै कल गर्न IMS सेवा प्रयोग गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_accessImsCallService" msgid="6328551241649687162">"तपाईँको हस्तक्षेप बिना नै कल गर्न IMS सेवा प्रयोग गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_readPhoneState" msgid="8138526903259297969">"फोन स्थिति र पहिचान पढ्नुहोस्"</string> - <string name="permdesc_readPhoneState" msgid="7229063553502788058">"उपकरणको फोन विशेषताहरूको पहुँच गर्न अनुप्रयोगलाई अनुमति दिन्छ। यस अनुमतिले फोन नम्बर र उपकरणको IDs, कल सक्षम छ कि छैन र कलद्वारा जोडिएको टाढाको नम्बर निर्धारण गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_readPhoneState" msgid="7229063553502788058">"उपकरणको फोन विशेषताहरूको पहुँच गर्न एपलाई अनुमति दिन्छ। यस अनुमतिले फोन नम्बर र उपकरणको IDs, कल सक्षम छ कि छैन र कलद्वारा जोडिएको टाढाको नम्बर निर्धारण गर्न अनुमति दिन्छ।"</string> <string name="permlab_manageOwnCalls" msgid="9033349060307561370">"प्रणाली मार्फत कल गर्न दिनुहोस्"</string> - <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"कल गर्दाको अनुभवलाई सुधार्न यस अनुप्रयोगलाई प्रणाली मार्फत कलहरू गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_manageOwnCalls" msgid="4431178362202142574">"कल गर्दाको अनुभवलाई सुधार्न यस एपलाई प्रणाली मार्फत कलहरू गर्न अनुमति दिन्छ।"</string> <string name="permlab_callCompanionApp" msgid="3654373653014126884">"प्रणालीमार्फत कलहरू हेर्नुका साथै तिनीहरूलाई नियन्त्रण गर्नुहोस्।"</string> - <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"अनुप्रयोगलाई यन्त्रमा जारी रहेका कलहरू हेर्नुका साथै तिनीहरूलाई गर्ने अनुमति दिनुहोस्। यसमा गरिएका कलहरूको सङ्ख्या र कलहरूको अवस्था जस्ता जानकारी समावेश हुन्छन्।"</string> + <string name="permdesc_callCompanionApp" msgid="8474168926184156261">"एपलाई यन्त्रमा जारी रहेका कलहरू हेर्नुका साथै तिनीहरूलाई गर्ने अनुमति दिनुहोस्। यसमा गरिएका कलहरूको सङ्ख्या र कलहरूको अवस्था जस्ता जानकारी समावेश हुन्छन्।"</string> <string name="permlab_exemptFromAudioRecordRestrictions" msgid="1164725468350759486">"अडियो रेकर्ड गर्ने कार्यमा लगाइएका प्रतिबन्धहरूबाट छुट दिनुहोस्"</string> - <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"यो अनुप्रयोगलाई अडियो रेकर्ड गर्ने कार्यमा लगाइएका प्रतिबन्धहरूबाट छुट दिनुहोस्।"</string> + <string name="permdesc_exemptFromAudioRecordRestrictions" msgid="2425117015896871976">"यो एपलाई अडियो रेकर्ड गर्ने कार्यमा लगाइएका प्रतिबन्धहरूबाट छुट दिनुहोस्।"</string> <string name="permlab_acceptHandover" msgid="2925523073573116523">"अर्को अनुप्रयोगमा सुरु गरिएको कल जारी राख्नुहोस्"</string> - <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"यस अनुप्रयोगलाई अर्को अनुप्रयोगमा सुरु गरिएको कल जारी राख्ने अनुमति दिन्छ।"</string> + <string name="permdesc_acceptHandovers" msgid="7129026180128626870">"यस एपलाई अर्को अनुप्रयोगमा सुरु गरिएको कल जारी राख्ने अनुमति दिन्छ।"</string> <string name="permlab_readPhoneNumbers" msgid="5668704794723365628">"फोन नम्बरहरू पढ्ने"</string> - <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"उक्त अनुप्रयोगलाई यस यन्त्रको फोन नम्बरहरूमाथि पहुँच राख्न दिनुहोस्।"</string> + <string name="permdesc_readPhoneNumbers" msgid="7368652482818338871">"उक्त एपलाई यस यन्त्रको फोन नम्बरहरूमाथि पहुँच राख्न दिनुहोस्।"</string> <string name="permlab_wakeLock" product="automotive" msgid="1904736682319375676">"कारको स्क्रिन सक्रिय राख्नुहोस्"</string> <string name="permlab_wakeLock" product="tablet" msgid="1527660973931694000">"ट्याब्लेटलाई निन्द्रामा जानबाट रोक्नुहोस्"</string> <string name="permlab_wakeLock" product="tv" msgid="2856941418123343518">"आफ्नो Android TV यन्त्रलाई शयन अवस्थामा जान नदिनुहोस्"</string> <string name="permlab_wakeLock" product="default" msgid="569409726861695115">"फोनलाई निदाउनबाट रोक्नुहोस्"</string> - <string name="permdesc_wakeLock" product="automotive" msgid="5995045369683254571">"यो अनुमतिले यस अनुप्रयोगलाई कारको स्क्रिन सक्रिय राख्न दिन्छ।"</string> - <string name="permdesc_wakeLock" product="tablet" msgid="2441742939101526277">"ट्याब्लेटलाई निस्क्रिय हुनबाट रोक्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> - <string name="permdesc_wakeLock" product="tv" msgid="2329298966735118796">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रलाई शयन अवस्थामा जानबाट रोक्ने अनुमति दिन्छ।"</string> - <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"फोनलाई निस्क्रिय हुनबाट रोक्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_wakeLock" product="automotive" msgid="5995045369683254571">"यो अनुमतिले यस एपलाई कारको स्क्रिन सक्रिय राख्न दिन्छ।"</string> + <string name="permdesc_wakeLock" product="tablet" msgid="2441742939101526277">"ट्याब्लेटलाई निस्क्रिय हुनबाट रोक्नको लागि एपलाई अनुमति दिन्छ।"</string> + <string name="permdesc_wakeLock" product="tv" msgid="2329298966735118796">"एपलाई तपाईंको Android TV यन्त्रलाई शयन अवस्थामा जानबाट रोक्ने अनुमति दिन्छ।"</string> + <string name="permdesc_wakeLock" product="default" msgid="3689523792074007163">"फोनलाई निस्क्रिय हुनबाट रोक्नको लागि एपलाई अनुमति दिन्छ।"</string> <string name="permlab_transmitIr" msgid="8077196086358004010">"infrared ट्रान्समिट गर्नुहोस्"</string> <string name="permdesc_transmitIr" product="tablet" msgid="5884738958581810253">"ट्याबलेटको infrared transmitter प्रयोगको लागि एप अनुमति दिन्छ।"</string> - <string name="permdesc_transmitIr" product="tv" msgid="3278506969529173281">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको इन्फ्रारेड ट्रान्समिटर प्रयोग गर्ने अनुमति दिन्छ।"</string> + <string name="permdesc_transmitIr" product="tv" msgid="3278506969529173281">"एपलाई तपाईंको Android TV यन्त्रको इन्फ्रारेड ट्रान्समिटर प्रयोग गर्ने अनुमति दिन्छ।"</string> <string name="permdesc_transmitIr" product="default" msgid="8484193849295581808">"फोनको infrared transmitter प्रयोगको लागि एप अनुमति दिन्छ।"</string> <string name="permlab_setWallpaper" msgid="6959514622698794511">"वालपेपर सेट गर्नुहोस्"</string> - <string name="permdesc_setWallpaper" msgid="2973996714129021397">"अनुप्रयोगलाई प्रणाली वालपेपर सेट गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_setWallpaper" msgid="2973996714129021397">"एपलाई प्रणाली वालपेपर सेट गर्न अनुमति दिन्छ।"</string> <string name="permlab_setWallpaperHints" msgid="1153485176642032714">"तपाईंको वालपेपर आकार समायोजन गर्नुहोस्"</string> - <string name="permdesc_setWallpaperHints" msgid="6257053376990044668">"प्रणाली वालपेपरको आकार सङ्केतहरू मिलाउन अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_setWallpaperHints" msgid="6257053376990044668">"प्रणाली वालपेपरको आकार सङ्केतहरू मिलाउन एपलाई अनुमति दिन्छ।"</string> <string name="permlab_setTimeZone" msgid="7922618798611542432">"समय क्षेत्र सेट गर्नुहोस्"</string> - <string name="permdesc_setTimeZone" product="tablet" msgid="1788868809638682503">"अनुप्रयोगलाई ट्याब्लेटको समय क्षेत्र परिवर्तन गर्न अनुमति दिन्छ।"</string> - <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको समय क्षेत्र परिवर्तन गर्ने अनुमति दिन्छ।"</string> - <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"अनुप्रयोगलाई फोनको समय क्षेत्र परिवर्तन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_setTimeZone" product="tablet" msgid="1788868809638682503">"एपलाई ट्याब्लेटको समय क्षेत्र परिवर्तन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"एपलाई तपाईंको Android TV यन्त्रको समय क्षेत्र परिवर्तन गर्ने अनुमति दिन्छ।"</string> + <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"एपलाई फोनको समय क्षेत्र परिवर्तन गर्न अनुमति दिन्छ।"</string> <string name="permlab_getAccounts" msgid="5304317160463582791">"उपकरणमा खाताहरू भेट्टाउनुहोस्"</string> - <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"अनुप्रयोगलाई ट्याब्लेटद्वारा ज्ञात खाताहरूको सूची पाउन अनुमति दिन्छ। यसले अनुप्रयोगद्वारा तपाईंले स्थापित गर्नुभएको कुनै पनि खाताहरू समावेश गर्न सक्दछ।"</string> - <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रले चिनेका खाताहरूको सूची प्राप्त गर्ने अनुमति दिन्छ। उक्त सूचीमा तपाईंले स्थापना गर्नुभएका अनुप्रयोगहरूले बनाएका कुनै पनि खाताहरू पर्न सक्छन्।"</string> - <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"फोनलाई थाहा भएका खाताहरूको सूची प्राप्त गर्न अनुप्रयोगलाई अनुमति दिन्छ। यसले तपाईँले स्थापना गर्नु भएका अनुप्रयोगहरूबाट सृजित कुनै खाताहरू समावेश हुन सक्छ।"</string> + <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"एपलाई ट्याब्लेटद्वारा ज्ञात खाताहरूको सूची पाउन अनुमति दिन्छ। यसले अनुप्रयोगद्वारा तपाईंले स्थापित गर्नुभएको कुनै पनि खाताहरू समावेश गर्न सक्दछ।"</string> + <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"एपलाई तपाईंको Android TV यन्त्रले चिनेका खाताहरूको सूची प्राप्त गर्ने अनुमति दिन्छ। उक्त सूचीमा तपाईंले स्थापना गर्नुभएका एपहरूले बनाएका कुनै पनि खाताहरू पर्न सक्छन्।"</string> + <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"फोनलाई थाहा भएका खाताहरूको सूची प्राप्त गर्न एपलाई अनुमति दिन्छ। यसले तपाईँले स्थापना गर्नु भएका अनुप्रयोगहरूबाट सृजित कुनै खाताहरू समावेश हुन सक्छ।"</string> <string name="permlab_accessNetworkState" msgid="2349126720783633918">"नेटवर्क जडानहरू हेर्नहोस्"</string> - <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"अनुप्रयोगलाई नेटवर्क जडानहरू जस्तै कुन नेटवर्कहरू अवस्थित हुन्छन् र जडित छन् जसले हेर्नलाई अनुमति दिन्छ।"</string> + <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"एपलाई नेटवर्क जडानहरू जस्तै कुन नेटवर्कहरू अवस्थित हुन्छन् र जडित छन् जसले हेर्नलाई अनुमति दिन्छ।"</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"पूर्ण नेटवर्क पहुँच प्राप्त छ"</string> - <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"नेटवर्क सकेटहरू सिर्जना गर्न र कस्टम नेटवर्क प्रोटोकल प्रयोग गर्न अनुप्रयोगलाई अनुमति दिन्छ। ब्राउजर र अन्य अनुप्रयोगहरूले इन्टरनेटमा डेटा पठाउने माध्यम प्रदान गर्छन्, त्यसैले इन्टरनेटमा डेटा पठाउन यो अनुमतिको आवश्यकता पर्दैन।"</string> + <string name="permdesc_createNetworkSockets" msgid="7722020828749535988">"नेटवर्क सकेटहरू सिर्जना गर्न र कस्टम नेटवर्क प्रोटोकल प्रयोग गर्न एपलाई अनुमति दिन्छ। ब्राउजर र अन्य एपहरूले इन्टरनेटमा डेटा पठाउने माध्यम प्रदान गर्छन्, त्यसैले इन्टरनेटमा डेटा पठाउन यो अनुमतिको आवश्यकता पर्दैन।"</string> <string name="permlab_changeNetworkState" msgid="8945711637530425586">"नेटवर्क जडान परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_changeNetworkState" msgid="649341947816898736">"अनुप्रयोगलाई नेटवर्क जडानको स्थिति परिवर्तन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_changeNetworkState" msgid="649341947816898736">"एपलाई नेटवर्क जडानको स्थिति परिवर्तन गर्न अनुमति दिन्छ।"</string> <string name="permlab_changeTetherState" msgid="9079611809931863861">"टेथर्ड नेटवर्क जडान परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_changeTetherState" msgid="3025129606422533085">"टेदर गरेको नेटवर्क जडानको स्थिति बदल्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_changeTetherState" msgid="3025129606422533085">"टेदर गरेको नेटवर्क जडानको स्थिति बदल्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_accessWifiState" msgid="5552488500317911052">"Wi-Fi जडानहरू हेर्नुहोस्"</string> - <string name="permdesc_accessWifiState" msgid="6913641669259483363">"अनुप्रयोगलाई Wi-Fi नेटवर्कको बारेमा जानकारी हेर्न अनुमति दिन्छ, जस्तै कि Wi-Fi सक्षम छ कि छैन र जडान गरिएको Wi-Fi उपकरणहरूको नाम।"</string> + <string name="permdesc_accessWifiState" msgid="6913641669259483363">"एपलाई Wi-Fi नेटवर्कको बारेमा जानकारी हेर्न अनुमति दिन्छ, जस्तै कि Wi-Fi सक्षम छ कि छैन र जडान गरिएको Wi-Fi उपकरणहरूको नाम।"</string> <string name="permlab_changeWifiState" msgid="7947824109713181554">"वाइ-फाइसँग जोड्नुहोस् वा छुटाउनुहोस्"</string> - <string name="permdesc_changeWifiState" msgid="7170350070554505384">"अनुप्रयोगलाई Wi-Fi पहुँच बिन्दुबाट जडान गर्न र विच्छेदन गर्न र Wi-Fi नेटवर्कहरूको लागि उपकरण कन्फिगरेसनमा परिवर्तनहरू गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_changeWifiState" msgid="7170350070554505384">"एपलाई Wi-Fi पहुँच बिन्दुबाट जडान गर्न र विच्छेदन गर्न र Wi-Fi नेटवर्कहरूको लागि उपकरण कन्फिगरेसनमा परिवर्तनहरू गर्न अनुमति दिन्छ।"</string> <string name="permlab_changeWifiMulticastState" msgid="285626875870754696">"Wi-Fi Multicast स्विकृतिलाई अनुमति दिनुहोस्"</string> - <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"अनुप्रयोगलाई मल्टिकाष्ट ठेगानाहरू प्रयोग गरेर Wi-Fi नेटवर्कमा पठाइएको प्याकेटहरू प्राप्त गर्न अनुमति दिन्छ, केवल तपाईंको ट्याब्लेट मात्र होइन। यसले गैर-मल्टिकाष्ट मोड भन्दा बढी उर्जा प्रयोग गर्दछ।"</string> - <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"अनुप्रयोगलाई मल्टिकास्ट ठेगानाहरू प्रयोग गरी तपाईंको Android TV यन्त्रमा मात्र नभई कुनै Wi-Fi नेटवर्कमा जोडिएका सबै यन्त्रहरूमा पठाइएका प्याकेटहरू प्राप्त गर्ने अनुमति दिन्छ। यसले गैर मल्टिकास्ट मोडभन्दा बढी पावर खपत गर्छ।"</string> - <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"तपाईँको फोन मात्र होइन, मल्टिकास्ट ठेगानाहरूको प्रयोग गरे Wi-Fi नेटवर्कका सबै उपकरणहरूमा पठाइएका प्याकेटहरू प्राप्त गर्न अनुप्रयोगलाई अनुमति दिन्छ। यसले गैर-मल्टिकास्ट मोडभन्दा बढी उर्जा प्रयोग गर्छ।"</string> + <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="191079868596433554">"एपलाई मल्टिकाष्ट ठेगानाहरू प्रयोग गरेर Wi-Fi नेटवर्कमा पठाइएको प्याकेटहरू प्राप्त गर्न अनुमति दिन्छ, केवल तपाईंको ट्याब्लेट मात्र होइन। यसले गैर-मल्टिकाष्ट मोड भन्दा बढी उर्जा प्रयोग गर्दछ।"</string> + <string name="permdesc_changeWifiMulticastState" product="tv" msgid="1336952358450652595">"एपलाई मल्टिकास्ट ठेगानाहरू प्रयोग गरी तपाईंको Android TV यन्त्रमा मात्र नभई कुनै Wi-Fi नेटवर्कमा जोडिएका सबै यन्त्रहरूमा पठाइएका प्याकेटहरू प्राप्त गर्ने अनुमति दिन्छ। यसले गैर मल्टिकास्ट मोडभन्दा बढी पावर खपत गर्छ।"</string> + <string name="permdesc_changeWifiMulticastState" product="default" msgid="8296627590220222740">"तपाईँको फोन मात्र होइन, मल्टिकास्ट ठेगानाहरूको प्रयोग गरे Wi-Fi नेटवर्कका सबै उपकरणहरूमा पठाइएका प्याकेटहरू प्राप्त गर्न एपलाई अनुमति दिन्छ। यसले गैर-मल्टिकास्ट मोडभन्दा बढी उर्जा प्रयोग गर्छ।"</string> <string name="permlab_bluetoothAdmin" msgid="6490373569441946064">"ब्लुटुथ सेटिङहरूमा पहुँच गर्नुहोस्"</string> - <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"स्थानीय ब्लुटुथ ट्याब्लेटलाई कन्फिगर गर्नको लागि र टाढाका उपकरणहरूलाई पत्ता लगाउन र जोड्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> - <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको ब्लुटुथ कन्फिगर गर्ने तथा टाढा रहेका यन्त्रहरू पत्ता लगाई ती यन्त्रहरूसँग जोडा बनाउने अनुमति दिन्छ।"</string> - <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"अनुप्रयोगलाई स्थानीय ब्लुटुथ फोन कन्फिगर गर्न र टाढाका उपकरणहरूसँग खोज गर्न र जोडी गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_bluetoothAdmin" product="tablet" msgid="5370837055438574863">"स्थानीय ब्लुटुथ ट्याब्लेटलाई कन्फिगर गर्नको लागि र टाढाका उपकरणहरूलाई पत्ता लगाउन र जोड्नको लागि एपलाई अनुमति दिन्छ।"</string> + <string name="permdesc_bluetoothAdmin" product="tv" msgid="1623992984547014588">"एपलाई तपाईंको Android TV यन्त्रको ब्लुटुथ कन्फिगर गर्ने तथा टाढा रहेका यन्त्रहरू पत्ता लगाई ती यन्त्रहरूसँग जोडा बनाउने अनुमति दिन्छ।"</string> + <string name="permdesc_bluetoothAdmin" product="default" msgid="7381341743021234863">"एपलाई स्थानीय ब्लुटुथ फोन कन्फिगर गर्न र टाढाका उपकरणहरूसँग खोज गर्न र जोडी गर्न अनुमति दिन्छ।"</string> <string name="permlab_accessWimaxState" msgid="7029563339012437434">"WiMAXसँग जोड्नुहोस् वा छुटाउनुहोस्"</string> - <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"अनुप्रयोगलाई वाइम्याक्स सक्षम छ कि छैन र जडान भएको कुनै पनि वाइम्याक्स नेटवर्कहरूको बारेमा जानकारी निर्धारिण गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_accessWimaxState" msgid="5372734776802067708">"एपलाई वाइम्याक्स सक्षम छ कि छैन र जडान भएको कुनै पनि वाइम्याक्स नेटवर्कहरूको बारेमा जानकारी निर्धारिण गर्न अनुमति दिन्छ।"</string> <string name="permlab_changeWimaxState" msgid="6223305780806267462">"वाइम्याक्स अवस्था परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"अनुप्रयोगलाई वाइम्याक्स नेटवर्कहरूबाट ट्याब्लेट जडान गर्न र ट्याब्लेट विच्छेदन गर्न अनुमति दिन्छ।"</string> - <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"अनुप्रयोगलाई तपाईंको Android TV यन्त्र WiMAX नेटवर्कहरूमा जोड्ने वा ती नेटवर्कहरूबाट विच्छेद गर्ने अनुमति दिन्छ।"</string> - <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"वाइम्याक्स नेटवर्कहरूसँग फोन जोड्न र छुटाउन अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"एपलाई वाइम्याक्स नेटवर्कहरूबाट ट्याब्लेट जडान गर्न र ट्याब्लेट विच्छेदन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"एपलाई तपाईंको Android TV यन्त्र WiMAX नेटवर्कहरूमा जोड्ने वा ती नेटवर्कहरूबाट विच्छेद गर्ने अनुमति दिन्छ।"</string> + <string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"वाइम्याक्स नेटवर्कहरूसँग फोन जोड्न र छुटाउन एपलाई अनुमति दिन्छ।"</string> <string name="permlab_bluetooth" msgid="586333280736937209">"ब्लुटुथ उपकरणहरूसँग जोडी मिलाउनुहोस्"</string> - <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ट्याब्लेटमा ब्लुटुथको कन्फिगुरेसनलाई हेर्न र बनाउन र जोडी उपकरणहरूसँग जडानहरूलाई स्वीकार गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> - <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रको ब्लुटुथको कन्फिगुरेसन हेर्ने तथा जोडा बनाइएका यन्त्रहरूसँग जोडिने वा ती यन्त्रहरूले पठाएका जोडिने अनुरोध स्वीकार्ने अनुमति दिन्छ।"</string> - <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"अनुप्रयोगलाई फोनमा ब्लुटुथको कन्फिगरेसन हेर्न र जोडी भएका उपकरणहरूसँग जडानहरू बनाउन र स्वीकार गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"ट्याब्लेटमा ब्लुटुथको कन्फिगुरेसनलाई हेर्न र बनाउन र जोडी उपकरणहरूसँग जडानहरूलाई स्वीकार गर्न एपलाई अनुमति दिन्छ।"</string> + <string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"एपलाई तपाईंको Android TV यन्त्रको ब्लुटुथको कन्फिगुरेसन हेर्ने तथा जोडा बनाइएका यन्त्रहरूसँग जोडिने वा ती यन्त्रहरूले पठाएका जोडिने अनुरोध स्वीकार्ने अनुमति दिन्छ।"</string> + <string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"एपलाई फोनमा ब्लुटुथको कन्फिगरेसन हेर्न र जोडी भएका उपकरणहरूसँग जडानहरू बनाउन र स्वीकार गर्न अनुमति दिन्छ।"</string> <string name="permlab_preferredPaymentInfo" msgid="5274423844767445054">"NFC भुक्तानी सेवासम्बन्धी रुचाइएको जानकारी"</string> - <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"यसले अनुप्रयोगलाई दर्ता गरिएका सहायता तथा मार्गको गन्तव्य जस्ता रुचाइएका NFC भुक्तानी सेवासम्बन्धी जानकारी प्राप्त गर्न दिन्छ।"</string> + <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"यसले एपलाई दर्ता गरिएका सहायता तथा मार्गको गन्तव्य जस्ता रुचाइएका NFC भुक्तानी सेवासम्बन्धी जानकारी प्राप्त गर्न दिन्छ।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"नजिक क्षेत्र संचार नियन्त्रणहरू"</string> - <string name="permdesc_nfc" msgid="8352737680695296741">"अनुप्रयोगलाई नयाँ क्षेत्र संचार (NFC) ट्यागहरू, कार्डहरू र पाठकहरूसँग अन्तर्क्रिया गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_nfc" msgid="8352737680695296741">"एपलाई नयाँ क्षेत्र संचार (NFC) ट्यागहरू, कार्डहरू र पाठकहरूसँग अन्तर्क्रिया गर्न अनुमति दिन्छ।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"स्क्रिन लक असक्षम पार्नुहोस्"</string> - <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"कुनै सम्बन्धित पासवर्ड सुरक्षा र किलकलाई असक्षम पार्न अनुप्रयोगलाई अनुमति दिन्छ। उदाहरणको लागि, अन्तर्गमन फोन कल प्राप्त गर्दा फोनले किलकलाई असक्षम पार्छ, त्यसपछि कल सकिएको बेला किलक पुनःसक्षम पार्छ।"</string> + <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"कुनै सम्बन्धित पासवर्ड सुरक्षा र किलकलाई असक्षम पार्न एपलाई अनुमति दिन्छ। उदाहरणको लागि, अन्तर्गमन फोन कल प्राप्त गर्दा फोनले किलकलाई असक्षम पार्छ, त्यसपछि कल सकिएको बेला किलक पुनःसक्षम पार्छ।"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"स्क्रिन लकको जटिलतासम्बन्धी जानकारी प्राप्त गर्ने अनुरोध गर्नुहोस्"</string> - <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"यसले अनुप्रयोगलाई स्क्रिन लकको जटिलताको स्तर (उच्च, मध्यम, न्यून वा कुनै पनि होइन) थाहा पाउने अनुमति दिन्छ जसले स्क्रिन लकको लम्बाइको सम्भावित दायरा र त्यसको प्रकारलाई जनाउँछ। यसै गरी, यो अनुप्रयोगले प्रयोगकर्ताहरूलाई स्क्रिन लक अद्यावधिक गर्ने सुझाव पनि दिन सक्छ तर प्रयोगकर्ताहरू उक्त सुझावको बेवास्ता गरी बाहिर निस्कन सक्छन्। स्क्रिन लक सादा पाठको ढाँचामा भण्डारण नगरिने हुँदा यो अनुप्रयोगलाई वास्तविक पासवर्ड थाहा नहुने कुराको हेक्का राख्नुहोस्।"</string> + <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"यसले एपलाई स्क्रिन लकको जटिलताको स्तर (उच्च, मध्यम, न्यून वा कुनै पनि होइन) थाहा पाउने अनुमति दिन्छ जसले स्क्रिन लकको लम्बाइको सम्भावित दायरा र त्यसको प्रकारलाई जनाउँछ। यसै गरी, यो अनुप्रयोगले प्रयोगकर्ताहरूलाई स्क्रिन लक अद्यावधिक गर्ने सुझाव पनि दिन सक्छ तर प्रयोगकर्ताहरू उक्त सुझावको बेवास्ता गरी बाहिर निस्कन सक्छन्। स्क्रिन लक सादा पाठको ढाँचामा भण्डारण नगरिने हुँदा यो एपलाई वास्तविक पासवर्ड थाहा नहुने कुराको हेक्का राख्नुहोस्।"</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"बायोमेट्रिक हार्डवेयर प्रयोग गर्नुहोस्"</string> - <string name="permdesc_useBiometric" msgid="7502858732677143410">"अनुप्रयोगलाई प्रमाणीकरणका लागि बायोमेट्रिक हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> + <string name="permdesc_useBiometric" msgid="7502858732677143410">"एपलाई प्रमाणीकरणका लागि बायोमेट्रिक हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> <string name="permlab_manageFingerprint" msgid="7432667156322821178">"फिंगरप्रिन्ट हार्डवेयर व्यवस्थापन गर्नुहोस्"</string> - <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"अनुप्रयोगलाई प्रयोगको लागि फिंगरप्रिन्ट टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"एपलाई प्रयोगको लागि फिंगरप्रिन्ट टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> <string name="permlab_useFingerprint" msgid="1001421069766751922">"फिंगरप्रिन्ट हार्डवेयर प्रयोग गर्नुहोस्"</string> - <string name="permdesc_useFingerprint" msgid="412463055059323742">"यो अनुप्रयोगलाई प्रमाणीकरणको लागि फिंगरप्रिन्ट हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> + <string name="permdesc_useFingerprint" msgid="412463055059323742">"यो एपलाई प्रमाणीकरणको लागि फिंगरप्रिन्ट हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> <string name="permlab_audioWrite" msgid="8501705294265669405">"आफ्नो सङ्गीतको सङ्ग्रह परिमार्जन गर्नुहोस्"</string> - <string name="permdesc_audioWrite" msgid="8057399517013412431">"यसले अनुप्रयोगलाई तपाईंको सङ्गीतको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> + <string name="permdesc_audioWrite" msgid="8057399517013412431">"यसले एपलाई तपाईंको सङ्गीतको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> <string name="permlab_videoWrite" msgid="5940738769586451318">"आफ्नो भिडियोको सङ्ग्रह परिमार्जन गर्नुहोस्"</string> - <string name="permdesc_videoWrite" msgid="6124731210613317051">"यसले अनुप्रयोगलाई तपाईंको भिडियोको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> + <string name="permdesc_videoWrite" msgid="6124731210613317051">"यसले एपलाई तपाईंको भिडियोको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> <string name="permlab_imagesWrite" msgid="1774555086984985578">"आफ्नो तस्बिरको सङ्ग्रह परिमार्जन गर्नुहोस्"</string> - <string name="permdesc_imagesWrite" msgid="5195054463269193317">"यसले अनुप्रयोगलाई तपाईंको तस्बिरको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> + <string name="permdesc_imagesWrite" msgid="5195054463269193317">"यसले एपलाई तपाईंको तस्बिरको सङ्ग्रह परिमार्जन गर्न दिन्छ।"</string> <string name="permlab_mediaLocation" msgid="7368098373378598066">"आफ्नो मिडियाको सङ्ग्रहका स्थानहरू पढ्नुहोस्"</string> - <string name="permdesc_mediaLocation" msgid="597912899423578138">"यसले अनुप्रयोगलाई तपाईंको मिडिया सङ्ग्रहका स्थानहरू पढ्न दिन्छ।"</string> + <string name="permdesc_mediaLocation" msgid="597912899423578138">"यसले एपलाई तपाईंको मिडिया सङ्ग्रहका स्थानहरू पढ्न दिन्छ।"</string> <string name="biometric_dialog_default_title" msgid="5284880398508155088">"यो तपाईं नै हो भन्ने पुष्टि गर्नुहोस्"</string> <string name="biometric_error_hw_unavailable" msgid="2494077380540615216">"बायोमेट्रिक हार्डवेयर उपलब्ध छैन"</string> <string name="biometric_error_user_canceled" msgid="6732303949695293730">"प्रमाणीकरण रद्द गरियो"</string> @@ -568,9 +568,9 @@ </string-array> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"फिंगरप्रिन्ट आइकन"</string> <string name="permlab_manageFace" msgid="4569549381889283282">"फेस अनलकको हार्डवेयर व्यवस्थित गर्नुहोस्"</string> - <string name="permdesc_manageFace" msgid="6204569688492710471">"अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_manageFace" msgid="6204569688492710471">"एपलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> <string name="permlab_useFaceAuthentication" msgid="1011430526454859030">"फेस अनलकको हार्डवेयर प्रयोग गर्नुहोस्"</string> - <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"अनुप्रयोगलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> + <string name="permdesc_useFaceAuthentication" msgid="3115697017684668012">"एपलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> <string name="face_recalibrate_notification_name" msgid="6006095897989257026">"फेस अनलक"</string> <string name="face_recalibrate_notification_title" msgid="5944930528030496897">"आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> <string name="face_recalibrate_notification_content" msgid="892757485125249962">"अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> @@ -616,31 +616,31 @@ <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"टगल सिंक खुला र बन्द"</string> <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"अनुप्रयोगहरूलाई खाताको लागि सिंक सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ। उदाहरणको लागि, यो खातासँग व्यक्ति अनुप्रयोगको सिंक सक्षम गर्न प्रयोग गर्न सकिन्छ।"</string> <string name="permlab_readSyncStats" msgid="3747407238320105332">"सिंक तथ्याङ्कहरू पढ्नुहोस्"</string> - <string name="permdesc_readSyncStats" msgid="3867809926567379434">"अनुप्रयोगलाई खाताको लागि समीकरणको आँकडा समीकरण घटनाहरूको इतिहास र समीकरण गरिएको डेटाको मापन समेत, पढ्न अनुमति दिन्छ।"</string> + <string name="permdesc_readSyncStats" msgid="3867809926567379434">"एपलाई खाताको लागि समीकरणको आँकडा समीकरण घटनाहरूको इतिहास र समीकरण गरिएको डेटाको मापन समेत, पढ्न अनुमति दिन्छ।"</string> <string name="permlab_sdcardRead" msgid="5791467020950064920">"आफ्नो आदान प्रदान गरिएको भण्डारणको सामग्रीहरूहरू पढ्नुहोस्"</string> - <string name="permdesc_sdcardRead" msgid="6872973242228240382">"अनुप्रयोगलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री पढ्न अनुमति दिन्छ।"</string> + <string name="permdesc_sdcardRead" msgid="6872973242228240382">"एपलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री पढ्न अनुमति दिन्छ।"</string> <string name="permlab_sdcardWrite" msgid="4863021819671416668">"तपाईंको आदान प्रदान गरिएको भण्डारणको विषयवस्तुहरूलाई परिमार्जन गर्नहोस् वा मेटाउनुहोस्"</string> - <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"अनुप्रयोगलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री लेख्न अनुमति दिन्छ।"</string> + <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"एपलाई तपाईंको आदान प्रदान गरिएको भण्डारणको सामग्री लेख्न अनुमति दिन्छ।"</string> <string name="permlab_use_sip" msgid="8250774565189337477">"SIP कलहरू प्राप्त/बनाउन"</string> - <string name="permdesc_use_sip" msgid="3590270893253204451">"SIP कलहरू बनाउन र प्राप्त गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_use_sip" msgid="3590270893253204451">"SIP कलहरू बनाउन र प्राप्त गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_register_sim_subscription" msgid="1653054249287576161">"नयाँ दूरसंचार सिम जडानहरू दर्ता गर्नुहोस्"</string> - <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"अनुप्रयोगलाई नयाँ दूरसंचार SIM जडानहरू दर्ता गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"एपलाई नयाँ दूरसंचार SIM जडानहरू दर्ता गर्न अनुमति दिन्छ।"</string> <string name="permlab_register_call_provider" msgid="6135073566140050702">"नयाँ दूरसंचार जडानहरू दर्ता गर्नुहोस्"</string> - <string name="permdesc_register_call_provider" msgid="4201429251459068613">"अनुप्रयोगलाई नयाँ दूरसंचार सम्पर्क दर्ता गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_register_call_provider" msgid="4201429251459068613">"एपलाई नयाँ दूरसंचार सम्पर्क दर्ता गर्न अनुमति दिन्छ।"</string> <string name="permlab_connection_manager" msgid="3179365584691166915">"दूरसंचार जडान व्यवस्थापन गर्नुहोस्"</string> - <string name="permdesc_connection_manager" msgid="1426093604238937733">"अनुप्रयोगलाई टेलिकम जडान व्यवस्थापन गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_connection_manager" msgid="1426093604238937733">"एपलाई टेलिकम जडान व्यवस्थापन गर्न अनुमति दिन्छ।"</string> <string name="permlab_bind_incall_service" msgid="5990625112603493016">"आगमन कल स्क्रिन संग अन्तर्क्रिया गर्नुहोस्"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"कहिले र कसरी प्रयोगकर्ताले आगमन कल स्क्रीन हेर्न सक्दछ भनेर नियन्त्रण गर्न अनुप्रयोगलाई अनुमति दिनुहोस्।"</string> + <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"कहिले र कसरी प्रयोगकर्ताले आगमन कल स्क्रीन हेर्न सक्दछ भनेर नियन्त्रण गर्न एपलाई अनुमति दिनुहोस्।"</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"टेलिफोनी सेवा अन्तरक्रिया"</string> - <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"अनुप्रयोगलाई कल बनाउन/प्राप्त गर्न टेलीफोनी सेवा साथ अन्तरक्रिया गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"एपलाई कल बनाउन/प्राप्त गर्न टेलीफोनी सेवा साथ अन्तरक्रिया गर्न अनुमति दिन्छ।"</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्नुहोस्"</string> - <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"अनुप्रयोगलाई आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"एपलाई आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्न अनुमति दिन्छ।"</string> <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"नेटवर्क उपयोगको इतिहास पढ्नुहोस्"</string> - <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"निश्चित नेटवर्कहरू र अनुप्रयोगहरूको लागि ऐतिहासिक नेटवर्क उपयोग पढ्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"निश्चित नेटवर्कहरू र अनुप्रयोगहरूको लागि ऐतिहासिक नेटवर्क उपयोग पढ्नको लागि एपलाई अनुमति दिन्छ।"</string> <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"नेटवर्क नीति प्रबन्ध गर्नुहोस्"</string> <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"नेटवर्क नीतिहरू व्यवस्थापन गर्न र एप-विशेष नियमहरू परिभाषित गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"नेटवर्क उपयोग लेखालाई परिमार्जन गर्नुहोस्"</string> - <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"अनुप्रयोगलाई कसरी अनुप्रयोगहरूको विरूद्धमा कसरी नेटवर्क उपयोगी अकाउन्टेड छ भनेर परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूद्वारा प्रयोगको लागि होइन।"</string> + <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"एपलाई कसरी अनुप्रयोगहरूको विरूद्धमा कसरी नेटवर्क उपयोगी अकाउन्टेड छ भनेर परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूद्वारा प्रयोगको लागि होइन।"</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"सूचनाहरू पहुँच गर्नुहोस्"</string> <string name="permdesc_accessNotifications" msgid="761730149268789668">"अन्य अनुप्रयोगहरूबाट पोस्ट गरिएकासहित पुनःप्राप्त गर्न, परीक्षण गर्न र सूचनाहरू हटाउन अनुप्रयोगहरूलाई अनुमति दिन्छ।"</string> <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"जानकारी श्रोता सेवामा बाँध्नुहोस्"</string> @@ -652,21 +652,21 @@ <string name="permlab_invokeCarrierSetup" msgid="5098810760209818140">"वाहक-प्रदान विन्यास एप सुरु गर्नुहोस्"</string> <string name="permdesc_invokeCarrierSetup" msgid="4790845896063237887">"प्रयोगकर्तालाई वाहक-प्रदान विन्यास एप सुरु गर्न अनुमति दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक पर्ने छैन।"</string> <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"सञ्जाल अवस्थाका पर्यवेक्षणका लागि सुन्नुहोस्"</string> - <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"सञ्जाल अवस्थाका पर्यवेक्षण सुन्नका लागि अनुप्रयोगलाई अनुमति दिन्छ।सामान्य अनुप्रयोगलाई चाँहिदै नचाँहिन सक्छ।"</string> + <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"सञ्जाल अवस्थाका पर्यवेक्षण सुन्नका लागि एपलाई अनुमति दिन्छ।सामान्य एपलाई चाँहिदै नचाँहिन सक्छ।"</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"इनपुट उपकरण क्यालिब्रेसन परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"अनुप्रयोगलाई टच स्क्रीनको प्यारामिटरहरू क्यालिब्रेसन परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै आवश्यक पर्दैन।"</string> + <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"एपलाई टच स्क्रीनको प्यारामिटरहरू क्यालिब्रेसन परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै आवश्यक पर्दैन।"</string> <string name="permlab_accessDrmCertificates" msgid="6473765454472436597">"DRM प्रमाणपत्रको पहुँच"</string> <string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"DRM प्रमाणपत्रहरू प्रावधान र प्रयोग गर्ने निवेदनको अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string> <string name="permlab_handoverStatus" msgid="7620438488137057281">"Android Beam स्थानान्तरण अवस्था प्राप्त गर्नुहोस्"</string> <string name="permdesc_handoverStatus" msgid="3842269451732571070">"यस आवेदनले वर्तमान Android Beam स्थानान्तरण बारेमा जानकारी प्राप्त गर्न अनुमति दिन्छ"</string> <string name="permlab_removeDrmCertificates" msgid="710576248717404416">"DRM प्रमाणपत्रहरू हटाउनुहोस्"</string> - <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"DRM प्रमाणपत्रहरू हटाउन अनुप्रयोगलाई अनुमति दिन्छ। सामान्य अनुप्रयोगहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string> + <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"DRM प्रमाणपत्रहरू हटाउन एपलाई अनुमति दिन्छ। सामान्य अनुप्रयोगहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string> <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"वाहक मेसेजिङ सेवामा आबद्ध हुनुहोस्"</string> <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"धारकलाई वाहक मेसेजिङ सेवाको उच्च-स्तरको इन्टरफेसमा आबद्ध हुन अनुमति दिनुहोस्। सामान्य एपहरूको लागि कहिल्यै आवश्यकता पर्दैन।"</string> <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"वाहक सेवाहरु बाँध्न"</string> <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"होल्डरलाई वाहक सेवाहरु बाँध्न अनुमति दिनुहोस्। सामान्य अनुप्रयोगहरूको लागि यो कहिल्यै आवश्यक पर्दैन।"</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"बाधा नपुर्याउँनुहोस् पहुँच गर्नुहोस्"</string> - <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि अनुप्रयोगलाई अनुमति दिनुहोस्।"</string> + <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि एपलाई अनुमति दिनुहोस्।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै अनुप्रयोगसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string> @@ -951,17 +951,17 @@ <string name="autofill_area" msgid="8289022370678448983">"क्षेत्र"</string> <string name="autofill_emirate" msgid="2544082046790551168">"इमिरेट"</string> <string name="permlab_readHistoryBookmarks" msgid="9102293913842539697">"तपाईँका बुकमार्कहरू र इतिहास पढ्नुहोस्"</string> - <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"ब्राउजरले भ्रमण गरेको सबै URL हरूको इतिहास र ब्राउजरका सबै बुकमार्कहरू पढ्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। नोट: यो अनुमतिलाई तेस्रो पक्ष ब्राउजरहरूद्वारा वा वेब ब्राउज गर्ने क्षमताद्वारा बलपूर्वक गराउन सकिँदैन।"</string> + <string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"ब्राउजरले भ्रमण गरेको सबै URL हरूको इतिहास र ब्राउजरका सबै बुकमार्कहरू पढ्नको लागि एपलाई अनुमति दिन्छ। नोट: यो अनुमतिलाई तेस्रो पक्ष ब्राउजरहरूद्वारा वा वेब ब्राउज गर्ने क्षमताद्वारा बलपूर्वक गराउन सकिँदैन।"</string> <string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"वेब बुकमार्कहरू र इतिहास लेख्नुहोस्"</string> - <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"अनुप्रयोगलाई तपाईंको ट्याब्लेटमा भण्डार गरिएको ब्राउजरको इतिहास वा बुकमार्कहरू परिमार्जन गर्न अनुमति दिन्छ। यसले अनुप्रयोगलाई ब्राजर डेटा मेटाउन वा परिमार्जन गर्न अनुमति दिन सक्दछ। टिप्पणी: यो अनुमति वेब ब्राउज गर्ने क्षमताहरूको साथ तेस्रो-पार्टी ब्राउजर वा अन्य अनुप्रयोगहरूद्वारा लागू गरिएको होइन।"</string> - <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"अनुप्रयोगलाई तपाईंको Android TV यन्त्रमा भण्डार गरिएका ब्राउजरको इतिहास र पुस्तक चिन्हहरू परिमार्जन गर्ने अनुमति दिन्छ। यसले अनुप्रयोगलाई ब्राउजरको डेटा मेटाउने वा परिमार्जन गर्ने अनुमति दिन सक्छ। ध्यान दिनुहोस्: तेस्रो पक्षीय ब्राउजर वा वेब ब्राउज गर्ने सुविधा प्रदान गर्ने अन्य अनुप्रयोगहरूले यो अनुमति लागू गर्न सक्दैनन्।"</string> - <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"तपाईँको फोनमा भण्डारण भएको ब्राउजरको इतिहास वा बुकमार्कहरू परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। यसले सायद ब्राउजर डेटालाई मेट्न वा परिवर्तन गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। नोट: वेब ब्राउज गर्ने क्षमतासहितका अन्य एपहरू वा तेस्रो- पक्ष ब्राउजरद्वारा सायद यस अनुमतिलाई लागु गर्न सकिंदैन।"</string> + <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएको ब्राउजरको इतिहास वा बुकमार्कहरू परिमार्जन गर्न अनुमति दिन्छ। यसले एपलाई ब्राजर डेटा मेटाउन वा परिमार्जन गर्न अनुमति दिन सक्दछ। टिप्पणी: यो अनुमति वेब ब्राउज गर्ने क्षमताहरूको साथ तेस्रो-पार्टी ब्राउजर वा अन्य अनुप्रयोगहरूद्वारा लागू गरिएको होइन।"</string> + <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"एपलाई तपाईंको Android TV यन्त्रमा भण्डार गरिएका ब्राउजरको इतिहास र पुस्तक चिन्हहरू परिमार्जन गर्ने अनुमति दिन्छ। यसले एपलाई ब्राउजरको डेटा मेटाउने वा परिमार्जन गर्ने अनुमति दिन सक्छ। ध्यान दिनुहोस्: तेस्रो पक्षीय ब्राउजर वा वेब ब्राउज गर्ने सुविधा प्रदान गर्ने अन्य एपहरूले यो अनुमति लागू गर्न सक्दैनन्।"</string> + <string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"तपाईँको फोनमा भण्डारण भएको ब्राउजरको इतिहास वा बुकमार्कहरू परिवर्तन गर्नको लागि एपलाई अनुमति दिन्छ। यसले सायद ब्राउजर डेटालाई मेट्न वा परिवर्तन गर्नको लागि एपलाई अनुमति दिन्छ। नोट: वेब ब्राउज गर्ने क्षमतासहितका अन्य एपहरू वा तेस्रो- पक्ष ब्राउजरद्वारा सायद यस अनुमतिलाई लागु गर्न सकिंदैन।"</string> <string name="permlab_setAlarm" msgid="1158001610254173567">"एउटा आलर्म सेट गर्नुहोस्"</string> - <string name="permdesc_setAlarm" msgid="2185033720060109640">"स्थापना गरिएको सङ्केत घडी अनुप्रयोगमा सङ्केत समय मिलाउन अनुप्रयोगलाई अनुमति दिन्छ। केही सङ्केत घडी अनुप्रयोगहरूले यो सुविधा कार्यान्वयन नगर्न सक्छन्।"</string> + <string name="permdesc_setAlarm" msgid="2185033720060109640">"स्थापना गरिएको सङ्केत घडी अनुप्रयोगमा सङ्केत समय मिलाउन एपलाई अनुमति दिन्छ। केही सङ्केत घडी एपहरूले यो सुविधा कार्यान्वयन नगर्न सक्छन्।"</string> <string name="permlab_addVoicemail" msgid="4770245808840814471">"भ्वाइसमेल थप गर्नुहोस्"</string> - <string name="permdesc_addVoicemail" msgid="5470312139820074324">"तपाईँको भ्वाइसमेल इनबक्समा सन्देश थप्नको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_addVoicemail" msgid="5470312139820074324">"तपाईँको भ्वाइसमेल इनबक्समा सन्देश थप्नको लागि एपलाई अनुमति दिन्छ।"</string> <string name="permlab_writeGeolocationPermissions" msgid="8605631647492879449">"भूस्थान अनुमतिहरू ब्राउजर परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"ब्राउजरको भू-स्थान अनुमतिहरू परिमार्जन गर्न अनुप्रयोगलाई अनुमति दिन्छ। खराब अनुप्रयोगहरूले स्थान सूचना मनपरी वेब साइटहरूमा पठाउने अनुमतिको लागि यसलाई प्रयोग गर्न सक्छन्।"</string> + <string name="permdesc_writeGeolocationPermissions" msgid="5817346421222227772">"ब्राउजरको भू-स्थान अनुमतिहरू परिमार्जन गर्न एपलाई अनुमति दिन्छ। खराब एपहरूले स्थान सूचना मनपरी वेब साइटहरूमा पठाउने अनुमतिको लागि यसलाई प्रयोग गर्न सक्छन्।"</string> <string name="save_password_message" msgid="2146409467245462965">"के तपाईं ब्राउजरले यो पासवर्ड सम्झेको चाहनुहुन्छ?"</string> <string name="save_password_notnow" msgid="2878327088951240061">"अहिले होइन"</string> <string name="save_password_remember" msgid="6490888932657708341">"सम्झनुहोस्"</string> @@ -1111,7 +1111,7 @@ <string name="low_internal_storage_view_text" msgid="8172166728369697835">"सायद केही प्रणाली कार्यक्रमहरूले काम गर्दैनन्"</string> <string name="low_internal_storage_view_text_no_boot" msgid="7368968163411251788">"प्रणालीको लागि पर्याप्त भण्डारण छैन। तपाईँसँग २५० मेगा बाइट ठाउँ खाली भएको निश्चित गर्नुहोस् र फेरि सुरु गर्नुहोस्।"</string> <string name="app_running_notification_title" msgid="8985999749231486569">"<xliff:g id="APP_NAME">%1$s</xliff:g> चलिरहेको छ"</string> - <string name="app_running_notification_text" msgid="5120815883400228566">"थप जानकारीका लागि वा अनुप्रयोगलाई बन्द गर्न ट्याप गर्नुहोस्।"</string> + <string name="app_running_notification_text" msgid="5120815883400228566">"थप जानकारीका लागि वा एपलाई बन्द गर्न ट्याप गर्नुहोस्।"</string> <string name="ok" msgid="2646370155170753815">"ठिक छ"</string> <string name="cancel" msgid="6908697720451760115">"रद्द गर्नुहोस्"</string> <string name="yes" msgid="9069828999585032361">"ठिक छ"</string> @@ -1159,12 +1159,12 @@ <string name="clearDefaultHintMsg" msgid="1325866337702524936">"प्रणाली सेटिङहरूमा पूर्वनिर्धारितलाई हटाउनुहोस् > एपहरू > डाउनलोड।"</string> <string name="chooseActivity" msgid="8563390197659779956">"एउटा कार्यको चयन गर्नुहोस्"</string> <string name="chooseUsbActivity" msgid="2096269989990986612">"USB उपकरणको लागि एउटा एप छान्नुहोस्"</string> - <string name="noApplications" msgid="1186909265235544019">"कुनै पनि अनुप्रयोगहरूले यो कार्य गर्न सक्दैनन्।"</string> + <string name="noApplications" msgid="1186909265235544019">"कुनै पनि एपहरूले यो कार्य गर्न सक्दैनन्।"</string> <string name="aerr_application" msgid="4090916809370389109">"<xliff:g id="APPLICATION">%1$s</xliff:g> रोकिएको छ"</string> <string name="aerr_process" msgid="4268018696970966407">"<xliff:g id="PROCESS">%1$s</xliff:g> रोकिएको छ"</string> <string name="aerr_application_repeated" msgid="7804378743218496566">"<xliff:g id="APPLICATION">%1$s</xliff:g> रोकिरहन्छ"</string> <string name="aerr_process_repeated" msgid="1153152413537954974">"<xliff:g id="PROCESS">%1$s</xliff:g> रोकिरहन्छ"</string> - <string name="aerr_restart" msgid="2789618625210505419">"अनुप्रयोगलाई फेरि खोल्नुहोस्"</string> + <string name="aerr_restart" msgid="2789618625210505419">"एपलाई फेरि खोल्नुहोस्"</string> <string name="aerr_report" msgid="3095644466849299308">"प्रतिक्रिया पठाउनुहोस्"</string> <string name="aerr_close" msgid="3398336821267021852">"बन्द गर्नुहोस्"</string> <string name="aerr_mute" msgid="2304972923480211376">"यन्त्र पुनः सुरु नभएसम्म म्यूट गर्नुहोस्"</string> @@ -1268,7 +1268,7 @@ <string name="decline" msgid="6490507610282145874">"अस्वीकार गर्नुहोस्"</string> <string name="select_character" msgid="3352797107930786979">"अक्षरहरू प्रवेश गराउनुहोस्"</string> <string name="sms_control_title" msgid="4748684259903148341">"SMS सन्देशहरू पठाइँदै"</string> - <string name="sms_control_message" msgid="6574313876316388239">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ले धरै संख्यामा SMS सन्देशहरू पठाउँदैछ। के तपाईं यस अनुप्रयोगलाई सन्देशहरू पठाउन सुचारु गर्न अनुमति दिन चाहनु हुन्छ?"</string> + <string name="sms_control_message" msgid="6574313876316388239">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ले धरै संख्यामा SMS सन्देशहरू पठाउँदैछ। के तपाईं यस एपलाई सन्देशहरू पठाउन सुचारु गर्न अनुमति दिन चाहनु हुन्छ?"</string> <string name="sms_control_yes" msgid="4858845109269524622">"अनुमति दिनुहोस्"</string> <string name="sms_control_no" msgid="4845717880040355570">"अस्वीकार गर्नुहोस्"</string> <string name="sms_short_code_confirm_message" msgid="1385416688897538724">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> के तपाईं सन्देश पठाउन चाहुनु हुन्छ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string> @@ -1389,15 +1389,15 @@ <string name="ext_media_status_missing" msgid="6520746443048867314">"सम्मिलित छैन"</string> <string name="activity_list_empty" msgid="4219430010716034252">"कुनै मिल्ने गतिविधि पाइएन।"</string> <string name="permlab_route_media_output" msgid="8048124531439513118">"मिडिया निकास दिशानिर्देश गराउनुहोस्"</string> - <string name="permdesc_route_media_output" msgid="1759683269387729675">"मिडिया परिणामलाई अन्य बाहिरी उपकरणहरूसँग लैजानको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_route_media_output" msgid="1759683269387729675">"मिडिया परिणामलाई अन्य बाहिरी उपकरणहरूसँग लैजानको लागि एपलाई अनुमति दिन्छ।"</string> <string name="permlab_readInstallSessions" msgid="7279049337895583621">"स्थापना सत्रहरू पढ्नु दिनुहोस्"</string> - <string name="permdesc_readInstallSessions" msgid="4012608316610763473">"स्थापित सत्र पढ्न अनुप्रयोगलाई अनुमति दिनुहोस्। यसले सक्रिय प्याकेज प्रतिष्ठानहरू बारेमा विवरण हेर्ने अनुमति दिन्छ।"</string> + <string name="permdesc_readInstallSessions" msgid="4012608316610763473">"स्थापित सत्र पढ्न एपलाई अनुमति दिनुहोस्। यसले सक्रिय प्याकेज प्रतिष्ठानहरू बारेमा विवरण हेर्ने अनुमति दिन्छ।"</string> <string name="permlab_requestInstallPackages" msgid="7600020863445351154">"स्थापना प्याकेजहरू अनुरोध गर्नुहोस्"</string> - <string name="permdesc_requestInstallPackages" msgid="3969369278325313067">"प्याकेजहरूको स्थापना अनुरोध गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string> + <string name="permdesc_requestInstallPackages" msgid="3969369278325313067">"प्याकेजहरूको स्थापना अनुरोध गर्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_requestDeletePackages" msgid="2541172829260106795">"प्याकेजहरू मेटाउने अनुरोध गर्नुहोस्"</string> - <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"अनुप्रयोगलाई प्याकेजहरू मेटाउने अनुरोध गर्न अनुमति दिन्छ।"</string> + <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"एपलाई प्याकेजहरू मेटाउने अनुरोध गर्न अनुमति दिन्छ।"</string> <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"ब्याट्री सम्बन्धी अनुकूलनहरूलाई बेवास्ता गर्न सोध्नुहोस्"</string> - <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"कुनै अनुप्रयोगलाई त्यसका ब्याट्री सम्बन्धी अनुकूलनहरूलाई बेवास्ता गर्नाका लागि अनुमति माग्न दिन्छ।"</string> + <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"कुनै एपलाई त्यसका ब्याट्री सम्बन्धी अनुकूलनहरूलाई बेवास्ता गर्नाका लागि अनुमति माग्न दिन्छ।"</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"जुम नियन्त्रणको लागि दुई चोटि ट्याप गर्नुहोस्"</string> <string name="gadget_host_error_inflating" msgid="2449961590495198720">"विजेट थप गर्न सकिँदैन।"</string> <string name="ime_action_go" msgid="5536744546326495436">"जानुहोस्"</string> @@ -1409,7 +1409,7 @@ <string name="ime_action_default" msgid="8265027027659800121">"चलाउनुहोस्"</string> <string name="dial_number_using" msgid="6060769078933953531">\n"नम्बर डायल गर्नुहोस् <xliff:g id="NUMBER">%s</xliff:g> प्रयोग गरेर"</string> <string name="create_contact_using" msgid="6200708808003692594">"सम्पर्क सिर्जना गर्नुहोस्\nयो <xliff:g id="NUMBER">%s</xliff:g> प्रयोग गरेर"</string> - <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"निम्न एउटा वा धेरै अनुप्रयोगहरूले तपाईँको खातामा पहुँचको लागि अनुमति अहिले र भविष्यमा अनुरोध गर्छन्।"</string> + <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"निम्न एउटा वा धेरै एपहरूले तपाईँको खातामा पहुँचको लागि अनुमति अहिले र भविष्यमा अनुरोध गर्छन्।"</string> <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"के तपाईं यस अनुरोधलाई अनुमति दिन चाहनुहुन्छ?"</string> <string name="grant_permissions_header_text" msgid="3420736827804657201">"अनुरोध पहुँच गर्नुहोस्"</string> <string name="allow" msgid="6195617008611933762">"अनुमति दिनुहोस्"</string> @@ -1528,7 +1528,7 @@ <string name="data_usage_restricted_title" msgid="126711424380051268">"पृष्ठभूमिका डेटा प्रतिबन्धित गरिएको छ"</string> <string name="data_usage_restricted_body" msgid="5338694433686077733">"सीमिततालाई हटाउन ट्याप गर्नुहोस्।"</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"मोबाइल डेटाको उच्च प्रयोग"</string> - <string name="data_usage_rapid_body" msgid="3886676853263693432">"तपाईंका अनुप्रयोगहरूले सामान्यभन्दा बढी डेटा प्रयोग गरेका छन्"</string> + <string name="data_usage_rapid_body" msgid="3886676853263693432">"तपाईंका एपहरूले सामान्यभन्दा बढी डेटा प्रयोग गरेका छन्"</string> <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> ले सामान्यभन्दा बढी डेटा प्रयोग गरेको छ"</string> <string name="ssl_certificate" msgid="5690020361307261997">"सुरक्षा प्रमाणपत्र"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"प्रमाणपत्र मान्य छ।"</string> @@ -1802,7 +1802,7 @@ <string name="confirm_battery_saver" msgid="5247976246208245754">"ठिक छ"</string> <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ब्याट्रीको आयु बढाउन ब्याट्री सेभरले:\n\n•अँध्यारो थिम सक्रिय गर्छ\n•पृष्ठभूमिका गतिविधि, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ\n\n"<annotation id="url">"थप जान्नुहोस्"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"ब्याट्रीको आयु बढाउन ब्याट्री सेभरले:\n\n•अँध्यारो थिम सक्रिय गर्छ\n•पृष्ठभूमिका गतिविधि, केही दृश्यात्मक प्रभाव तथा “Hey Google” जस्ता अन्य सुविधाहरू निष्क्रिय वा सीमित पार्छ"</string> - <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्न डेटा सर्भरले केही अनुप्रयोगलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटा चलाउन सक्छ, तर पहिला भन्दा कम अन्तरालमा मात्र। उदाहरणका लागि, तपाईले छविहरूमा ट्याप नगरेसम्म ती छविहरू देखिँदैनन्।"</string> + <string name="data_saver_description" msgid="4995164271550590517">"डेटाको प्रयोगलाई कम गर्न डेटा सर्भरले केही एपलाई पृष्ठभूमिमा डेटा पठाउन वा प्राप्त गर्न दिँदैन। तपाईंले हाल प्रयोग गरिरहनुभएको अनु्प्रयोगले डेटा चलाउन सक्छ, तर पहिला भन्दा कम अन्तरालमा मात्र। उदाहरणका लागि, तपाईले छविहरूमा ट्याप नगरेसम्म ती छविहरू देखिँदैनन्।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"डेटा सेभर सक्रिय गर्ने हो?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"सक्रिय गर्नुहोस्"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> @@ -2009,7 +2009,7 @@ <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"प्रायः चार्ज गर्ने समय हुनुभन्दा पहिले नै ब्याट्री सकिन सक्छ"</string> <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"ब्याट्रीको आयु बढाउन ब्याट्री सेभर सक्रिय गरियो"</string> <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"ब्याट्री सेभर"</string> - <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"ब्याट्री सेभर निष्क्रिय पारियो"</string> + <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"ब्याट्री सेभर अफ गरियो"</string> <string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"फोनमा पर्याप्त चार्ज छ। सुविधाहरूलाई अब उप्रान्त प्रतिबन्ध लगाइँदैन।"</string> <string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"ट्याब्लेटमा पर्याप्त चार्ज छ। सुविधाहरूलाई अब उप्रान्त प्रतिबन्ध लगाइँदैन।"</string> <string name="battery_saver_charged_notification_summary" product="device" msgid="1031562417867646649">"यन्त्रमा पर्याप्त चार्ज छ। सुविधाहरूलाई अब उप्रान्त प्रतिबन्ध लगाइँदैन।"</string> @@ -2039,7 +2039,7 @@ </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"कुनै पनि व्यक्तिसँग सेयर गर्ने सिफारिस गरिएको छैन"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"अनुप्रयोगहरूको सूची"</string> - <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> + <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"यो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले यो USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"गृहपृष्ठ"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"पछाडि फर्कनुहोस्"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"हालसालैका एपहरू"</string> @@ -2048,12 +2048,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"पावर संवाद"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"लक स्क्रिन"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"स्क्रिनसट"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"सहज पहुँचका लागि स्क्रिनमा राखिने सर्टकट छान्ने मेनु"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"पहुँचको सर्टकट"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> को क्याप्सन बार।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2187,4 +2184,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI अनलक गरियो।"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"नेटवर्कको सबसेटको सेवा प्रदायकसम्बन्धी लक खोलियो।"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index f320e5ddf7d8..d379c8f7b41e 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Voedingsdialoogvenster"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Scherm vergrendelen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Snelkoppeling voor toegankelijkheid op scherm"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kiezer voor snelkoppeling voor toegankelijkheid op scherm"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Snelkoppeling voor toegankelijkheid"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ondertitelingsbalk van <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID is ontgrendeld."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI is ontgrendeld."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Subset van netwerk serviceprovider is ontgrendeld."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 28f552ec4200..bc859c176fc7 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -142,7 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"ୱାଇ-ଫାଇ"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"ୱାଇଫାଇ କଲିଂ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ଅଫ୍"</string> + <string name="wifi_calling_off_summary" msgid="5626710010766902560">"ବନ୍ଦ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"ୱାଇ-ଫାଇ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"ମୋବାଇଲ ନେଟ୍ୱର୍କ ମାଧ୍ୟମରେ କଲ୍ କରନ୍ତୁ"</string> <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"କେବଳ ୱାଇ-ଫାଇ"</string> @@ -1119,7 +1119,7 @@ <string name="dialog_alert_title" msgid="651856561974090712">"ଧ୍ୟାନଦିଅନ୍ତୁ"</string> <string name="loading" msgid="3138021523725055037">"ଲୋଡ୍ କରାଯାଉଛି…"</string> <string name="capital_on" msgid="2770685323900821829">"ଚାଲୁ"</string> - <string name="capital_off" msgid="7443704171014626777">"ଅଫ୍"</string> + <string name="capital_off" msgid="7443704171014626777">"ବନ୍ଦ"</string> <string name="checked" msgid="9179896827054513119">"ଯାଞ୍ଚ ହୋଇଛି"</string> <string name="not_checked" msgid="7972320087569023342">"ଯାଞ୍ଚ ହୋଇନାହିଁ"</string> <string name="whichApplication" msgid="5432266899591255759">"ବ୍ୟବହାର କରି କାର୍ଯ୍ୟ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string> @@ -1231,7 +1231,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"ବିଜ୍ଞପ୍ତି ଭଲ୍ୟୁମ୍"</string> <string name="ringtone_default" msgid="9118299121288174597">"ଡିଫଲ୍ଟ ରିଙ୍ଗଟୋନ୍"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"ଡିଫଲ୍ଟ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"କିଛିନୁହେଁ"</string> + <string name="ringtone_silent" msgid="397111123930141876">"କିଛି ନାହିଁ"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"ରିଙ୍ଗଟୋନ୍"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"ଆଲାରାମ୍ ଶବ୍ଦ"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"ବିଜ୍ଞପ୍ତି ଶବ୍ଦ"</string> @@ -1796,7 +1796,7 @@ <string name="confirm_battery_saver" msgid="5247976246208245754">"ଠିକ୍ ଅଛି"</string> <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n•ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n•ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ\n\n"<annotation id="url">"ଅଧିକ ଜାଣନ୍ତୁ"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"ବ୍ୟାଟେରୀ ଲାଇଫ୍ ବଢ଼ାଇବାକୁ ବ୍ୟାଟେରୀ ସେଭର୍:\n\n•ଗାଢ଼ା ଥିମ୍ ଚାଲୁ କରେ\n•ପୃଷ୍ଠପଟ କାର୍ଯ୍ୟକଳାପ, କିଛି ଭିଜୁଆଲ୍ ପ୍ରଭାବ ଏବଂ “Hey Google” ପରି ଅନ୍ୟ ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କିମ୍ବା ପ୍ରତିବନ୍ଧିତ କରିଥାଏ"</string> - <string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ଇମେଜ୍ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string> + <string name="data_saver_description" msgid="4995164271550590517">"ଡାଟା ବ୍ୟବହାର କମ୍ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଡାଟା ସେଭର୍ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡରେ ଡାଟା ପଠାଇବା କିମ୍ବା ପ୍ରାପ୍ତ କରିବାକୁ କିଛି ଆପ୍କୁ ବାରଣ କରେ। ଆପଣ ବର୍ତ୍ତମାନ ବ୍ୟବହାର କରୁଥିବା ଆପ୍, ଡାଟା ଆକ୍ସେସ୍ କରିପାରେ, କିନ୍ତୁ ଏହା କମ୍ ଥର କରିପାରେ। ଏହାର ଅର୍ଥ ହୋଇପାରେ ଯେମିତି ଆପଣ ଇମେଜଗୁଡ଼ିକୁ ଟାପ୍ ନକରିବା ପର୍ଯ୍ୟନ୍ତ ସେଗୁଡ଼ିକ ଡିସପ୍ଲେ ହୁଏ ନାହିଁ।"</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"ଡାଟା ସେଭର୍ ଚାଲୁ କରିବେ?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"ଚାଲୁ କରନ୍ତୁ"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> @@ -1922,7 +1922,7 @@ <string name="app_category_maps" msgid="6395725487922533156">"ମାନଚିତ୍ର ଓ ନେଭିଗେଶନ୍"</string> <string name="app_category_productivity" msgid="1844422703029557883">"ଉତ୍ପାଦକତା"</string> <string name="device_storage_monitor_notification_channel" msgid="5164244565844470758">"ଡିଭାଇସ୍ ଷ୍ଟୋରେଜ୍"</string> - <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB ଡିବଗିଙ୍ଗ"</string> + <string name="adb_debugging_notification_channel_tv" msgid="4764046459631031496">"USB ଡିବଗିଂ"</string> <string name="time_picker_hour_label" msgid="4208590187662336864">"ଘଣ୍ଟା"</string> <string name="time_picker_minute_label" msgid="8307452311269824553">"ମିନିଟ୍"</string> <string name="time_picker_header_text" msgid="9073802285051516688">"ସମୟ ସେଟ୍ କରନ୍ତୁ"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ପାୱାର ଡାୟଲଗ୍ ଖୋଲନ୍ତୁ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ସ୍କ୍ରିନ୍ ଲକ୍ କରନ୍ତୁ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ଅନ୍-ସ୍କ୍ରିନ୍ ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍ ବାଛିବା ସୁବିଧା"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ଆକ୍ସେସିବିଲିଟୀ ସର୍ଟକଟ୍"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>ର କ୍ୟାପ୍ସନ୍ ବାର୍।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ନେଟୱାର୍କ ସବସେଟର ସେବା ପ୍ରଦାନକାରୀକୁ ଅନଲକ୍ କରିବା ସଫଳ ହୋଇଛି।"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index e0c6056d493b..5df7e2948f42 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ਪਾਵਰ ਵਿੰਡੋ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ਲਾਕ ਸਕ੍ਰੀਨ"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲਾ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਸਣ ਵਾਲੇ ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ ਦਾ ਚੋਣਕਾਰ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ਪਹੁੰਚਯੋਗਤਾ ਸ਼ਾਰਟਕੱਟ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਦੀ ਸੁਰਖੀ ਪੱਟੀ।"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID ਅਣਲਾਕ ਸਫਲ।"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI ਅਣਲਾਕ ਸਫਲ।"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ਨੈੱਟਵਰਕ ਸਬਸੈੱਟ ਸੇਵਾ ਪ੍ਰਦਾਨਕ ਅਣਲਾਕ ਸਫਲ।"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index c12c9ae3f352..3e790c71acd2 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -243,8 +243,8 @@ <string name="global_action_power_off" msgid="4404936470711393203">"Wyłącz"</string> <string name="global_action_power_options" msgid="1185286119330160073">"Przycisk zasilania"</string> <string name="global_action_restart" msgid="4678451019561687074">"Uruchom ponownie"</string> - <string name="global_action_emergency" msgid="1387617624177105088">"Alarmowy"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Zgłoszenie błędu"</string> + <string name="global_action_emergency" msgid="1387617624177105088">"Nagły przypadek"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Zgłoś błąd"</string> <string name="global_action_logout" msgid="6093581310002476511">"Zakończ sesję"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Zrzut ekranu"</string> <string name="bugreport_title" msgid="8549990811777373050">"Zgłoś błąd"</string> @@ -1840,8 +1840,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Zaktualizowany przez administratora"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Usunięty przez administratora"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n\n•włącza tryb ciemny,\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”.\n\n"<annotation id="url">"Więcej informacji"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Aby wydłużyć czas pracy na baterii, Oszczędzanie baterii:\n\n•włącza tryb ciemny,\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”."</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Aby wydłużyć czas pracy na baterii, funkcja Oszczędzanie baterii:\n\n•włącza tryb ciemny\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”\n\n"<annotation id="url">"Więcej informacji"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Aby wydłużyć czas pracy na baterii, funkcja Oszczędzanie baterii:\n\n•włącza tryb ciemny\n•wyłącza lub ogranicza aktywność w tle, niektóre efekty wizualne oraz inne funkcje, np. „OK Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Oszczędzanie danych uniemożliwia niektórym aplikacjom wysyłanie i odbieranie danych w tle, zmniejszając w ten sposób ich użycie. Aplikacja, z której w tej chwili korzystasz, może uzyskiwać dostęp do danych, ale rzadziej. Może to powodować, że obrazy będą się wyświetlać dopiero po kliknięciu."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Włączyć Oszczędzanie danych?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Włącz"</string> @@ -1916,7 +1916,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Żądanie SS zmienione na rozmowę wideo"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Żądanie SS zmienione na żądanie USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Zmieniono na nowe żądanie SS"</string> - <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil służbowy"</string> + <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil do pracy"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alert"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Rozwiń"</string> <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"Zwiń"</string> @@ -1952,7 +1952,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"Aplikacja <xliff:g id="APP_NAME_0">%1$s</xliff:g> nie jest teraz dostępna. Zarządza tym aplikacja <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Więcej informacji"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Wznów działanie aplikacji"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"Włączyć profil służbowy?"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"Włączyć profil do pracy?"</string> <string name="work_mode_off_message" msgid="8417484421098563803">"Aplikacje do pracy, powiadomienia, dane i inne funkcje profilu do pracy zostaną włączone"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Włącz"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Aplikacja jest niedostępna"</string> @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Okno opcji zasilania"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran blokady"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Zrzut ekranu"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranowy skrót ułatwień dostępu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Wybierz ekranowy skrót ułatwień dostępu"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skrót ułatwień dostępu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Pasek napisów w aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Odblokowano ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Odblokowano IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Odblokowano usługodawcę w podzbiorze sieci."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index dbd69a192940..9908e38124f7 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -240,7 +240,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"Desligar"</string> <string name="global_action_restart" msgid="4678451019561687074">"Reiniciar"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Emergência"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Relatório de bugs"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Relatório de bug"</string> <string name="global_action_logout" msgid="6093581310002476511">"Finalizar sessão"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Captura de tela"</string> <string name="bugreport_title" msgid="8549990811777373050">"Relatório de bug"</string> @@ -1797,7 +1797,7 @@ <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string> - <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string> + <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar \"Economia de dados\"?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Desbloqueio do ICCID concluído."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Desbloqueio de IMPI concluído."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Desbloqueio do provedor de serviços de subconjunto de rede concluído."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 6bd1dfa69bea..76864e91b60f 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de energia"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecrã de bloqueio"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captura de ecrã"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade no ecrã"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selecionador de atalhos de acessibilidade no ecrã"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas da app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"O desbloqueio do ICCID foi bem-sucedido."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"O desbloqueio do IMPI foi bem-sucedido."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"O desbloqueio do fornecedor de serviços do subconjunto da rede foi bem-sucedido."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index dbd69a192940..9908e38124f7 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -240,7 +240,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"Desligar"</string> <string name="global_action_restart" msgid="4678451019561687074">"Reiniciar"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Emergência"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Relatório de bugs"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Relatório de bug"</string> <string name="global_action_logout" msgid="6093581310002476511">"Finalizar sessão"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Captura de tela"</string> <string name="bugreport_title" msgid="8549990811777373050">"Relatório de bug"</string> @@ -1797,7 +1797,7 @@ <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\".\n\n"<annotation id="url">"Saiba mais"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"Para prolongar a duração da carga, a \"Economia de bateria\":\n\n•ativa o tema escuro;\n•desativa ou restringe atividades em segundo plano, alguns efeitos visuais e outros recursos, como o \"Ok Google\"."</string> <string name="data_saver_description" msgid="4995164271550590517">"Para ajudar a reduzir o uso de dados, a Economia de dados impede que alguns apps enviem ou recebam dados em segundo plano. Um app que você esteja usando no momento pode acessar dados, mas com menos frequência. Isso pode fazer com que imagens não sejam exibidas até que você toque nelas."</string> - <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar Economia de dados?"</string> + <string name="data_saver_enable_title" msgid="7080620065745260137">"Ativar \"Economia de dados\"?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ativar"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Por %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Caixa de diálogo de liga/desliga"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Bloquear tela"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capturar tela"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Seletor de atalho de acessibilidade na tela"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Atalho de acessibilidade"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Barra de legendas do app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Desbloqueio do ICCID concluído."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Desbloqueio de IMPI concluído."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Desbloqueio do provedor de serviços de subconjunto de rede concluído."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 02e3fdaaf1b8..5143fc7a3e5e 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -2076,12 +2076,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Power Dialog"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ecran de blocare"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Captură de ecran"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Comandă rapidă de accesibilitate de pe ecran"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Selector de comenzi rapide de accesibilitate de pe ecran"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Comandă rapidă de accesibilitate"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Bară cu legenda pentru <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2215,4 +2212,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"S-a realizat deblocarea ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"S-a realizat deblocarea IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"S-a realizat deblocarea privind furnizorul de servicii și subsetul de rețea."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index b8047549a55e..fdcb3f27a8fe 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Диалоговое окно питания"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокированный экран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Скриншот"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Действие для быстрого включения"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Выбор действия для быстрого включения"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Быстрое включение"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Строка субтитров в приложении \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Разблокировка ICCID завершена."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Разблокировка IMPI завершена."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Разблокировка подмножества сети оператора завершена."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 103bc392d252..4f5de4592e6c 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -2044,12 +2044,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"බල සංවාදය"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"අගුලු තිරය"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"තිර රුව"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"තිරය මත ප්රවේශ්යතා කෙටිමග"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"තිරය මත ප්රවේශ්යතා කෙටිමං තෝරනය"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ප්රවේශ්යතා කෙටිමඟ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> හි සිරස්තල තීරුව."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2183,4 +2180,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID අගුලු හැරීම සාර්ථකයි."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI අගුලු හැරීම සාර්ථකයි."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ජාල උප කට්ටල සේවා සැපයුම්කරු අගුලු හැරීම අසාර්ථකයි."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 485ee1126666..d51c36f132e6 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialógové okno napájania"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Uzamknúť obrazovku"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Snímka obrazovky"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Skratka dostupnosti na obrazovke"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Výber skratky dostupnosti na obrazovke"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Skratka dostupnosti"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Popis aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Odomknutie karty ICCID bolo úspešné."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Odomknutie karty IMPI bolo úspešné."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Odomknutie poskytovateľa služieb podmnožiny siete bolo úspešné."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index b8bb8afe30a6..1258d2e0ec16 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -290,10 +290,10 @@ <string name="notification_channel_retail_mode" msgid="3732239154256431213">"Predstavitev za maloprodajo"</string> <string name="notification_channel_usb" msgid="1528280969406244896">"Povezava USB"</string> <string name="notification_channel_heavy_weight_app" msgid="17455756500828043">"Aplikacija se izvaja"</string> - <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikacije, ki porabljajo energijo akumulatorja"</string> - <string name="foreground_service_app_in_background" msgid="1439289699671273555">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> porablja energijo akumulatorja"</string> - <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"Toliko aplikacij porablja energijo akumulatorja: <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Dotaknite se za prikaz podrobnosti porabe akumulatorja in prenosa podatkov"</string> + <string name="notification_channel_foreground_service" msgid="7102189948158885178">"Aplikacije, ki porabljajo energijo baterije"</string> + <string name="foreground_service_app_in_background" msgid="1439289699671273555">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> porablja energijo baterije"</string> + <string name="foreground_service_apps_in_background" msgid="7340037176412387863">"Toliko aplikacij porablja energijo baterije: <xliff:g id="NUMBER">%1$d</xliff:g>"</string> + <string name="foreground_service_tap_for_details" msgid="9078123626015586751">"Dotaknite se za prikaz podrobnosti porabe baterije in prenosa podatkov"</string> <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="8974401416068943888">"Varni način"</string> <string name="android_system_label" msgid="5974767339591067210">"Sistem Android"</string> @@ -380,7 +380,7 @@ <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"Prikaz aplikacije s prekrivanjem drugih aplikacij"</string> <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"Ta aplikacija lahko prekrije druge aplikacije ali druge dele zaslona. To lahko vpliva na normalno delovanje aplikacije in na način prikaza drugih aplikacij."</string> <string name="permlab_runInBackground" msgid="541863968571682785">"izvajanje v ozadju"</string> - <string name="permdesc_runInBackground" msgid="4344539472115495141">"Ta aplikacija se lahko izvaja tudi v ozadju, kar lahko privede do hitrejšega praznjenja akumulatorja."</string> + <string name="permdesc_runInBackground" msgid="4344539472115495141">"Ta aplikacija se lahko izvaja tudi v ozadju, kar lahko privede do hitrejšega praznjenja baterije."</string> <string name="permlab_useDataInBackground" msgid="783415807623038947">"prenos podatkov v ozadju"</string> <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"Ta aplikacija lahko prenaša podatke tudi v ozadju, kar lahko privede do večje porabe prenosa podatkov."</string> <string name="permlab_persistentActivity" msgid="464970041740567970">"neprekinjeno izvajanje aplikacij"</string> @@ -1430,8 +1430,8 @@ <string name="permdesc_requestInstallPackages" msgid="3969369278325313067">"Aplikaciji omogoča zahtevanje namestitve paketov."</string> <string name="permlab_requestDeletePackages" msgid="2541172829260106795">"Zahteva za brisanje paketov"</string> <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"Omogoča aplikaciji, da zahteva brisanje paketov."</string> - <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"Dovoljenje za prezrtje optimizacij akumulatorja"</string> - <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"Aplikaciji dovoljuje, da vpraša za dovoljenje, ali naj prezre optimizacije akumulatorja."</string> + <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"Dovoljenje za prezrtje optimizacij baterije"</string> + <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"Aplikaciji dovoljuje, da vpraša za dovoljenje, ali naj prezre optimizacije baterije."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"Tapnite dvakrat za nadzor povečave/pomanjšave"</string> <string name="gadget_host_error_inflating" msgid="2449961590495198720">"Pripomočka ni bilo mogoče dodati."</string> <string name="ime_action_go" msgid="5536744546326495436">"Pojdi"</string> @@ -2067,7 +2067,7 @@ <string name="notification_appops_overlay_active" msgid="5571732753262836481">"prekriva druge aplikacije na zaslonu"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Rutinsko informativno obvestilo o načinu delovanja"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Baterija se bo morda izpraznila, preden jo običajno priključite na polnjenje"</string> - <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo akumulatorja za podaljšanje časa delovanja akumulatorja"</string> + <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Vklopilo se je varčevanje z energijo baterije za podaljšanje časa delovanja baterije"</string> <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"Varčevanje z energijo baterije"</string> <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"Varčevanje z energijo baterije je izklopljeno"</string> <string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"Baterija v telefonu je dovolj napolnjena. Funkcije niso več omejene."</string> @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Pogovorno okno o porabi energije"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Zaklenjen zaslon"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Posnetek zaslona"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Zaslonska bližnjica funkcij za ljudi s posebnimi potrebami"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Izbirnik zaslonske bližnjice funkcij za ljudi s posebnimi potrebami"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Bližnjica funkcij za ljudi s posebnimi potrebami"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Vrstica s podnapisi aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Odklepanje ICCID je uspelo."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Odklepanje IMPI je uspelo."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Odklepanje podnabora omrežja za ponudnika storitev je uspela."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 55f006ea8c6e..84c5ab19bcec 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1897,7 +1897,7 @@ <string name="deprecated_target_sdk_app_store" msgid="8456784048558808909">"Kontrollo për përditësim"</string> <string name="new_sms_notification_title" msgid="6528758221319927107">"Ke mesazhe të reja"</string> <string name="new_sms_notification_content" msgid="3197949934153460639">"Hap aplikacionin SMS për ta parë"</string> - <string name="profile_encrypted_title" msgid="9001208667521266472">"Disa funksione mund të jenë të kufizuara"</string> + <string name="profile_encrypted_title" msgid="9001208667521266472">"Disa veçori mund të jenë të kufizuara"</string> <string name="profile_encrypted_detail" msgid="5279730442756849055">"Profili i punës është i kyçur"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"Trokit për ta shkyçur profilin e punës"</string> <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"U lidh me <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogu i energjisë"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekrani i kyçjes"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Pamja e ekranit"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shkurtorja e qasshmërisë në ekran"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Zgjedhësi i shkurtores së qasshmërisë në ekran"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shkurtorja e qasshmërisë"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Shiriti i nëntitullit të <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Shkyçja e ICCID ishte e suksesshme."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Shkyçja e IMPI ishte e suksesshme."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Shkyçja e ofruesit të shërbimit të nënrenditjes së rrjetit ishte e suksesshme."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d149e27cc35b..31346eaa56af 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -2076,12 +2076,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Дијалог напајања"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Закључани екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Снимак екрана"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Пречица за приступачност на екрану"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Алатка за бирање пречица за приступачност на екрану"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Пречица за приступачност"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Трака са насловима апликације <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2215,4 +2212,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Откључавање ICCID-а је успело."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Откључавање IMPI-ја је успело."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Захтев за откључавање добављача услуге подскупа мреже је успео."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index bb268cce256a..82ad5947b1e7 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1794,8 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Administratören uppdaterade paketet"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Administratören raderade paketet"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n•·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”\n\n"<annotation id="url">"Läs mer"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n•·inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”"</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n• inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”\n\n"<annotation id="url">"Läs mer"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Batterisparläget förlänger batteritiden genom att:\n\n• aktivera mörkt tema\n• inaktivera eller begränsa aktivitet i bakgrunden, vissa visuella effekter och andra funktioner, som ”Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Med databesparing kan du minska dataanvändningen genom att hindra en del appar från att skicka eller ta emot data i bakgrunden. Appar som du använder kan komma åt data, men det sker kanske inte lika ofta. Detta innebär t.ex. att bilder inte visas förrän du trycker på dem."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Vill du aktivera Databesparing?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Aktivera"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialogruta för ström"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Låsskärm"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skärmdump"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Tillgänglighetsgenväg på skärmen"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Valfunktion för tillgänglighetsgenväg på skärmen"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Aktivera tillgänglighet snabbt"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Textningsfält för <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Upplåst med ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Upplåst med IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Operatör upplåst för delnätverk."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 4f9376c02bd0..2e60e1ab17a0 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Kidirisha cha Nishati"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Skrini Iliyofungwa"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Picha ya skrini"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Njia ya Mkato ya Ufikivu kwenye Skrini"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Kichagua Njia ya Mkato ya Ufikivu kwenye Skrini"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Njia ya Mkato ya Ufikivu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Upau wa manukuu wa <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Imefungua kwa kutumia ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Imefungua kwa kutumia IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Imefungua kadi ya mtoa huduma ya mtandao mdogo."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 97b2afd095e7..6c48c6f35168 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -693,7 +693,7 @@ <string name="policylab_setGlobalProxy" msgid="215332221188670221">"சாதன குளோபல் ப்ராக்ஸியை அமை"</string> <string name="policydesc_setGlobalProxy" msgid="7149665222705519604">"கொள்கை இயக்கப்பட்டிருக்கும்போது பயன்படுத்த வேண்டிய சாதன குளோபல் ப்ராக்ஸியை அமைக்கவும். சாதன உரிமையாளரால் மட்டுமே குளோபல் ப்ராக்ஸியை அமைக்க முடியும்."</string> <string name="policylab_expirePassword" msgid="6015404400532459169">"திரைப் பூட்டு கடவுச்சொல் காலாவதி நேரத்தை அமை"</string> - <string name="policydesc_expirePassword" msgid="9136524319325960675">"எந்த இடைவெளியில் திரைப் பூட்டின் கடவுச்சொல், பின் அல்லது வடிவம் மாற்றப்பட வேண்டும் என்பதை மாற்றும்."</string> + <string name="policydesc_expirePassword" msgid="9136524319325960675">"எந்த இடைவெளியில் திரைப் பூட்டின் கடவுச்சொல், பின் அல்லது பேட்டர்ன் மாற்றப்பட வேண்டும் என்பதை மாற்றும்."</string> <string name="policylab_encryptedStorage" msgid="9012936958126670110">"சேமிப்பிட முறைமையாக்கலை அமை"</string> <string name="policydesc_encryptedStorage" msgid="1102516950740375617">"சேமித்த ஆப்ஸ் டேட்டாவை முறைமையாக்கப்பட வேண்டும் என்பதைக் கோரலாம்."</string> <string name="policylab_disableCamera" msgid="5749486347810162018">"கேமராக்களை முடக்கு"</string> @@ -883,11 +883,11 @@ <string name="lockscreen_unlock_label" msgid="4648257878373307582">"தடைநீக்கு"</string> <string name="lockscreen_sound_on_label" msgid="1660281470535492430">"ஒலியை இயக்கு"</string> <string name="lockscreen_sound_off_label" msgid="2331496559245450053">"ஒலியை முடக்கு"</string> - <string name="lockscreen_access_pattern_start" msgid="3778502525702613399">"வடிவம் தொடங்கியது"</string> - <string name="lockscreen_access_pattern_cleared" msgid="7493849102641167049">"வடிவம் அழிக்கப்பட்டது"</string> + <string name="lockscreen_access_pattern_start" msgid="3778502525702613399">"பேட்டர்ன் தொடங்கியது"</string> + <string name="lockscreen_access_pattern_cleared" msgid="7493849102641167049">"பேட்டர்ன் அழிக்கப்பட்டது"</string> <string name="lockscreen_access_pattern_cell_added" msgid="6746676335293144163">"கலம் சேர்க்கப்பட்டது"</string> <string name="lockscreen_access_pattern_cell_added_verbose" msgid="2931364927622563465">"கலம் <xliff:g id="CELL_INDEX">%1$s</xliff:g> சேர்க்கப்பட்டது"</string> - <string name="lockscreen_access_pattern_detected" msgid="3931150554035194012">"வடிவம் நிறைவடைந்தது"</string> + <string name="lockscreen_access_pattern_detected" msgid="3931150554035194012">"பேட்டர்ன் நிறைவடைந்தது"</string> <string name="lockscreen_access_pattern_area" msgid="1288780416685002841">"வடிவப் பகுதி."</string> <string name="keyguard_accessibility_widget_changed" msgid="7298011259508200234">"%1$s. விட்ஜெட் %2$d / %3$d."</string> <string name="keyguard_accessibility_add_widget" msgid="8245795023551343672">"விட்ஜெட்டைச் சேர்க்கவும்."</string> @@ -904,7 +904,7 @@ <string name="keyguard_accessibility_widget_deleted" msgid="1509738950119878705">"விட்ஜெட் <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> நீக்கப்பட்டது."</string> <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"திறப்பதற்கான பகுதியை விவரிக்கவும்."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"ஸ்லைடு மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"வடிவம் மூலம் திறத்தல்."</string> + <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"பேட்டர்ன் மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_face_unlock" msgid="632407612842329815">"முகம் காட்டித் திறத்தல்."</string> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Pin மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"சிம்மைத் திறக்கும் பின்."</string> @@ -1576,7 +1576,7 @@ <string name="display_manager_overlay_display_title" msgid="1480158037150469170">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="2810034719482834679">", பாதுகாப்பானது"</string> <string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"வடிவத்தை மறந்துவிட்டீர்களா"</string> - <string name="kg_wrong_pattern" msgid="1342812634464179931">"தவறான வடிவம்"</string> + <string name="kg_wrong_pattern" msgid="1342812634464179931">"தவறான பேட்டர்ன்"</string> <string name="kg_wrong_password" msgid="2384677900494439426">"தவறான கடவுச்சொல்"</string> <string name="kg_wrong_pin" msgid="3680925703673166482">"தவறான பின்"</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568"> @@ -1794,10 +1794,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"உங்கள் நிர்வாகி நீக்கியுள்ளார்"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"சரி"</string> - <!-- no translation found for battery_saver_description_with_learn_more (5997766757551917769) --> - <skip /> - <!-- no translation found for battery_saver_description (8587408568232177204) --> - <skip /> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"பேட்டரி நிலையை நீட்டிப்பதற்காக, பேட்டரி சேமிப்பான்:\n\n•டார்க் தீமினை ஆன் செய்யும்\n•பின்னணி செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Hey Google” போன்ற பிற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்\n\n"<annotation id="url">"மேலும் அறிக"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"பேட்டரி நிலையை நீட்டிப்பதற்காக, பேட்டரி சேமிப்பான்:\n\n•டார்க் தீமினை ஆன் செய்யும்\n•பின்னணி செயல்பாடு, சில விஷுவல் எஃபெக்ட்கள், “Hey Google” போன்ற பிற அம்சங்களை ஆஃப் செய்யும் அல்லது கட்டுப்படுத்தும்"</string> <string name="data_saver_description" msgid="4995164271550590517">"டேட்டா உபயோகத்தைக் குறைப்பதற்கு உதவ, பின்புலத்தில் டேட்டாவை அனுப்புவது அல்லது பெறுவதிலிருந்து சில ஆப்ஸை டேட்டா சேமிப்பான் தடுக்கும். தற்போது பயன்படுத்தும் ஆப்ஸானது எப்போதாவது டேட்டாவை அணுகலாம். எடுத்துக்காட்டாக, படங்களை நீங்கள் தட்டும் வரை அவை காட்டப்படாது."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"டேட்டா சேமிப்பானை இயக்கவா?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"இயக்கு"</string> @@ -2044,17 +2042,13 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"பவர் உரையாடல்"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"பூட்டுத் திரை"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ஸ்கிரீன்ஷாட்"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"திரையிலுள்ள அணுகல்தன்மை ஷார்ட்கட்"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"திரையிலுள்ள அணுகல்தன்மை ஷார்ட்கட்டிற்கான தேர்வி"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"அணுகல்தன்மை ஷார்ட்கட்"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸின் தலைப்புப் பட்டி."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> - <!-- no translation found for conversation_single_line_image_placeholder (6983271082911936900) --> - <skip /> + <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"படம் அனுப்பப்பட்டது"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"உரையாடல்"</string> <string name="conversation_title_fallback_group_chat" msgid="456073374993104303">"குழு உரையாடல்"</string> <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> @@ -2184,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID அன்லாக் செயல்படுத்தப்பட்டது."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI அன்லாக் செயல்படுத்தப்பட்டது."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"நெட்வொர்க் சப்செட் சேவை வழங்குநர் அன்லாக் செயல்படுத்தப்பட்டது."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 1b1d43f3385d..7135749a8f0b 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1650,7 +1650,7 @@ <string name="done_accessibility_shortcut_menu_button" msgid="3668407723770815708">"పూర్తయింది"</string> <string name="disable_accessibility_shortcut" msgid="5806091378745232383">"సత్వరమార్గాన్ని ఆఫ్ చేయి"</string> <string name="leave_accessibility_shortcut_on" msgid="6543362062336990814">"సత్వరమార్గాన్ని ఉపయోగించు"</string> - <string name="color_inversion_feature_name" msgid="326050048927789012">"రంగుల మార్పిడి"</string> + <string name="color_inversion_feature_name" msgid="326050048927789012">"కలర్ మార్పిడి"</string> <string name="color_correction_feature_name" msgid="3655077237805422597">"రంగు సవరణ"</string> <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"వాల్యూమ్ కీలు నొక్కి ఉంచబడ్డాయి. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆన్ చేయబడింది"</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"వాల్యూమ్ కీలు నొక్కి ఉంచబడ్డాయి. <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ఆఫ్ చేయబడింది"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"పవర్ డైలాగ్ను తెరువు"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"స్క్రీన్ను లాక్ చేయి"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"స్క్రీన్షాట్"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"స్క్రీన్పై ఉండే యాక్సెసిబిలిటీ షార్ట్కట్"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"స్క్రీన్పై ఉండే యాక్సెసిబిలిటీ షార్ట్కట్ల ఎంపిక సాధనం"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"యాక్సెసిబిలిటీ షార్ట్కట్"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> క్యాప్షన్ బార్."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్లో ఉంచబడింది"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID అన్లాక్ విజయవంతమైంది."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI అన్లాక్ విజయవంతమైంది."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"నెట్వర్క్ సబ్సెట్ సర్వీస్ ప్రొవైడర్ అన్లాక్ విజయవంతమైంది."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 80c7a59e91f8..90b5b65ae35d 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"กล่องโต้ตอบพลังงาน"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"หน้าจอล็อก"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ภาพหน้าจอ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"ทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"ตัวเลือกทางลัดการช่วยเหลือพิเศษบนหน้าจอ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ทางลัดการช่วยเหลือพิเศษ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"แถบคำบรรยาย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ปลดล็อก ICCID สำเร็จแล้ว"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"ปลดล็อก IMPI สำเร็จแล้ว"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"ปลดล็อกผู้ให้บริการในเครือข่ายย่อยสำเร็จแล้ว"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index e1e9ca840d69..27e6b4d3fc54 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Dialog ng Power"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Lock Screen"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Screenshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Shortcut ng Accessibility sa Screen"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Tagapili ng Shortcut ng Accessibility sa Screen"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Shortcut ng Accessibility"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Caption bar ng <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Na-unlock na ang ICCID."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Na-unlock na ang IMPI."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Na-unlock na ang service provider ng subset ng Network."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 05984a03bde8..3bade8eb8e72 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Güç İletişim Kutusu"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Kilit Ekranı"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Ekran görüntüsü"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekran Erişilebilirlik Kısayolu"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekran Erişilebilirlik Kısayol Seçici"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Erişilebilirlik Kısayolu"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulamasının başlık çubuğu."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID kilidi açıldı."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI kilidi açıldı."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Ağ alt kümesi servis sağlayıcı kilidi açıldı."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index fe373a1a8b15..f8176962885a 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -2110,12 +2110,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Відкрити вікно"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Заблокувати екран"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Знімок екрана"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Екранний засіб спеціальних можливостей"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Вибір екранного засобу спеціальних можливостей"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Засіб спеціальних можливостей"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Смуга із субтитрами для додатка <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2249,4 +2246,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID розблоковано."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI розблоковано."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Постачальника послуг для підгрупи мереж розблоковано."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index f2ed25089684..3d0b66a4e276 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -303,7 +303,7 @@ <string name="permgroupdesc_sms" msgid="5726462398070064542">"SMS پیغامات بھیجیں اور دیکھیں"</string> <string name="permgrouplab_storage" msgid="1938416135375282333">"فائلز اور میڈیا"</string> <string name="permgroupdesc_storage" msgid="6351503740613026600">"آپ کے آلہ پر تصاویر، میڈیا اور فائلوں تک رسائی حاصل کر سکتی ہیں"</string> - <string name="permgrouplab_microphone" msgid="2480597427667420076">"مائکروفون"</string> + <string name="permgrouplab_microphone" msgid="2480597427667420076">"مائیکروفون"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"آڈیو ریکارڈ کریں"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"جسمانی سرگرمی"</string> <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"اپنی جسمانی سرگرمی تک رسائی حاصل کریں"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"پاور ڈائیلاگ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"مقفل اسکرین"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"اسکرین شاٹ"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"آن اسکرین ایکسیسبیلٹی شارٹ کٹ منتخب کنندہ"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ایکسیسبیلٹی کا شارٹ کٹ"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> کی کیپشن بار۔"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID غیر مقفل ہو گیا۔"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI غیر مقفل ہو گیا۔"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"نیٹ ورک سب سیٹ کے خدمت کا فراہم کنندہ غیر مقفل ہو گیا۔"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index e0725578f648..c82cc13afd3e 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -182,7 +182,7 @@ <item quantity="one">Sertifikat markazi sertifikati o‘rnatildi</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Noma‘lum uchinchi shaxslar tomonidan"</string> - <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ishchi profil administratori"</string> + <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Ish profili administratori"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g> tomonidan"</string> <string name="work_profile_deleted" msgid="5891181538182009328">"Ichshi profil o‘chirildi"</string> <string name="work_profile_deleted_details" msgid="3773706828364418016">"Ishchi profilning administrator ilovasi yo‘q yoki buzilgan. Shuning uchun, ishchi profilingiz va unga aloqador ma’lumotlar o‘chirib tashlandi. Yordam olish uchun administratoringizga murojaat qiling."</string> @@ -1854,7 +1854,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS talabi video chaqiruvga almashtirildi"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS talabi USSD talabiga almashtirildi"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Yangi SS talabiga almashtirildi"</string> - <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Ishchi profil"</string> + <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Ish profili"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Ogohlantirildi"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Yoyish"</string> <string name="expand_button_content_description_expanded" msgid="7484217944948667489">"Yig‘ish"</string> @@ -1888,8 +1888,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> ishlamayapti. Uning ishlashini <xliff:g id="APP_NAME_1">%2$s</xliff:g> cheklamoqda."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Batafsil"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Ilovani ishga tushirish"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"Ishchi profil yoqilsinmi?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Ishchi ilovalar, bildirishnomalar, ma’lumotlar va boshqa ishchi profil imkoniyatlari yoqiladi"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"Ish profili yoqilsinmi?"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Ishga oid ilovalar, bildirishnomalar, ma’lumotlar va boshqa ish profili imkoniyatlari yoqiladi"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Yoqish"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Ilova ishlamayapti"</string> <string name="app_blocked_message" msgid="542972921087873023">"Ayni vaqtda <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi ishlamayapti."</string> @@ -1898,7 +1898,7 @@ <string name="new_sms_notification_title" msgid="6528758221319927107">"Sizga yangi SMS keldi"</string> <string name="new_sms_notification_content" msgid="3197949934153460639">"Ko‘rish uchun SMS ilovasini oching"</string> <string name="profile_encrypted_title" msgid="9001208667521266472">"Ayrim funksiyalar ishlamasligi mumkin"</string> - <string name="profile_encrypted_detail" msgid="5279730442756849055">"Ishchi profil yopiq"</string> + <string name="profile_encrypted_detail" msgid="5279730442756849055">"Ish profili yopiq"</string> <string name="profile_encrypted_message" msgid="1128512616293157802">"Qulfini ochish uchun bosing"</string> <string name="usb_mtp_launch_notification_title" msgid="774319638256707227">"<xliff:g id="PRODUCT_NAME">%1$s</xliff:g> qurilmasiga ulandi"</string> <string name="usb_mtp_launch_notification_description" msgid="6942535713629852684">"Fayllarni ko‘rish uchun bosing"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Quvvat muloqot oynasi"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Ekran qulfi"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Skrinshot"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Ekranda tezkor ishga tushirish"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Ekranda tezkor ishga tushirishni tanlagich"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Tezkor ishga tushirish"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g> taglavhalar paneli."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2067,7 +2064,7 @@ <string name="resolver_cant_share_with_personal_apps_explanation" msgid="2959282422751315171">"AT administratoringiz bu turdagi kontentni shaxsiy profildagi ilovada ulashishni taqiqlagan"</string> <string name="resolver_cant_access_personal_apps" msgid="648291604475669395">"Shaxsiy ilovalarda ochilmaydi"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="2298773629302296519">"AT administratoringiz bu turdagi kontentni shaxsiy profildagi ilovada ochilishini taqiqlagan"</string> - <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Ishchi profil pauzada"</string> + <string name="resolver_turn_on_work_apps" msgid="884910835250037247">"Ish profili pauzada"</string> <string name="resolver_switch_on_work" msgid="2873009160846966379">"Yoqish"</string> <string name="resolver_no_work_apps_available_share" msgid="7933949011797699505">"Bu kontent bilan ishlay oladigan ishga oid ilovalar topilmadi"</string> <string name="resolver_no_work_apps_available_resolve" msgid="1244844292366099399">"Bu kontentni ocha oladigan ishga oid ilovalar topilmadi"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID qulfi ochildi."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI qulfi ochildi."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Aloqa operatori tarmoq qismi qulfdan chiqarilmadi."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 8579414dcfc8..27c0a71fa5e9 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"Tìm hiểu thêm"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Mở lại ứng dụng"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"Bạn muốn bật hồ sơ công việc?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Ứng dụng công việc, thông báo, dữ liệu và các tính năng khác của hồ sơ công việc sẽ được bật"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Các ứng dụng công việc, thông báo, dữ liệu và các tính năng khác của hồ sơ công việc sẽ được bật"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"Bật"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Ứng dụng này không dùng được"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> hiện không dùng được."</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Hộp thoại thao tác với nguồn"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khóa màn hình"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Chụp ảnh màn hình"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Phím tắt hỗ trợ tiếp cận trên màn hình"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Bộ chọn phím tắt hỗ trợ tiếp cận trên màn hình"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Phím tắt hỗ trợ tiếp cận"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Thanh phụ đề của <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Mở khóa ICCID thành công."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Mở khóa IMPI thành công."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Mở khóa nhà cung cấp dịch vụ tập con của mạng thành công."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 7b3ca7663d1a..eba34e1ac3f4 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"电源对话框"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"锁定屏幕"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"屏幕截图"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"屏幕上的无障碍功能快捷方式"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"屏幕上的无障碍功能快捷方式选择器"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"无障碍功能快捷方式"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"<xliff:g id="APP_NAME">%1$s</xliff:g>的标题栏。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID 解锁成功。"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI 解锁成功。"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"网络子集服务提供商解锁成功。"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 30a596ae1917..795f561833e6 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"電源對話框"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"將畫面上鎖"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"螢幕截圖"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"螢幕無障礙功能捷徑"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"螢幕無障礙功能捷徑選擇器"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"無障礙功能捷徑"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明列。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID 解鎖成功。"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI 解鎖成功。"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"網絡子集服務供應商解鎖成功。"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index ac5ebaa86c1b..44676d48d7ae 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1889,7 +1889,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"瞭解詳情"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"取消暫停應用程式"</string> <string name="work_mode_off_title" msgid="5503291976647976560">"要開啟工作資料夾嗎?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"系統將開啟你的辦公應用程式、通知、資料和其他工作資料夾功能"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"系統將開啟你的工作應用程式、通知、資料和其他工作資料夾功能"</string> <string name="work_mode_turn_on" msgid="3662561662475962285">"開啟"</string> <string name="app_blocked_title" msgid="7353262160455028160">"應用程式無法使用"</string> <string name="app_blocked_message" msgid="542972921087873023">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」目前無法使用。"</string> @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"開啟電源對話方塊"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"螢幕鎖定"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"擷取螢幕畫面"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"螢幕上的無障礙捷徑"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"螢幕上的無障礙捷徑選擇器"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"無障礙捷徑"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」的說明文字列。"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"ICCID 解鎖成功。"</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"IMPI 解鎖成功。"</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"網路子集服務供應商解鎖成功。"</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 32a31f72336f..e8a8b8d15980 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -2042,12 +2042,9 @@ <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Ibhokisi lamandla"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Khiya isikrini"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Isithombe-skrini"</string> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_label (8488701469459210309) --> - <skip /> - <!-- no translation found for accessibility_system_action_on_screen_a11y_shortcut_chooser_label (1057878690209817886) --> - <skip /> - <!-- no translation found for accessibility_system_action_hardware_a11y_shortcut_label (5764644187715255107) --> - <skip /> + <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"Isinqamuleli sokufinyeleleka kusikrini"</string> + <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"Isikhethi sesinqamuleli sokufinyeleleka kusikrini"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"Isinqamuleli sokufinyeleleka"</string> <string name="accessibility_freeform_caption" msgid="8377519323496290122">"Ibha yamazwibela we-<xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> @@ -2181,4 +2178,8 @@ <string name="PERSOSUBSTATE_SIM_ICCID_SUCCESS" msgid="8058678548991999545">"Ukuvula i-ICCID kuphumelele."</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS" msgid="2545608067978550571">"Ukuvula i-IMPI kuphumelele."</string> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS" msgid="4352382949744625007">"Ukuvula I-subset yethiwekhi subset yomhlinzeki wesevisi kuphumelele."</string> + <string name="config_pdp_reject_dialog_title" msgid="4072057179246785727"></string> + <string name="config_pdp_reject_user_authentication_failed" msgid="4531693033885744689"></string> + <string name="config_pdp_reject_service_not_subscribed" msgid="8190338397128671588"></string> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" msgid="6024904218067254186"></string> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index fa4c25ad460a..003c0da95f9b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3899,7 +3899,7 @@ <string name="config_managed_provisioning_package" translatable="false">com.android.managedprovisioning</string> <!-- Whether or not swipe up gesture's opt-in setting is available on this device --> - <bool name="config_swipe_up_gesture_setting_available">false</bool> + <bool name="config_swipe_up_gesture_setting_available">true</bool> <!-- Applications which are disabled unless matching a particular sku --> <string-array name="config_disableApksUnlessMatchedSku_apk_list" translatable="false" /> @@ -4421,4 +4421,8 @@ <!-- Set to true to make assistant show in front of the dream/screensaver. --> <bool name="config_assistantOnTopOfDream">false</bool> + <!-- pdp data retry for cause 29, 33 and 55 --> + <bool name="config_pdp_reject_enable_retry">false</bool> + <!-- pdp data reject retry delay in ms --> + <integer name="config_pdp_reject_retry_delay_ms">-1</integer> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index bbe547b597f5..2ac61ecad2e5 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -559,6 +559,10 @@ <dimen name="resolver_max_width">480dp</dimen> + <!-- Tile Stroke width --> + <dimen name="config_qsTileStrokeWidthActive">-1dp</dimen> + <dimen name="config_qsTileStrokeWidthInactive">-1dp</dimen> + <!-- Amount to reduce the size of the circular mask by (to compensate for aliasing effects). This is only used on circular displays. --> <dimen name="circular_display_mask_thickness">1px</dimen> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 51b23dbfb59b..35a7857b839f 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5747,4 +5747,13 @@ ul.</string> <string name="PERSOSUBSTATE_SIM_IMPI_SUCCESS">IMPI unlock successful.</string> <!-- Success message displayed on SIM NS_SP Depersonalization panel [CHAR LIMIT=none] --> <string name="PERSOSUBSTATE_SIM_NS_SP_SUCCESS">Network subset service provider unlock successful.</string> + + <!-- pdp data reject dialog string for cause 29, 33 and 55 [CHAR LIMIT=100] --> + <string name="config_pdp_reject_dialog_title"></string> + <!-- pdp data reject dialog string for cause 29 (USER_AUTHENTICATION) [CHAR LIMIT=100] --> + <string name="config_pdp_reject_user_authentication_failed"></string> + <!-- pdp data reject dialog string for cause 33 (SERVICE_OPTION_NOT_SUBSCRIBED) [CHAR LIMIT=100] --> + <string name="config_pdp_reject_service_not_subscribed"></string> + <!-- pdp data reject dialog string for cause 55 (MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED) [CHAR LIMIT=100] --> + <string name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed"></string> </resources> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index bcce1f05f0dd..f920083f5cb3 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -248,12 +248,6 @@ please see styles_device_defaults.xml. <item name="windowExitAnimation">@anim/fast_fade_out</item> </style> - <!-- Window animations for screen savers. {@hide} --> - <style name="Animation.Dream"> - <item name="windowEnterAnimation">@anim/slow_fade_in</item> - <item name="windowExitAnimation">@anim/fast_fade_out</item> - </style> - <!-- Status Bar Styles --> <style name="TextAppearance.StatusBar"> <item name="textAppearance">?attr/textAppearanceSmall</item> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a82e7784b167..9a7f07f14cb1 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -361,6 +361,8 @@ <java-symbol type="bool" name="config_disableUsbPermissionDialogs"/> <java-symbol type="dimen" name="config_highResTaskSnapshotScale" /> <java-symbol type="dimen" name="config_lowResTaskSnapshotScale" /> + <java-symbol type="dimen" name="config_qsTileStrokeWidthInactive" /> + <java-symbol type="dimen" name="config_qsTileStrokeWidthActive" /> <java-symbol type="bool" name="config_use16BitTaskSnapshotPixelFormat" /> <java-symbol type="bool" name="config_hasRecents" /> <java-symbol type="string" name="config_recentsComponentName" /> @@ -1580,7 +1582,6 @@ <java-symbol type="style" name="Animation.Tooltip" /> <java-symbol type="style" name="Animation.TypingFilter" /> <java-symbol type="style" name="Animation.TypingFilterRestore" /> - <java-symbol type="style" name="Animation.Dream" /> <java-symbol type="style" name="Theme.DeviceDefault.Dialog.Alert" /> <java-symbol type="style" name="Theme.DeviceDefault.Light.Dialog.Alert" /> <java-symbol type="style" name="Theme.Dialog.Alert" /> @@ -1825,6 +1826,9 @@ <java-symbol type="anim" name="rotation_animation_jump_exit" /> <java-symbol type="anim" name="rotation_animation_xfade_exit" /> <java-symbol type="anim" name="rotation_animation_enter" /> + <java-symbol type="anim" name="dream_activity_open_exit" /> + <java-symbol type="anim" name="dream_activity_open_enter" /> + <java-symbol type="anim" name="dream_activity_close_exit" /> <java-symbol type="array" name="config_autoBrightnessButtonBacklightValues" /> <java-symbol type="array" name="config_autoBrightnessKeyboardBacklightValues" /> <java-symbol type="array" name="config_autoBrightnessLcdBacklightValues" /> @@ -3999,4 +4003,11 @@ <java-symbol type="string" name="notification_channel_network_alerts" /> <java-symbol type="string" name="notification_channel_network_available" /> + <!-- For Pdn throttle feature --> + <java-symbol type="bool" name="config_pdp_reject_enable_retry" /> + <java-symbol type="integer" name="config_pdp_reject_retry_delay_ms" /> + <java-symbol type="string" name="config_pdp_reject_dialog_title" /> + <java-symbol type="string" name="config_pdp_reject_user_authentication_failed" /> + <java-symbol type="string" name="config_pdp_reject_service_not_subscribed" /> + <java-symbol type="string" name="config_pdp_reject_multi_conn_to_same_pdn_not_allowed" /> </resources> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 88f9fc2199e5..6e2995de0fe1 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -704,6 +704,7 @@ please see themes_device_defaults.xml. <style name="Theme.Dream"> <item name="windowBackground">@color/black</item> <item name="windowDisablePreview">true</item> + <item name="windowActivityTransitions">true</item> </style> <!-- Default theme for dialog windows and activities (on API level 10 and lower), diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 6720ed6b7bf9..04906788f4cb 100644 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -2548,9 +2548,18 @@ public class PackageManagerTests extends AndroidTestCase { } else { installFromRawResource(apk2Name, apk2, 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); - int match = mContext.getPackageManager().checkSignatures(pkg1.getPackageName(), - pkg2.getPackageName()); - assertEquals(expMatchResult, match); + // TODO: All checkSignatures tests should return the same result regardless of + // querying by package name or uid; however if there are any edge cases where + // individual packages within a shareduid are compared with signatures that do not + // match the full lineage of the shareduid this method should be overloaded to + // accept the expected response for the uid query. + PackageManager pm = getPm(); + int matchByName = pm.checkSignatures(pkg1.getPackageName(), pkg2.getPackageName()); + int pkg1Uid = pm.getApplicationInfo(pkg1.getPackageName(), 0).uid; + int pkg2Uid = pm.getApplicationInfo(pkg2.getPackageName(), 0).uid; + int matchByUid = pm.checkSignatures(pkg1Uid, pkg2Uid); + assertEquals(expMatchResult, matchByName); + assertEquals(expMatchResult, matchByUid); } } finally { if (cleanUp) { diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index 164c372768c0..bfcf52af80bf 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -100,12 +100,12 @@ public class ImeInsetsSourceConsumerTest { // test if setVisibility can show IME mImeConsumer.onWindowFocusGained(); mImeConsumer.applyImeVisibility(true); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); // test if setVisibility can hide IME mImeConsumer.applyImeVisibility(false); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); }); } diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index cc85332590ba..d4c256972b28 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -245,14 +245,14 @@ public class InsetsControllerTest { mController.applyImeVisibility(true /* setVisible */); mController.show(Type.all()); // quickly jump to final state by cancelling it. - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); mController.applyImeVisibility(false /* setVisible */); mController.hide(Type.all()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -268,10 +268,10 @@ public class InsetsControllerTest { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { mController.getSourceConsumer(ITYPE_IME).onWindowFocusGained(); mController.applyImeVisibility(true); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); mController.applyImeVisibility(false); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); mController.getSourceConsumer(ITYPE_IME).onWindowFocusLost(); }); @@ -291,7 +291,7 @@ public class InsetsControllerTest { mController.hide(types); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertEquals(ANIMATION_TYPE_NONE, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_NONE, mController.getAnimationType(ITYPE_STATUS_BAR)); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); @@ -302,7 +302,7 @@ public class InsetsControllerTest { mController.show(types); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -321,21 +321,21 @@ public class InsetsControllerTest { int types = Type.navigationBars() | Type.systemBars(); // test show select types. mController.show(types); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); // test hide all mController.hide(Type.all()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); // test single show mController.show(Type.navigationBars()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -363,7 +363,7 @@ public class InsetsControllerTest { mController.hide(Type.systemBars()); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -372,7 +372,7 @@ public class InsetsControllerTest { mController.show(Type.systemBars()); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -383,7 +383,7 @@ public class InsetsControllerTest { mController.hide(Type.navigationBars()); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_NONE, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -391,7 +391,7 @@ public class InsetsControllerTest { mController.hide(Type.systemBars()); assertEquals(ANIMATION_TYPE_NONE, mController.getAnimationType(ITYPE_NAVIGATION_BAR)); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -411,13 +411,13 @@ public class InsetsControllerTest { // show two at a time and hide one by one. mController.show(types); mController.hide(Type.navigationBars()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertTrue(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); mController.hide(Type.systemBars()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(navBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(statusBar.getType()).isRequestedVisible()); assertFalse(mController.getSourceConsumer(ime.getType()).isRequestedVisible()); @@ -431,7 +431,7 @@ public class InsetsControllerTest { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { mController.hide(Type.statusBars()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(ITYPE_STATUS_BAR).isRequestedVisible()); assertFalse(mController.getState().getSource(ITYPE_STATUS_BAR).isVisible()); @@ -446,7 +446,7 @@ public class InsetsControllerTest { // Gaining control mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR)); assertEquals(ANIMATION_TYPE_HIDE, mController.getAnimationType(ITYPE_STATUS_BAR)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertFalse(mController.getSourceConsumer(ITYPE_STATUS_BAR).isRequestedVisible()); assertFalse(mController.getState().getSource(ITYPE_STATUS_BAR).isVisible()); }); @@ -468,7 +468,7 @@ public class InsetsControllerTest { mController.onControlsChanged(createSingletonControl(ITYPE_IME)); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_IME)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(ITYPE_IME).isRequestedVisible()); assertTrue(mController.getState().getSource(ITYPE_IME).isVisible()); }); @@ -489,7 +489,7 @@ public class InsetsControllerTest { mController.show(ime(), true /* fromIme */); assertEquals(ANIMATION_TYPE_SHOW, mController.getAnimationType(ITYPE_IME)); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertTrue(mController.getSourceConsumer(ITYPE_IME).isRequestedVisible()); assertTrue(mController.getState().getSource(ITYPE_IME).isVisible()); }); @@ -658,7 +658,7 @@ public class InsetsControllerTest { mController.getState().getSource(ITYPE_IME).getFrame()); assertNotEquals(new Rect(4, 5, 6, 7), mController.getState().getSource(ITYPE_IME).getVisibleFrame()); - mController.cancelExistingAnimation(); + mController.cancelExistingAnimations(); assertEquals(new Rect(0, 1, 2, 3), mController.getState().getSource(ITYPE_IME).getFrame()); assertEquals(new Rect(4, 5, 6, 7), diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 6af887d401f6..9cd7cc6aedcf 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -197,6 +197,9 @@ <split-permission name="android.permission.WRITE_EXTERNAL_STORAGE"> <new-permission name="android.permission.READ_EXTERNAL_STORAGE" /> </split-permission> + <split-permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"> + <new-permission name="android.permission.READ_PHONE_STATE" /> + </split-permission> <split-permission name="android.permission.READ_CONTACTS" targetSdk="16"> <new-permission name="android.permission.READ_CALL_LOG" /> diff --git a/errorprone/Android.bp b/errorprone/Android.bp index 016b85510a94..098f4bfa74ac 100644 --- a/errorprone/Android.bp +++ b/errorprone/Android.bp @@ -20,6 +20,4 @@ java_library_host { plugins: [ "//external/dagger2:dagger2-auto-service", ], - - javacflags: ["-verbose"], } diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/RethrowFromSystemChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/RethrowFromSystemChecker.java new file mode 100644 index 000000000000..48123abd26cb --- /dev/null +++ b/errorprone/java/com/google/errorprone/bugpatterns/android/RethrowFromSystemChecker.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.errorprone.bugpatterns.android; + +import static com.google.errorprone.BugPattern.SeverityLevel.WARNING; +import static com.google.errorprone.matchers.Matchers.enclosingClass; +import static com.google.errorprone.matchers.Matchers.hasAnnotation; +import static com.google.errorprone.matchers.Matchers.instanceMethod; +import static com.google.errorprone.matchers.Matchers.isSameType; +import static com.google.errorprone.matchers.Matchers.methodInvocation; +import static com.google.errorprone.matchers.Matchers.throwStatement; +import static com.google.errorprone.matchers.Matchers.variableType; + +import com.google.auto.service.AutoService; +import com.google.errorprone.BugPattern; +import com.google.errorprone.VisitorState; +import com.google.errorprone.bugpatterns.BugChecker; +import com.google.errorprone.bugpatterns.BugChecker.CatchTreeMatcher; +import com.google.errorprone.matchers.Description; +import com.google.errorprone.matchers.Matcher; +import com.sun.source.tree.CatchTree; +import com.sun.source.tree.StatementTree; +import com.sun.source.tree.Tree; +import com.sun.source.tree.VariableTree; + +import java.util.List; + +/** + * Apps making calls into the system server may end up persisting internal state + * or making security decisions based on the perceived success or failure of a + * call, or any default values returned. For this reason, we want to strongly + * throw when there was trouble with the transaction. + * <p> + * The rethrowFromSystemServer() method is the best-practice way of doing this + * correctly, so that we don't clutter logs with misleading stack traces, and + * this checker verifies that best-practice is used. + */ +@AutoService(BugChecker.class) +@BugPattern( + name = "AndroidFrameworkRethrowFromSystem", + summary = "Verifies that system_server calls use rethrowFromSystemServer()", + severity = WARNING) +public final class RethrowFromSystemChecker extends BugChecker implements CatchTreeMatcher { + private static final Matcher<Tree> INSIDE_MANAGER = + enclosingClass(hasAnnotation("android.annotation.SystemService")); + private static final Matcher<VariableTree> REMOTE_EXCEPTION = variableType( + isSameType("android.os.RemoteException")); + private static final Matcher<StatementTree> RETHROW_FROM_SYSTEM = throwStatement( + methodInvocation(instanceMethod().onExactClass("android.os.RemoteException") + .named("rethrowFromSystemServer"))); + + @Override + public Description matchCatch(CatchTree tree, VisitorState state) { + if (INSIDE_MANAGER.matches(tree, state) + && REMOTE_EXCEPTION.matches(tree.getParameter(), state)) { + final List<? extends StatementTree> statements = tree.getBlock().getStatements(); + if (statements.size() != 1 || !RETHROW_FROM_SYSTEM.matches(statements.get(0), state)) { + return buildDescription(tree) + .setMessage("Must contain single " + + "'throw e.rethrowFromSystemServer()' statement") + .build(); + } + } + return Description.NO_MATCH; + } +} diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java index 1ce816c34990..232cf3f0d677 100644 --- a/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java +++ b/errorprone/java/com/google/errorprone/bugpatterns/android/TargetSdkChecker.java @@ -34,6 +34,27 @@ import com.sun.source.tree.BinaryTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.Tree.Kind; +/** + * Over the years we've had several obscure bugs related to how SDK level + * comparisons are performed, specifically during the window of time where we've + * started distributing the "frankenbuild" to developers. + * <p> + * Consider the case where a framework developer shipping release "R" wants to + * only grant a specific behavior to modern apps; they could write this in two + * different ways: + * <ol> + * <li>if (targetSdkVersion > Build.VERSION_CODES.Q) { + * <li>if (targetSdkVersion >= Build.VERSION_CODES.R) { + * </ol> + * The safer of these two options is (2), which will ensure that developers only + * get the behavior when <em>both</em> the app and the platform agree on the + * specific SDK level having shipped. + * <p> + * Consider the breakage that would happen with option (1) if we started + * shipping APKs that are based on the final R SDK, but are then installed on + * earlier preview releases which still consider R to be CUR_DEVELOPMENT; they'd + * risk crashing due to behaviors that were never part of the official R SDK. + */ @AutoService(BugChecker.class) @BugPattern( name = "AndroidFrameworkTargetSdk", diff --git a/libs/hwui/jni/pdf/PdfEditor.cpp b/libs/hwui/jni/pdf/PdfEditor.cpp index 828d6e3992b6..e65921ac8e0a 100644 --- a/libs/hwui/jni/pdf/PdfEditor.cpp +++ b/libs/hwui/jni/pdf/PdfEditor.cpp @@ -110,7 +110,7 @@ static void nativeSetTransformAndClip(JNIEnv* env, jclass thiz, jlong documentPt jlong transformPtr, jint clipLeft, jint clipTop, jint clipRight, jint clipBottom) { FPDF_DOCUMENT document = reinterpret_cast<FPDF_DOCUMENT>(documentPtr); - FPDF_PAGE* page = (FPDF_PAGE*) FPDF_LoadPage(document, pageIndex); + FPDF_PAGE page = FPDF_LoadPage(document, pageIndex); if (!page) { jniThrowException(env, "java/lang/IllegalStateException", "cannot open page"); diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index 8d5acc631274..24a6228242a5 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -157,21 +157,7 @@ void SkiaOpenGLPipeline::onStop() { } } -static void setBufferCount(ANativeWindow* window, uint32_t extraBuffers) { - int query_value; - int err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); - if (err != 0 || query_value < 0) { - ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err, query_value); - return; - } - auto min_undequeued_buffers = static_cast<uint32_t>(query_value); - - int bufferCount = min_undequeued_buffers + 2 + extraBuffers; - native_window_set_buffer_count(window, bufferCount); -} - -bool SkiaOpenGLPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior, - uint32_t extraBuffers) { +bool SkiaOpenGLPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior) { if (mEglSurface != EGL_NO_SURFACE) { mEglManager.destroySurface(mEglSurface); mEglSurface = EGL_NO_SURFACE; @@ -189,7 +175,6 @@ bool SkiaOpenGLPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBeh if (mEglSurface != EGL_NO_SURFACE) { const bool preserveBuffer = (swapBehavior != SwapBehavior::kSwap_discardBuffer); mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer); - setBufferCount(surface, extraBuffers); return true; } diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h index fc6e1142b4f2..fddd97f1c5b3 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.h @@ -45,8 +45,7 @@ public: bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) override; DeferredLayerUpdater* createTextureLayer() override; - bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior, - uint32_t extraBuffers) override; + bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override; void onStop() override; bool isSurfaceReady() override; bool isContextReady() override; diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp index 535a19956e03..212a4284a824 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp @@ -116,8 +116,7 @@ DeferredLayerUpdater* SkiaVulkanPipeline::createTextureLayer() { void SkiaVulkanPipeline::onStop() {} -bool SkiaVulkanPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior, - uint32_t extraBuffers) { +bool SkiaVulkanPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBehavior) { if (mVkSurface) { mVkManager.destroySurface(mVkSurface); mVkSurface = nullptr; @@ -127,7 +126,7 @@ bool SkiaVulkanPipeline::setSurface(ANativeWindow* surface, SwapBehavior swapBeh mRenderThread.requireVkContext(); mVkSurface = mVkManager.createSurface(surface, mColorMode, mSurfaceColorSpace, mSurfaceColorType, - mRenderThread.getGrContext(), extraBuffers); + mRenderThread.getGrContext(), 0); } return mVkSurface != nullptr; diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h index c8bf233d8e1c..6268daa6213f 100644 --- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h +++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.h @@ -42,8 +42,7 @@ public: bool swapBuffers(const renderthread::Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) override; DeferredLayerUpdater* createTextureLayer() override; - bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior, - uint32_t extraBuffers) override; + bool setSurface(ANativeWindow* surface, renderthread::SwapBehavior swapBehavior) override; void onStop() override; bool isSurfaceReady() override; bool isContextReady() override; diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 335bcdcfc1fb..a362bd220936 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -139,9 +139,30 @@ void CanvasContext::destroy() { mAnimationContext->destroy(); } +static void setBufferCount(ANativeWindow* window, uint32_t extraBuffers) { + int query_value; + int err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value); + if (err != 0 || query_value < 0) { + ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err, query_value); + return; + } + auto min_undequeued_buffers = static_cast<uint32_t>(query_value); + + int bufferCount = min_undequeued_buffers + 2 + extraBuffers; + native_window_set_buffer_count(window, bufferCount); +} + void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { ATRACE_CALL(); + if (mRenderAheadDepth == 0 && DeviceInfo::get()->getMaxRefreshRate() > 66.6f) { + mFixedRenderAhead = false; + mRenderAheadCapacity = 1; + } else { + mFixedRenderAhead = true; + mRenderAheadCapacity = mRenderAheadDepth; + } + if (window) { mNativeSurface = std::make_unique<ReliableSurface>(window); mNativeSurface->init(); @@ -149,21 +170,17 @@ void CanvasContext::setSurface(ANativeWindow* window, bool enableTimeout) { // TODO: Fix error handling & re-shorten timeout ANativeWindow_setDequeueTimeout(window, 4000_ms); } + mNativeSurface->setExtraBufferCount(mRenderAheadCapacity); } else { mNativeSurface = nullptr; } - if (mRenderAheadDepth == 0 && DeviceInfo::get()->getMaxRefreshRate() > 66.6f) { - mFixedRenderAhead = false; - mRenderAheadCapacity = 1; - } else { - mFixedRenderAhead = true; - mRenderAheadCapacity = mRenderAheadDepth; - } - bool hasSurface = mRenderPipeline->setSurface( - mNativeSurface ? mNativeSurface->getNativeWindow() : nullptr, mSwapBehavior, - mRenderAheadCapacity); + mNativeSurface ? mNativeSurface->getNativeWindow() : nullptr, mSwapBehavior); + + if (mNativeSurface && !mNativeSurface->didSetExtraBuffers()) { + setBufferCount(mNativeSurface->getNativeWindow(), mRenderAheadCapacity); + } mFrameNumber = -1; diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h index ba0d64c5492d..c3c22869a42f 100644 --- a/libs/hwui/renderthread/IRenderPipeline.h +++ b/libs/hwui/renderthread/IRenderPipeline.h @@ -66,8 +66,7 @@ public: virtual bool swapBuffers(const Frame& frame, bool drew, const SkRect& screenDirty, FrameInfo* currentFrameInfo, bool* requireSwap) = 0; virtual DeferredLayerUpdater* createTextureLayer() = 0; - virtual bool setSurface(ANativeWindow* window, SwapBehavior swapBehavior, - uint32_t extraBuffers) = 0; + virtual bool setSurface(ANativeWindow* window, SwapBehavior swapBehavior) = 0; virtual void onStop() = 0; virtual bool isSurfaceReady() = 0; virtual bool isContextReady() = 0; diff --git a/libs/hwui/renderthread/ReliableSurface.cpp b/libs/hwui/renderthread/ReliableSurface.cpp index 8a0b4e8455bd..dcf1fc189588 100644 --- a/libs/hwui/renderthread/ReliableSurface.cpp +++ b/libs/hwui/renderthread/ReliableSurface.cpp @@ -19,6 +19,7 @@ #include <log/log_main.h> #include <private/android/AHardwareBufferHelpers.h> // TODO: this should be including apex instead. +#include <system/window.h> #include <vndk/window.h> namespace android::uirenderer::renderthread { @@ -44,6 +45,7 @@ ReliableSurface::~ReliableSurface() { ANativeWindow_setDequeueBufferInterceptor(mWindow, nullptr, nullptr); ANativeWindow_setQueueBufferInterceptor(mWindow, nullptr, nullptr); ANativeWindow_setPerformInterceptor(mWindow, nullptr, nullptr); + ANativeWindow_setQueryInterceptor(mWindow, nullptr, nullptr); ANativeWindow_release(mWindow); } @@ -63,6 +65,10 @@ void ReliableSurface::init() { result = ANativeWindow_setPerformInterceptor(mWindow, hook_perform, this); LOG_ALWAYS_FATAL_IF(result != NO_ERROR, "Failed to set perform interceptor: error = %d", result); + + result = ANativeWindow_setQueryInterceptor(mWindow, hook_query, this); + LOG_ALWAYS_FATAL_IF(result != NO_ERROR, "Failed to set query interceptor: error = %d", + result); } int ReliableSurface::reserveNext() { @@ -249,9 +255,29 @@ int ReliableSurface::hook_perform(ANativeWindow* window, ANativeWindow_performFn case ANATIVEWINDOW_PERFORM_SET_BUFFERS_FORMAT: rs->mFormat = static_cast<AHardwareBuffer_Format>(va_arg(args, int32_t)); break; + case NATIVE_WINDOW_SET_BUFFER_COUNT: + size_t bufferCount = va_arg(args, size_t); + if (bufferCount >= rs->mExpectedBufferCount) { + rs->mDidSetExtraBuffers = true; + } else { + ALOGD("HOOK FAILED! Expected %zd got = %zd", rs->mExpectedBufferCount, bufferCount); + } + break; } } return result; } +int ReliableSurface::hook_query(const ANativeWindow *window, ANativeWindow_queryFn query, + void *data, int what, int *value) { + ReliableSurface* rs = reinterpret_cast<ReliableSurface*>(data); + int result = query(window, what, value); + if (what == ANATIVEWINDOW_QUERY_MIN_UNDEQUEUED_BUFFERS && result == OK) { + std::lock_guard _lock{rs->mMutex}; + *value += rs->mExtraBuffers; + rs->mExpectedBufferCount = *value + 2; + } + return result; +} + }; // namespace android::uirenderer::renderthread diff --git a/libs/hwui/renderthread/ReliableSurface.h b/libs/hwui/renderthread/ReliableSurface.h index 58cd06730123..f699eb1fe6b3 100644 --- a/libs/hwui/renderthread/ReliableSurface.h +++ b/libs/hwui/renderthread/ReliableSurface.h @@ -17,6 +17,7 @@ #pragma once #include <android-base/unique_fd.h> +#include <system/window.h> #include <apex/window.h> #include <utils/Errors.h> #include <utils/Macros.h> @@ -49,6 +50,16 @@ public: return ret; } + void setExtraBufferCount(size_t extraBuffers) { + std::lock_guard _lock{mMutex}; + mExtraBuffers = extraBuffers; + } + + bool didSetExtraBuffers() const { + std::lock_guard _lock{mMutex}; + return mDidSetExtraBuffers; + } + private: ANativeWindow* mWindow; @@ -62,6 +73,9 @@ private: base::unique_fd mReservedFenceFd; bool mHasDequeuedBuffer = false; int mBufferQueueState = OK; + size_t mExtraBuffers = 0; + size_t mExpectedBufferCount = 0; + bool mDidSetExtraBuffers = false; bool isFallbackBuffer(const ANativeWindowBuffer* windowBuffer) const; ANativeWindowBuffer* acquireFallbackBuffer(int error); @@ -81,6 +95,8 @@ private: static int hook_perform(ANativeWindow* window, ANativeWindow_performFn perform, void* data, int operation, va_list args); + static int hook_query(const ANativeWindow* window, ANativeWindow_queryFn query, void* data, + int what, int* value); }; }; // namespace android::uirenderer::renderthread diff --git a/libs/hwui/tests/unit/SkiaPipelineTests.cpp b/libs/hwui/tests/unit/SkiaPipelineTests.cpp index 1208062d9da0..e7a889d08cfd 100644 --- a/libs/hwui/tests/unit/SkiaPipelineTests.cpp +++ b/libs/hwui/tests/unit/SkiaPipelineTests.cpp @@ -398,7 +398,7 @@ RENDERTHREAD_SKIA_PIPELINE_TEST(SkiaPipeline, context_lost) { auto surface = context.surface(); auto pipeline = std::make_unique<SkiaOpenGLPipeline>(renderThread); EXPECT_FALSE(pipeline->isSurfaceReady()); - EXPECT_TRUE(pipeline->setSurface(surface.get(), SwapBehavior::kSwap_default, 0)); + EXPECT_TRUE(pipeline->setSurface(surface.get(), SwapBehavior::kSwap_default)); EXPECT_TRUE(pipeline->isSurfaceReady()); renderThread.destroyRenderingContext(); EXPECT_FALSE(pipeline->isSurfaceReady()); diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index 6b0e17d84357..2cca669a592b 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -455,8 +455,7 @@ public final class AudioDeviceInfo { * may be an empty array if no encapsulation modes are supported. */ public @NonNull @AudioTrack.EncapsulationMode int[] getEncapsulationModes() { - // Implement a getter in r-dev or r-tv-dev as needed. - return new int[0]; // be careful of returning a copy of any internal data. + return mPort.encapsulationModes(); } /** @@ -474,8 +473,7 @@ public final class AudioDeviceInfo { * may be an empty array if no metadata types are supported. */ public @NonNull @AudioTrack.EncapsulationMetadataType int[] getEncapsulationMetadataTypes() { - // Implement a getter in r-dev or r-tv-dev as needed. - return new int[0]; // be careful of returning a copy of any internal data. + return mPort.encapsulationMetadataTypes(); } /** diff --git a/media/java/android/media/AudioDevicePort.java b/media/java/android/media/AudioDevicePort.java index 51909db11a09..42d0f0cc13c5 100644 --- a/media/java/android/media/AudioDevicePort.java +++ b/media/java/android/media/AudioDevicePort.java @@ -16,8 +16,11 @@ package android.media; +import android.annotation.NonNull; import android.compat.annotation.UnsupportedAppUsage; +import java.util.Arrays; + /** * The AudioDevicePort is a specialized type of AudioPort * describing an input (e.g microphone) or output device (e.g speaker) @@ -35,17 +38,22 @@ public class AudioDevicePort extends AudioPort { private final int mType; private final String mAddress; + private final int[] mEncapsulationModes; + private final int[] mEncapsulationMetadataTypes; @UnsupportedAppUsage AudioDevicePort(AudioHandle handle, String deviceName, int[] samplingRates, int[] channelMasks, int[] channelIndexMasks, - int[] formats, AudioGain[] gains, int type, String address) { + int[] formats, AudioGain[] gains, int type, String address, int[] encapsulationModes, + @AudioTrack.EncapsulationMetadataType int[] encapsulationMetadataTypes) { super(handle, (AudioManager.isInputDevice(type) == true) ? AudioPort.ROLE_SOURCE : AudioPort.ROLE_SINK, deviceName, samplingRates, channelMasks, channelIndexMasks, formats, gains); mType = type; mAddress = address; + mEncapsulationModes = encapsulationModes; + mEncapsulationMetadataTypes = encapsulationMetadataTypes; } /** @@ -72,6 +80,31 @@ public class AudioDevicePort extends AudioPort { } /** + * Get supported encapsulation modes. + */ + public @NonNull @AudioTrack.EncapsulationMode int[] encapsulationModes() { + if (mEncapsulationModes == null) { + return new int[0]; + } + return Arrays.stream(mEncapsulationModes).boxed() + .filter(mode -> mode != AudioTrack.ENCAPSULATION_MODE_HANDLE) + .mapToInt(Integer::intValue).toArray(); + } + + /** + * Get supported encapsulation metadata types. + */ + public @NonNull @AudioTrack.EncapsulationMetadataType int[] encapsulationMetadataTypes() { + if (mEncapsulationMetadataTypes == null) { + return new int[0]; + } + int[] encapsulationMetadataTypes = new int[mEncapsulationMetadataTypes.length]; + System.arraycopy(mEncapsulationMetadataTypes, 0, + encapsulationMetadataTypes, 0, mEncapsulationMetadataTypes.length); + return encapsulationMetadataTypes; + } + + /** * Build a specific configuration of this audio device port for use by methods * like AudioManager.connectAudioPatch(). */ diff --git a/media/java/android/media/AudioMetadata.java b/media/java/android/media/AudioMetadata.java index c91ff0d099cf..ff9fd4187272 100644 --- a/media/java/android/media/AudioMetadata.java +++ b/media/java/android/media/AudioMetadata.java @@ -166,10 +166,25 @@ public final class AudioMetadata { * * A Boolean value which is true if Atmos is present in an E-AC3 stream. */ + + // Since Boolean isn't handled by Parceling, we translate + // internally to KEY_HAS_ATMOS when sending through JNI. + // Consider deprecating this key for KEY_HAS_ATMOS in the future. + // @NonNull public static final Key<Boolean> KEY_ATMOS_PRESENT = createKey("atmos-present", Boolean.class); /** + * A key representing the presence of Atmos in an E-AC3 stream. + * + * An Integer value which is nonzero if Atmos is present in an E-AC3 stream. + * The integer representation is used for communication to the native side. + * @hide + */ + @NonNull public static final Key<Integer> KEY_HAS_ATMOS = + createKey("has-atmos", Integer.class); + + /** * A key representing the audio encoding used for the stream. * This is the same encoding used in {@link AudioFormat#getEncoding()}. * @@ -731,6 +746,15 @@ public final class AudioMetadata { Log.e(TAG, "Failed to unpack value for map"); return null; } + + // Special handling of KEY_ATMOS_PRESENT. + if (key.equals(Format.KEY_HAS_ATMOS.getName()) + && value.first == Format.KEY_HAS_ATMOS.getValueClass()) { + ret.set(Format.KEY_ATMOS_PRESENT, + (Boolean) ((int) value.second != 0)); // Translate Integer to Boolean + continue; // Should we store both keys in the java table? + } + ret.set(createKey(key, value.first), value.first.cast(value.second)); } return ret; @@ -746,11 +770,19 @@ public final class AudioMetadata { return false; } for (Key<?> key : obj.keySet()) { + Object value = obj.get(key); + + // Special handling of KEY_ATMOS_PRESENT. + if (key == Format.KEY_ATMOS_PRESENT) { + key = Format.KEY_HAS_ATMOS; + value = (Integer) ((boolean) value ? 1 : 0); // Translate Boolean to Integer + } + if (!strDataPackage.pack(output, key.getName())) { Log.i(TAG, "Failed to pack key: " + key.getName()); return false; } - if (!OBJECT_PACKAGE.pack(output, new Pair<>(key.getValueClass(), obj.get(key)))) { + if (!OBJECT_PACKAGE.pack(output, new Pair<>(key.getValueClass(), value))) { Log.i(TAG, "Failed to pack value: " + obj.get(key)); return false; } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 6c9013fe37c4..0dc019cc7abd 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -170,8 +170,7 @@ public final class MediaRouter2Manager { public MediaController getMediaControllerForRoutingSession( @NonNull RoutingSessionInfo sessionInfo) { for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { - String volumeControlId = controller.getPlaybackInfo().getVolumeControlId(); - if (TextUtils.equals(sessionInfo.getId(), volumeControlId)) { + if (areSessionsMatched(controller, sessionInfo)) { return controller; } } @@ -206,6 +205,37 @@ public final class MediaRouter2Manager { } /** + * Gets available routes for the given routing session. + * The returned routes can be passed to + * {@link #transfer(RoutingSessionInfo, MediaRoute2Info)} for transferring the routing session. + * + * @param sessionInfo the routing session that would be transferred + */ + @NonNull + public List<MediaRoute2Info> getAvailableRoutesForRoutingSession( + @NonNull RoutingSessionInfo sessionInfo) { + Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); + + List<MediaRoute2Info> routes = new ArrayList<>(); + + String packageName = sessionInfo.getClientPackageName(); + List<String> preferredFeatures = mPreferredFeaturesMap.get(packageName); + if (preferredFeatures == null) { + preferredFeatures = Collections.emptyList(); + } + synchronized (mRoutesLock) { + for (MediaRoute2Info route : mRoutes.values()) { + if (route.isSystemRoute() || route.hasAnyFeatures(preferredFeatures) + || sessionInfo.getSelectedRoutes().contains(route.getId()) + || sessionInfo.getTransferableRoutes().contains(route.getId())) { + routes.add(route); + } + } + } + return routes; + } + + /** * Gets the system routing session associated with no specific application. */ @NonNull @@ -219,6 +249,33 @@ public final class MediaRouter2Manager { } /** + * Gets the routing session of a media session. + * If the session is using {#link PlaybackInfo#PLAYBACK_TYPE_LOCAL local playback}, + * the system routing session is returned. + * If the session is using {#link PlaybackInfo#PLAYBACK_TYPE_REMOTE remote playback}, + * it returns the corresponding routing session or {@code null} if it's unavailable. + */ + @Nullable + public RoutingSessionInfo getRoutingSessionForMediaController(MediaController mediaController) { + MediaController.PlaybackInfo playbackInfo = mediaController.getPlaybackInfo(); + if (playbackInfo == null) { + return null; + } + if (playbackInfo.getPlaybackType() == MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL) { + return new RoutingSessionInfo.Builder(getSystemRoutingSession()) + .setClientPackageName(mediaController.getPackageName()) + .build(); + } + for (RoutingSessionInfo sessionInfo : getActiveSessions()) { + if (!sessionInfo.isSystemSession() + && areSessionsMatched(mediaController, sessionInfo)) { + return sessionInfo; + } + } + return null; + } + + /** * Gets routing sessions of an application with the given package name. * The first element of the returned list is the system routing session. * @@ -578,8 +635,11 @@ public final class MediaRouter2Manager { public List<MediaRoute2Info> getSelectedRoutes(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - List<String> routeIds = sessionInfo.getSelectedRoutes(); - return getRoutesWithIds(routeIds); + synchronized (sLock) { + return sessionInfo.getSelectedRoutes().stream().map(mRoutes::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } } /** @@ -589,8 +649,15 @@ public final class MediaRouter2Manager { public List<MediaRoute2Info> getSelectableRoutes(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - List<String> routeIds = sessionInfo.getSelectableRoutes(); - return getRoutesWithIds(routeIds); + List<String> selectedRouteIds = sessionInfo.getSelectedRoutes(); + + synchronized (sLock) { + return sessionInfo.getSelectableRoutes().stream() + .filter(routeId -> !selectedRouteIds.contains(routeId)) + .map(mRoutes::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } } /** @@ -600,8 +667,15 @@ public final class MediaRouter2Manager { public List<MediaRoute2Info> getDeselectableRoutes(@NonNull RoutingSessionInfo sessionInfo) { Objects.requireNonNull(sessionInfo, "sessionInfo must not be null"); - List<String> routeIds = sessionInfo.getDeselectableRoutes(); - return getRoutesWithIds(routeIds); + List<String> selectedRouteIds = sessionInfo.getSelectedRoutes(); + + synchronized (sLock) { + return sessionInfo.getDeselectableRoutes().stream() + .filter(routeId -> selectedRouteIds.contains(routeId)) + .map(mRoutes::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } } /** @@ -762,12 +836,25 @@ public final class MediaRouter2Manager { } } - private List<MediaRoute2Info> getRoutesWithIds(List<String> routeIds) { - synchronized (sLock) { - return routeIds.stream().map(mRoutes::get) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + private boolean areSessionsMatched(MediaController mediaController, + RoutingSessionInfo sessionInfo) { + MediaController.PlaybackInfo playbackInfo = mediaController.getPlaybackInfo(); + if (playbackInfo == null) { + return false; + } + + String volumeControlId = playbackInfo.getVolumeControlId(); + if (volumeControlId == null) { + return false; + } + + if (TextUtils.equals(volumeControlId, sessionInfo.getId())) { + return true; } + // Workaround for provider not being able to know the unique session ID. + return TextUtils.equals(volumeControlId, sessionInfo.getOriginalId()) + && TextUtils.equals(mediaController.getPackageName(), + sessionInfo.getOwnerPackageName()); } /** diff --git a/media/java/android/media/RoutingSessionInfo.java b/media/java/android/media/RoutingSessionInfo.java index 608e29a7a6ca..edf1fc58ecf5 100644 --- a/media/java/android/media/RoutingSessionInfo.java +++ b/media/java/android/media/RoutingSessionInfo.java @@ -50,6 +50,7 @@ public final class RoutingSessionInfo implements Parcelable { final String mId; final CharSequence mName; + final String mOwnerPackageName; final String mClientPackageName; @Nullable final String mProviderId; @@ -71,6 +72,7 @@ public final class RoutingSessionInfo implements Parcelable { mId = builder.mId; mName = builder.mName; + mOwnerPackageName = builder.mOwnerPackageName; mClientPackageName = builder.mClientPackageName; mProviderId = builder.mProviderId; @@ -96,6 +98,7 @@ public final class RoutingSessionInfo implements Parcelable { mId = ensureString(src.readString()); mName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(src); + mOwnerPackageName = src.readString(); mClientPackageName = ensureString(src.readString()); mProviderId = src.readString(); @@ -159,6 +162,15 @@ public final class RoutingSessionInfo implements Parcelable { } /** + * Gets the package name of the session owner. + * @hide + */ + @Nullable + public String getOwnerPackageName() { + return mOwnerPackageName; + } + + /** * Gets the client package name of the session */ @NonNull @@ -263,6 +275,7 @@ public final class RoutingSessionInfo implements Parcelable { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(mId); dest.writeCharSequence(mName); + dest.writeString(mOwnerPackageName); dest.writeString(mClientPackageName); dest.writeString(mProviderId); dest.writeStringList(mSelectedRoutes); @@ -288,6 +301,7 @@ public final class RoutingSessionInfo implements Parcelable { RoutingSessionInfo other = (RoutingSessionInfo) obj; return Objects.equals(mId, other.mId) && Objects.equals(mName, other.mName) + && Objects.equals(mOwnerPackageName, other.mOwnerPackageName) && Objects.equals(mClientPackageName, other.mClientPackageName) && Objects.equals(mProviderId, other.mProviderId) && Objects.equals(mSelectedRoutes, other.mSelectedRoutes) @@ -301,7 +315,7 @@ public final class RoutingSessionInfo implements Parcelable { @Override public int hashCode() { - return Objects.hash(mId, mName, mClientPackageName, mProviderId, + return Objects.hash(mId, mName, mOwnerPackageName, mClientPackageName, mProviderId, mSelectedRoutes, mSelectableRoutes, mDeselectableRoutes, mTransferableRoutes, mVolumeMax, mVolumeHandling, mVolume); } @@ -356,6 +370,7 @@ public final class RoutingSessionInfo implements Parcelable { // TODO: Reorder these (important ones first) final String mId; CharSequence mName; + String mOwnerPackageName; String mClientPackageName; String mProviderId; final List<String> mSelectedRoutes; @@ -440,6 +455,17 @@ public final class RoutingSessionInfo implements Parcelable { } /** + * Sets the package name of the session owner. It is expected to be called by the system. + * + * @hide + */ + @NonNull + public Builder setOwnerPackageName(@Nullable String packageName) { + mOwnerPackageName = packageName; + return this; + } + + /** * Sets the client package name of the session. * * @hide diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 98e68b8b53f2..331477f72aa4 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -1233,7 +1233,7 @@ static void android_media_MediaCodec_native_enableOnFrameRenderedListener( jboolean enabled) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1249,7 +1249,7 @@ static void android_media_MediaCodec_native_setCallback( jobject cb) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1269,7 +1269,7 @@ static void android_media_MediaCodec_native_configure( jint flags) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1317,7 +1317,7 @@ static void android_media_MediaCodec_native_setSurface( jobject jsurface) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1440,7 +1440,7 @@ static void android_media_MediaCodec_setInputSurface( ALOGV("android_media_MediaCodec_setInputSurface"); sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1464,7 +1464,7 @@ static jobject android_media_MediaCodec_createInputSurface(JNIEnv* env, ALOGV("android_media_MediaCodec_createInputSurface"); sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -1487,7 +1487,7 @@ static void android_media_MediaCodec_start(JNIEnv *env, jobject thiz) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1502,7 +1502,7 @@ static void android_media_MediaCodec_stop(JNIEnv *env, jobject thiz) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1517,7 +1517,7 @@ static void android_media_MediaCodec_reset(JNIEnv *env, jobject thiz) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1539,7 +1539,7 @@ static void android_media_MediaCodec_flush(JNIEnv *env, jobject thiz) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1561,7 +1561,7 @@ static void android_media_MediaCodec_queueInputBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -1720,7 +1720,7 @@ static void android_media_MediaCodec_queueSecureInputBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2109,7 +2109,7 @@ static void android_media_MediaCodec_native_queueLinearBlock( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == nullptr) { + if (codec == nullptr || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2178,7 +2178,7 @@ static void android_media_MediaCodec_native_queueHardwareBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2227,7 +2227,7 @@ static void android_media_MediaCodec_native_getOutputFrame( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2244,7 +2244,7 @@ static jint android_media_MediaCodec_dequeueInputBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return -1; } @@ -2265,7 +2265,7 @@ static jint android_media_MediaCodec_dequeueOutputBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return 0; } @@ -2288,7 +2288,7 @@ static void android_media_MediaCodec_releaseOutputBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2303,7 +2303,7 @@ static void android_media_MediaCodec_signalEndOfInputStream(JNIEnv* env, ALOGV("android_media_MediaCodec_signalEndOfInputStream"); sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2319,7 +2319,7 @@ static jobject android_media_MediaCodec_getFormatNative( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2342,7 +2342,7 @@ static jobject android_media_MediaCodec_getOutputFormatForIndexNative( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2365,7 +2365,7 @@ static jobjectArray android_media_MediaCodec_getBuffers( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2391,7 +2391,7 @@ static jobject android_media_MediaCodec_getBuffer( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2417,7 +2417,7 @@ static jobject android_media_MediaCodec_getImage( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2443,7 +2443,7 @@ static jobject android_media_MediaCodec_getName( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2466,7 +2466,7 @@ static jobject android_media_MediaCodec_getOwnCodecInfo( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } @@ -2489,7 +2489,7 @@ android_media_MediaCodec_native_getMetrics(JNIEnv *env, jobject thiz) ALOGV("android_media_MediaCodec_native_getMetrics"); sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL ) { + if (codec == NULL || codec->initCheck() != OK) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return 0; } @@ -2518,7 +2518,7 @@ static void android_media_MediaCodec_setParameters( sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2537,7 +2537,7 @@ static void android_media_MediaCodec_setVideoScalingMode( JNIEnv *env, jobject thiz, jint mode) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } @@ -2555,7 +2555,7 @@ static void android_media_MediaCodec_setAudioPresentation( JNIEnv *env, jobject thiz, jint presentationId, jint programId) { sp<JMediaCodec> codec = getMediaCodec(env, thiz); - if (codec == NULL) { + if (codec == NULL || codec->initCheck() != OK) { throwExceptionAsNecessary(env, INVALID_OPERATION); return; } diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java index 6a1e9656cf2c..eee797af40d7 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java @@ -26,6 +26,7 @@ import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE_SPECIAL; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID1; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID2; +import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID4_TO_SELECT_AND_DESELECT; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID5_TO_TRANSFER_TO; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_FIXED_VOLUME; import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_SPECIAL_FEATURE; @@ -68,6 +69,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.Predicate; +import java.util.stream.Collectors; @RunWith(AndroidJUnit4.class) @SmallTest @@ -566,6 +568,41 @@ public class MediaRouter2ManagerTest { assertFalse(failureLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); } + /** + * Tests if getSelectableRoutes and getDeselectableRoutes filter routes based on + * selected routes + */ + @Test + public void testGetSelectableRoutes_notReturnsSelectedRoutes() throws Exception { + Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); + addRouterCallback(new RouteCallback() {}); + + CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); + + addManagerCallback(new MediaRouter2Manager.Callback() { + @Override + public void onTransferred(RoutingSessionInfo oldSessionInfo, + RoutingSessionInfo newSessionInfo) { + assertNotNull(newSessionInfo); + List<String> selectedRoutes = mManager.getSelectedRoutes(newSessionInfo).stream() + .map(MediaRoute2Info::getId) + .collect(Collectors.toList()); + for (MediaRoute2Info selectableRoute : + mManager.getSelectableRoutes(newSessionInfo)) { + assertFalse(selectedRoutes.contains(selectableRoute.getId())); + } + for (MediaRoute2Info deselectableRoute : + mManager.getDeselectableRoutes(newSessionInfo)) { + assertTrue(selectedRoutes.contains(deselectableRoute.getId())); + } + onSessionCreatedLatch.countDown(); + } + }); + + mManager.selectRoute(mPackageName, routes.get(ROUTE_ID4_TO_SELECT_AND_DESELECT)); + assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + } + Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures) throws Exception { CountDownLatch addedLatch = new CountDownLatch(1); diff --git a/native/android/Android.bp b/native/android/Android.bp index ed73f39e57f8..797d3fd8c2ff 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -37,6 +37,7 @@ cc_library_shared { srcs: [ "asset_manager.cpp", + "choreographer.cpp", "configuration.cpp", "hardware_buffer_jni.cpp", "input.cpp", @@ -49,6 +50,7 @@ cc_library_shared { "sharedmem.cpp", "storage_manager.cpp", "surface_control.cpp", + "surface_texture.cpp", "system_fonts.cpp", "trace.cpp", "thermal.cpp" @@ -76,6 +78,7 @@ cc_library_shared { "libpowermanager", "android.hardware.configstore@1.0", "android.hardware.configstore-utils", + "libnativedisplay", ], static_libs: [ @@ -83,9 +86,9 @@ cc_library_shared { "libarect", ], - header_libs: [ "libhwui_internal_headers" ], + header_libs: [ "libhwui_internal_headers",], - whole_static_libs: ["libnativedisplay", "libnativewindow"], + whole_static_libs: ["libnativewindow"], export_static_lib_headers: ["libarect"], diff --git a/native/android/choreographer.cpp b/native/android/choreographer.cpp new file mode 100644 index 000000000000..38641de0efb3 --- /dev/null +++ b/native/android/choreographer.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <private/android/choreographer.h> + +using namespace android; + +AChoreographer* AChoreographer_getInstance() { + return AChoreographer_routeGetInstance(); +} +void AChoreographer_postFrameCallback(AChoreographer* choreographer, + AChoreographer_frameCallback callback, void* data) { + return AChoreographer_routePostFrameCallback(choreographer, callback, data); +} +void AChoreographer_postFrameCallbackDelayed(AChoreographer* choreographer, + AChoreographer_frameCallback callback, void* data, + long delayMillis) { + return AChoreographer_routePostFrameCallbackDelayed(choreographer, callback, data, delayMillis); +} +void AChoreographer_postFrameCallback64(AChoreographer* choreographer, + AChoreographer_frameCallback64 callback, void* data) { + return AChoreographer_routePostFrameCallback64(choreographer, callback, data); +} +void AChoreographer_postFrameCallbackDelayed64(AChoreographer* choreographer, + AChoreographer_frameCallback64 callback, void* data, + uint32_t delayMillis) { + return AChoreographer_routePostFrameCallbackDelayed64(choreographer, callback, data, + delayMillis); +} +void AChoreographer_registerRefreshRateCallback(AChoreographer* choreographer, + AChoreographer_refreshRateCallback callback, + void* data) { + return AChoreographer_routeRegisterRefreshRateCallback(choreographer, callback, data); +} +void AChoreographer_unregisterRefreshRateCallback(AChoreographer* choreographer, + AChoreographer_refreshRateCallback callback, + void* data) { + return AChoreographer_routeUnregisterRefreshRateCallback(choreographer, callback, data); +} diff --git a/native/android/surface_texture.cpp b/native/android/surface_texture.cpp new file mode 100644 index 000000000000..ff35204b2ec9 --- /dev/null +++ b/native/android/surface_texture.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <android/surface_texture_jni.h> +#include <surfacetexture/surface_texture_platform.h> + +using namespace android; + +ANativeWindow* ASurfaceTexture_acquireANativeWindow(ASurfaceTexture* st) { + return ASurfaceTexture_routeAcquireANativeWindow(st); +} + +int ASurfaceTexture_attachToGLContext(ASurfaceTexture* st, uint32_t texName) { + return ASurfaceTexture_routeAttachToGLContext(st, texName); +} + +int ASurfaceTexture_detachFromGLContext(ASurfaceTexture* st) { + return ASurfaceTexture_routeDetachFromGLContext(st); +} + +void ASurfaceTexture_release(ASurfaceTexture* st) { + return ASurfaceTexture_routeRelease(st); +} + +int ASurfaceTexture_updateTexImage(ASurfaceTexture* st) { + return ASurfaceTexture_routeUpdateTexImage(st); +} + +void ASurfaceTexture_getTransformMatrix(ASurfaceTexture* st, float mtx[16]) { + return ASurfaceTexture_routeGetTransformMatrix(st, mtx); +} + +int64_t ASurfaceTexture_getTimestamp(ASurfaceTexture* st) { + return ASurfaceTexture_routeGetTimestamp(st); +} + +ASurfaceTexture* ASurfaceTexture_fromSurfaceTexture(JNIEnv* env, jobject surfacetexture) { + return ASurfaceTexture_routeFromSurfaceTexture(env, surfacetexture); +} diff --git a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml index 3389a7a8c6af..60e0d7e430df 100644 --- a/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml +++ b/packages/CarSystemUI/res/layout/car_top_navigation_bar.xml @@ -76,7 +76,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@null" - systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivity;launchFlags=0x24000000;end" + systemui:intent="intent:#Intent;component=com.android.car.settings/.common.CarSettingActivities$QuickSettingActivity;launchFlags=0x24000000;end" /> <com.android.systemui.statusbar.policy.Clock android:id="@+id/clock" diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java index ab7bf5e2eac0..f8729c301c32 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java @@ -20,8 +20,11 @@ import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME; import android.content.Context; +import android.os.Handler; +import android.os.PowerManager; import com.android.keyguard.KeyguardViewController; +import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarDeviceProvisionedControllerImpl; import com.android.systemui.car.keyguard.CarKeyguardViewController; @@ -30,6 +33,8 @@ import com.android.systemui.car.statusbar.CarStatusBarKeyguardViewManager; import com.android.systemui.car.statusbar.DummyNotificationShadeWindowController; import com.android.systemui.car.volume.CarVolumeDialogComponent; import com.android.systemui.dagger.SystemUIRootComponent; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.plugins.qs.QSFactory; @@ -113,10 +118,17 @@ public abstract class CarSystemUIModule { abstract NotificationLockscreenUserManager bindNotificationLockscreenUserManager( NotificationLockscreenUserManagerImpl notificationLockscreenUserManager); - @Binds + @Provides @Singleton - public abstract BatteryController provideBatteryController( - BatteryControllerImpl controllerImpl); + static BatteryController provideBatteryController(Context context, + EnhancedEstimates enhancedEstimates, PowerManager powerManager, + BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, + @Background Handler bgHandler) { + BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager, + broadcastDispatcher, mainHandler, bgHandler); + bC.init(); + return bC; + } @Binds @Singleton diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index baa6ac945a8a..aee7643b69f7 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -171,6 +171,7 @@ public class CarKeyguardViewController extends OverlayViewController implements mKeyguardStateController.notifyKeyguardState(mShowing, /* occluded= */ false); mCarNavigationBarController.showAllKeyguardButtons(/* isSetUp= */ true); start(); + getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ true); reset(/* hideBouncerWhenShowing= */ false); notifyKeyguardUpdateMonitor(); } @@ -185,6 +186,7 @@ public class CarKeyguardViewController extends OverlayViewController implements mBouncer.hide(/* destroyView= */ true); mCarNavigationBarController.hideAllKeyguardButtons(/* isSetUp= */ true); stop(); + getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ false); mKeyguardStateController.notifyKeyguardDoneFading(); mViewMediatorCallback.keyguardGone(); notifyKeyguardUpdateMonitor(); @@ -213,7 +215,7 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void onCancelClicked() { - if (!mShowing) return; + if (mBouncer == null) return; getOverlayViewGlobalStateController().setWindowFocusable(/* focusable= */ false); getOverlayViewGlobalStateController().setWindowNeedsInput(/* needsInput= */ false); @@ -229,19 +231,20 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void dismissAndCollapse() { - hide(/* startTime= */ 0, /* fadeoutDuration= */ 0); + if (!mBouncer.isSecure()) { + hide(/* startTime= */ 0, /* fadeoutDuration= */ 0); + } } @Override public void startPreHideAnimation(Runnable finishRunnable) { - if (!mShowing) return; + if (mBouncer == null) return; mBouncer.startPreHideAnimation(finishRunnable); } @Override public void setNeedsInput(boolean needsInput) { - getOverlayViewGlobalStateController().setWindowFocusable(needsInput); getOverlayViewGlobalStateController().setWindowNeedsInput(needsInput); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java index 9e194fb49d3a..288e5cf13c2e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java @@ -73,7 +73,7 @@ public class CarNavigationBarController { } /** - * Hides all navigation bars. + * Hides all system bars. */ public void hideBars() { if (mTopView != null) { @@ -85,7 +85,7 @@ public class CarNavigationBarController { } /** - * Shows all navigation bars. + * Shows all system bars. */ public void showBars() { if (mTopView != null) { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java index 20fcca0d0220..aeb1d39599db 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java @@ -29,41 +29,40 @@ import android.widget.FrameLayout; import com.android.car.notification.R; import com.android.car.notification.headsup.CarHeadsUpNotificationContainer; import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.car.window.OverlayViewGlobalStateController; import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; import javax.inject.Singleton; -import dagger.Lazy; - /** * A controller for SysUI's HUN display. */ @Singleton public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotificationContainer { private final CarDeviceProvisionedController mCarDeviceProvisionedController; - private final Lazy<NotificationPanelViewController> mNotificationPanelViewControllerLazy; + private final OverlayViewGlobalStateController mOverlayViewGlobalStateController; private final ViewGroup mWindow; private final FrameLayout mHeadsUpContentFrame; - private final boolean mEnableHeadsUpNotificationWhenNotificationShadeOpen; - @Inject CarHeadsUpNotificationSystemContainer(Context context, @Main Resources resources, CarDeviceProvisionedController deviceProvisionedController, WindowManager windowManager, - Lazy<NotificationPanelViewController> notificationPanelViewControllerLazy) { + OverlayViewGlobalStateController overlayViewGlobalStateController) { mCarDeviceProvisionedController = deviceProvisionedController; - mNotificationPanelViewControllerLazy = notificationPanelViewControllerLazy; + mOverlayViewGlobalStateController = overlayViewGlobalStateController; boolean showOnBottom = resources.getBoolean(R.bool.config_showHeadsUpNotificationOnBottom); + // Use TYPE_STATUS_BAR_SUB_PANEL window type since we need to find a window that is above + // status bar but below navigation bar. WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, + WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); @@ -78,15 +77,11 @@ public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotifica windowManager.addView(mWindow, lp); mWindow.setVisibility(View.INVISIBLE); mHeadsUpContentFrame = mWindow.findViewById(R.id.headsup_content); - - mEnableHeadsUpNotificationWhenNotificationShadeOpen = resources.getBoolean( - R.bool.config_enableHeadsUpNotificationWhenNotificationShadeOpen); } private void animateShow() { - if ((mEnableHeadsUpNotificationWhenNotificationShadeOpen - || !mNotificationPanelViewControllerLazy.get().isPanelExpanded()) - && mCarDeviceProvisionedController.isCurrentUserFullySetup()) { + if (mCarDeviceProvisionedController.isCurrentUserFullySetup() + && mOverlayViewGlobalStateController.shouldShowHUN()) { mWindow.setVisibility(View.VISIBLE); } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index cb9539ad5b1d..1738091d14c9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -73,6 +73,7 @@ public class NotificationPanelViewController extends OverlayPanelViewController private final CarNotificationListener mCarNotificationListener; private final NotificationClickHandlerFactory mNotificationClickHandlerFactory; private final StatusBarStateController mStatusBarStateController; + private final boolean mEnableHeadsUpNotificationWhenNotificationShadeOpen; private float mInitialBackgroundAlpha; private float mBackgroundAlphaDiff; @@ -144,6 +145,10 @@ public class NotificationPanelViewController extends OverlayPanelViewController + " percentage"); } mBackgroundAlphaDiff = finalBackgroundAlpha - mInitialBackgroundAlpha; + + mEnableHeadsUpNotificationWhenNotificationShadeOpen = mResources.getBoolean( + com.android.car.notification.R.bool + .config_enableHeadsUpNotificationWhenNotificationShadeOpen); } @Override @@ -151,6 +156,16 @@ public class NotificationPanelViewController extends OverlayPanelViewController reinflate(); } + @Override + protected boolean shouldShowNavigationBar() { + return true; + } + + @Override + protected boolean shouldShowHUN() { + return mEnableHeadsUpNotificationWhenNotificationShadeOpen; + } + /** Reinflates the view. */ public void reinflate() { ViewGroup container = (ViewGroup) getLayout(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java index 8f52638afdf1..41349b284147 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java @@ -26,8 +26,15 @@ import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayViewMediator; import com.android.systemui.statusbar.policy.ConfigurationController; -/** The view mediator which attaches the view controller to other elements of the system ui. */ -public abstract class NotificationPanelViewMediator implements OverlayViewMediator, +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * The view mediator which attaches the view controller to other elements of the system ui. Disables + * drag open behavior of the notification panel from any navigation bar. + */ +@Singleton +public class NotificationPanelViewMediator implements OverlayViewMediator, ConfigurationController.ConfigurationListener { private final CarNavigationBarController mCarNavigationBarController; @@ -36,6 +43,7 @@ public abstract class NotificationPanelViewMediator implements OverlayViewMediat private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final ConfigurationController mConfigurationController; + @Inject public NotificationPanelViewMediator( CarNavigationBarController carNavigationBarController, NotificationPanelViewController notificationPanelViewController, diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java index 0fe985684543..45808a8a0b3e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java @@ -375,10 +375,10 @@ public abstract class OverlayPanelViewController extends OverlayViewController { } if (visible && !getOverlayViewGlobalStateController().isWindowVisible()) { - getOverlayViewGlobalStateController().setWindowVisible(true); + getOverlayViewGlobalStateController().showView(/* panelViewController= */ this); } if (!visible && getOverlayViewGlobalStateController().isWindowVisible()) { - getOverlayViewGlobalStateController().setWindowVisible(false); + getOverlayViewGlobalStateController().hideView(/* panelViewController= */ this); } getLayout().setVisibility(visible ? View.VISIBLE : View.INVISIBLE); getOverlayViewGlobalStateController().setWindowFocusable(visible); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java index 87f20208476b..30e26578bd73 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java @@ -54,7 +54,6 @@ public class OverlayViewController { mOverlayViewGlobalStateController.hideView(/* viewController= */ this, this::hide); } - /** * Inflate layout owned by controller. */ @@ -72,7 +71,7 @@ public class OverlayViewController { } /** - * Returns [@code true} if layout owned by controller has been inflated. + * Returns {@code true} if layout owned by controller has been inflated. */ public final boolean isInflated() { return mLayout != null; @@ -125,4 +124,18 @@ public class OverlayViewController { protected final OverlayViewGlobalStateController getOverlayViewGlobalStateController() { return mOverlayViewGlobalStateController; } + + /** + * Returns {@code true} if heads up notifications should be displayed over this view. + */ + protected boolean shouldShowHUN() { + return true; + } + + /** + * Returns {@code true} if navigation bar should be displayed over this view. + */ + protected boolean shouldShowNavigationBar() { + return false; + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java index 290505f5042a..70260b0d4cef 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java @@ -16,14 +16,17 @@ package com.android.systemui.car.window; +import android.annotation.Nullable; import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.systemui.car.navigationbar.CarNavigationBarController; -import java.util.HashSet; -import java.util.Set; +import java.util.HashMap; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; import javax.inject.Inject; import javax.inject.Singleton; @@ -39,11 +42,17 @@ import javax.inject.Singleton; */ @Singleton public class OverlayViewGlobalStateController { + private static final boolean DEBUG = false; private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName(); + private static final int UNKNOWN_Z_ORDER = -1; private final SystemUIOverlayWindowController mSystemUIOverlayWindowController; private final CarNavigationBarController mCarNavigationBarController; @VisibleForTesting - Set<String> mShownSet; + Map<OverlayViewController, Integer> mZOrderMap; + @VisibleForTesting + SortedMap<Integer, OverlayViewController> mZOrderVisibleSortedMap; + @VisibleForTesting + OverlayViewController mHighestZOrder; @Inject public OverlayViewGlobalStateController( @@ -52,7 +61,8 @@ public class OverlayViewGlobalStateController { mSystemUIOverlayWindowController = systemUIOverlayWindowController; mSystemUIOverlayWindowController.attach(); mCarNavigationBarController = carNavigationBarController; - mShownSet = new HashSet<>(); + mZOrderMap = new HashMap<>(); + mZOrderVisibleSortedMap = new TreeMap<>(); } /** @@ -66,51 +76,127 @@ public class OverlayViewGlobalStateController { } /** - * Show content in Overlay Window. + * Show content in Overlay Window using {@link OverlayPanelViewController}. + * + * This calls {@link OverlayViewGlobalStateController#showView(OverlayViewController, Runnable)} + * where the runnable is nullified since the actual showing of the panel is handled by the + * controller itself. */ - public void showView(OverlayViewController viewController, Runnable show) { - if (mShownSet.isEmpty()) { - mCarNavigationBarController.hideBars(); + public void showView(OverlayPanelViewController panelViewController) { + showView(panelViewController, /* show= */ null); + } + + /** + * Show content in Overlay Window using {@link OverlayViewController}. + */ + public void showView(OverlayViewController viewController, @Nullable Runnable show) { + debugLog(); + if (mZOrderVisibleSortedMap.isEmpty()) { setWindowVisible(true); } + if (!(viewController instanceof OverlayPanelViewController)) { + inflateView(viewController); + } - inflateView(viewController); + if (show != null) { + show.run(); + } - show.run(); - mShownSet.add(viewController.getClass().getName()); + updateInternalsWhenShowingView(viewController); + refreshNavigationBarVisibility(); Log.d(TAG, "Content shown: " + viewController.getClass().getName()); + debugLog(); + } + + private void updateInternalsWhenShowingView(OverlayViewController viewController) { + int zOrder; + if (mZOrderMap.containsKey(viewController)) { + zOrder = mZOrderMap.get(viewController); + } else { + zOrder = mSystemUIOverlayWindowController.getBaseLayout().indexOfChild( + viewController.getLayout()); + mZOrderMap.put(viewController, zOrder); + } + + mZOrderVisibleSortedMap.put(zOrder, viewController); + + refreshHighestZOrderWhenShowingView(viewController); + } + + private void refreshHighestZOrderWhenShowingView(OverlayViewController viewController) { + if (mZOrderMap.getOrDefault(mHighestZOrder, UNKNOWN_Z_ORDER) < mZOrderMap.get( + viewController)) { + mHighestZOrder = viewController; + } + } + + /** + * Hide content in Overlay Window using {@link OverlayPanelViewController}. + * + * This calls {@link OverlayViewGlobalStateController#hideView(OverlayViewController, Runnable)} + * where the runnable is nullified since the actual hiding of the panel is handled by the + * controller itself. + */ + public void hideView(OverlayPanelViewController panelViewController) { + hideView(panelViewController, /* hide= */ null); } /** - * Hide content in Overlay Window. + * Hide content in Overlay Window using {@link OverlayViewController}. */ - public void hideView(OverlayViewController viewController, Runnable hide) { + public void hideView(OverlayViewController viewController, @Nullable Runnable hide) { + debugLog(); if (!viewController.isInflated()) { Log.d(TAG, "Content cannot be hidden since it isn't inflated: " + viewController.getClass().getName()); return; } - if (!mShownSet.contains(viewController.getClass().getName())) { - Log.d(TAG, "Content cannot be hidden since it isn't shown: " + if (!mZOrderMap.containsKey(viewController)) { + Log.d(TAG, "Content cannot be hidden since it has never been shown: " + + viewController.getClass().getName()); + return; + } + if (!mZOrderVisibleSortedMap.containsKey(mZOrderMap.get(viewController))) { + Log.d(TAG, "Content cannot be hidden since it isn't currently shown: " + viewController.getClass().getName()); return; } - hide.run(); - mShownSet.remove(viewController.getClass().getName()); + if (hide != null) { + hide.run(); + } - if (mShownSet.isEmpty()) { - mCarNavigationBarController.showBars(); + mZOrderVisibleSortedMap.remove(mZOrderMap.get(viewController)); + refreshHighestZOrderWhenHidingView(viewController); + refreshNavigationBarVisibility(); + + if (mZOrderVisibleSortedMap.isEmpty()) { setWindowVisible(false); } Log.d(TAG, "Content hidden: " + viewController.getClass().getName()); + debugLog(); + } + + private void refreshHighestZOrderWhenHidingView(OverlayViewController viewController) { + if (mZOrderVisibleSortedMap.isEmpty()) { + mHighestZOrder = null; + return; + } + if (!mHighestZOrder.equals(viewController)) { + return; + } + + mHighestZOrder = mZOrderVisibleSortedMap.get(mZOrderVisibleSortedMap.lastKey()); } - /** Sets the window visibility state. */ - public void setWindowVisible(boolean expanded) { - mSystemUIOverlayWindowController.setWindowVisible(expanded); + private void refreshNavigationBarVisibility() { + if (mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowNavigationBar()) { + mCarNavigationBarController.showBars(); + } else { + mCarNavigationBarController.hideBars(); + } } /** Returns {@code true} is the window is visible. */ @@ -118,13 +204,14 @@ public class OverlayViewGlobalStateController { return mSystemUIOverlayWindowController.isWindowVisible(); } - /** Sets the focusable flag of the sysui overlawy window. */ - public void setWindowFocusable(boolean focusable) { - mSystemUIOverlayWindowController.setWindowFocusable(focusable); + private void setWindowVisible(boolean visible) { + mSystemUIOverlayWindowController.setWindowVisible(visible); } - /** Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the - * sysui overlay window */ + /** + * Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the + * sysui overlay window. + */ public void setWindowNeedsInput(boolean needsInput) { mSystemUIOverlayWindowController.setWindowNeedsInput(needsInput); } @@ -134,10 +221,34 @@ public class OverlayViewGlobalStateController { return mSystemUIOverlayWindowController.isWindowFocusable(); } + /** Sets the focusable flag of the sysui overlawy window. */ + public void setWindowFocusable(boolean focusable) { + mSystemUIOverlayWindowController.setWindowFocusable(focusable); + } + /** Inflates the view controlled by the given view controller. */ public void inflateView(OverlayViewController viewController) { if (!viewController.isInflated()) { viewController.inflate(mSystemUIOverlayWindowController.getBaseLayout()); } } + + /** + * Return {@code true} if OverlayWindow is in a state where HUNs should be displayed above it. + */ + public boolean shouldShowHUN() { + return mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowHUN(); + } + + private void debugLog() { + if (!DEBUG) { + return; + } + + Log.d(TAG, "mHighestZOrder: " + mHighestZOrder); + Log.d(TAG, "mZOrderVisibleSortedMap.size(): " + mZOrderVisibleSortedMap.size()); + Log.d(TAG, "mZOrderVisibleSortedMap: " + mZOrderVisibleSortedMap); + Log.d(TAG, "mZOrderMap.size(): " + mZOrderMap.size()); + Log.d(TAG, "mZOrderMap: " + mZOrderMap); + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java index e1918ceeaea4..484aa63e8bda 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayWindowModule.java @@ -18,6 +18,7 @@ package com.android.systemui.car.window; import com.android.systemui.car.keyguard.CarKeyguardViewMediator; import com.android.systemui.car.notification.BottomNotificationPanelViewMediator; +import com.android.systemui.car.notification.NotificationPanelViewMediator; import com.android.systemui.car.notification.TopNotificationPanelViewMediator; import com.android.systemui.car.userswitcher.FullscreenUserSwitcherViewMediator; @@ -32,6 +33,13 @@ import dagger.multibindings.IntoMap; @Module public abstract class OverlayWindowModule { + /** Injects NotificationPanelViewMediator. */ + @Binds + @IntoMap + @ClassKey(NotificationPanelViewMediator.class) + public abstract OverlayViewMediator bindNotificationPanelViewMediator( + NotificationPanelViewMediator notificationPanelViewMediator); + /** Injects TopNotificationPanelViewMediator. */ @Binds @IntoMap diff --git a/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml b/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml new file mode 100644 index 000000000000..03fe0e4fcf2e --- /dev/null +++ b/packages/CarSystemUI/tests/res/layout/overlay_view_global_state_controller_test.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<!-- Fullscreen views in sysui should be listed here in increasing Z order. --> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:background="@android:color/transparent" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ViewStub android:id="@+id/overlay_view_controller_stub_1" + android:inflatedId="@+id/overlay_view_controller_1" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/overlay_view_controller_stub"/> + + <ViewStub android:id="@+id/overlay_view_controller_stub_2" + android:inflatedId="@+id/overlay_view_controller_2" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/overlay_view_controller_stub"/> + + <ViewStub android:id="@+id/overlay_view_controller_stub_3" + android:inflatedId="@+id/overlay_view_controller_3" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/overlay_view_controller_stub"/> + +</FrameLayout>
\ No newline at end of file diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java index a2192af14758..1b4621f1c279 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/keyguard/CarKeyguardViewControllerTest.java @@ -16,9 +16,10 @@ package com.android.systemui.car.keyguard; -import static com.google.common.truth.Truth.assertThat; - +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -29,7 +30,6 @@ import android.os.Handler; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import com.android.internal.widget.LockPatternUtils; @@ -40,7 +40,6 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayViewGlobalStateController; -import com.android.systemui.car.window.SystemUIOverlayWindowController; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; @@ -51,6 +50,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -61,28 +61,20 @@ import dagger.Lazy; public class CarKeyguardViewControllerTest extends SysuiTestCase { private TestableCarKeyguardViewController mCarKeyguardViewController; - private OverlayViewGlobalStateController mOverlayViewGlobalStateController; - private ViewGroup mBaseLayout; @Mock + private OverlayViewGlobalStateController mOverlayViewGlobalStateController; + @Mock private KeyguardBouncer mBouncer; @Mock private CarNavigationBarController mCarNavigationBarController; @Mock - private SystemUIOverlayWindowController mSystemUIOverlayWindowController; - @Mock private CarKeyguardViewController.OnKeyguardCancelClickedListener mCancelClickedListener; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mOverlayViewGlobalStateController = new OverlayViewGlobalStateController( - mCarNavigationBarController, mSystemUIOverlayWindowController); - mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate( - R.layout.sysui_overlay_window, /* root= */ null); - when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); - mCarKeyguardViewController = new TestableCarKeyguardViewController( mContext, Handler.getMain(), @@ -98,6 +90,8 @@ public class CarKeyguardViewControllerTest extends SysuiTestCase { mock(FalsingManager.class), () -> mock(KeyguardBypassController.class) ); + mCarKeyguardViewController.inflate((ViewGroup) LayoutInflater.from(mContext).inflate( + R.layout.sysui_overlay_window, /* root= */ null)); } @Test @@ -113,8 +107,7 @@ public class CarKeyguardViewControllerTest extends SysuiTestCase { when(mBouncer.isSecure()).thenReturn(true); mCarKeyguardViewController.show(/* options= */ null); - assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo( - View.VISIBLE); + verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController), any()); } @Test @@ -130,8 +123,17 @@ public class CarKeyguardViewControllerTest extends SysuiTestCase { when(mBouncer.isSecure()).thenReturn(false); mCarKeyguardViewController.show(/* options= */ null); - assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo( - View.GONE); + // Here we check for both showView and hideView since the current implementation of show + // with bouncer being not secure has the following method execution orders: + // 1) show -> start -> showView + // 2) show -> reset -> dismissAndCollapse -> hide -> stop -> hideView + // Hence, we want to make sure that showView is called before hideView and not in any + // other combination. + InOrder inOrder = inOrder(mOverlayViewGlobalStateController); + inOrder.verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController), + any()); + inOrder.verify(mOverlayViewGlobalStateController).hideView(eq(mCarKeyguardViewController), + any()); } @Test @@ -156,8 +158,11 @@ public class CarKeyguardViewControllerTest extends SysuiTestCase { mCarKeyguardViewController.show(/* options= */ null); mCarKeyguardViewController.hide(/* startTime= */ 0, /* fadeoutDelay= */ 0); - assertThat(mBaseLayout.findViewById(R.id.keyguard_container).getVisibility()).isEqualTo( - View.GONE); + InOrder inOrder = inOrder(mOverlayViewGlobalStateController); + inOrder.verify(mOverlayViewGlobalStateController).showView(eq(mCarKeyguardViewController), + any()); + inOrder.verify(mOverlayViewGlobalStateController).hideView(eq(mCarKeyguardViewController), + any()); } @Test diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java index 6ac72a681bfe..ccaeb458fe54 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainerTest.java @@ -28,9 +28,9 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; -import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.car.window.OverlayViewGlobalStateController; import org.junit.Before; import org.junit.Test; @@ -42,12 +42,11 @@ import org.mockito.MockitoAnnotations; @TestableLooper.RunWithLooper @SmallTest public class CarHeadsUpNotificationSystemContainerTest extends SysuiTestCase { - private CarHeadsUpNotificationSystemContainer mDefaultController; - private CarHeadsUpNotificationSystemContainer mOverrideEnabledController; + private CarHeadsUpNotificationSystemContainer mCarHeadsUpNotificationSystemContainer; @Mock private CarDeviceProvisionedController mCarDeviceProvisionedController; @Mock - private NotificationPanelViewController mNotificationPanelViewController; + private OverlayViewGlobalStateController mOverlayViewGlobalStateController; @Mock private WindowManager mWindowManager; @@ -58,76 +57,63 @@ public class CarHeadsUpNotificationSystemContainerTest extends SysuiTestCase { @Before public void setUp() { - MockitoAnnotations.initMocks(this); + MockitoAnnotations.initMocks(/* testClass= */this); - when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(false); - when(mCarDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true); - when(mCarDeviceProvisionedController.isCurrentUserSetupInProgress()).thenReturn(false); + when(mOverlayViewGlobalStateController.shouldShowHUN()).thenReturn(true); + when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(true); TestableResources testableResources = mContext.getOrCreateTestableResources(); - testableResources.addOverride( - R.bool.config_enableHeadsUpNotificationWhenNotificationShadeOpen, false); - - mDefaultController = new CarHeadsUpNotificationSystemContainer(mContext, - testableResources.getResources(), mCarDeviceProvisionedController, mWindowManager, - () -> mNotificationPanelViewController); - - testableResources.addOverride( - R.bool.config_enableHeadsUpNotificationWhenNotificationShadeOpen, true); - - mOverrideEnabledController = new CarHeadsUpNotificationSystemContainer(mContext, + mCarHeadsUpNotificationSystemContainer = new CarHeadsUpNotificationSystemContainer(mContext, testableResources.getResources(), mCarDeviceProvisionedController, mWindowManager, - () -> mNotificationPanelViewController); + mOverlayViewGlobalStateController); } @Test public void testDisplayNotification_firstNotification_isVisible() { - mDefaultController.displayNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isTrue(); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue(); } @Test public void testRemoveNotification_lastNotification_isInvisible() { - mDefaultController.displayNotification(mNotificationView); - mDefaultController.removeNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isFalse(); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + mCarHeadsUpNotificationSystemContainer.removeNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse(); } @Test public void testRemoveNotification_nonLastNotification_isVisible() { - mDefaultController.displayNotification(mNotificationView); - mDefaultController.displayNotification(mNotificationView2); - mDefaultController.removeNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isTrue(); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView2); + mCarHeadsUpNotificationSystemContainer.removeNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue(); } @Test - public void testDisplayNotification_userSetupInProgress_isInvisible() { - when(mCarDeviceProvisionedController.isCurrentUserSetupInProgress()).thenReturn(true); - mDefaultController.displayNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isFalse(); + public void testDisplayNotification_userFullySetupTrue_isInvisible() { + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue(); } @Test - public void testDisplayNotification_userSetupIncomplete_isInvisible() { - when(mCarDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false); - mDefaultController.displayNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isFalse(); + public void testDisplayNotification_userFullySetupFalse_isInvisible() { + when(mCarDeviceProvisionedController.isCurrentUserFullySetup()).thenReturn(false); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse(); } @Test - public void testDisplayNotification_notificationPanelExpanded_isInvisible() { - when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(true); - mDefaultController.displayNotification(mNotificationView); - assertThat(mDefaultController.isVisible()).isFalse(); + public void testDisplayNotification_overlayWindowStateShouldShowHUNFalse_isInvisible() { + when(mOverlayViewGlobalStateController.shouldShowHUN()).thenReturn(false); + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isFalse(); } @Test - public void testDisplayNotification_notificationPanelExpandedEnabledHUNWhenOpen_isVisible() { - when(mNotificationPanelViewController.isPanelExpanded()).thenReturn(true); - mOverrideEnabledController.displayNotification(mNotificationView); - assertThat(mOverrideEnabledController.isVisible()).isTrue(); + public void testDisplayNotification_overlayWindowStateShouldShowHUNTrue_isVisible() { + mCarHeadsUpNotificationSystemContainer.displayNotification(mNotificationView); + assertThat(mCarHeadsUpNotificationSystemContainer.isVisible()).isTrue(); } } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java index 8d705a8cca1f..45a05ac69bd7 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayPanelViewControllerTest.java @@ -339,7 +339,7 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { mOverlayPanelViewController.setPanelVisible(true); - verify(mOverlayViewGlobalStateController).setWindowVisible(true); + verify(mOverlayViewGlobalStateController).showView(mOverlayPanelViewController); } @Test @@ -349,7 +349,7 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { mOverlayPanelViewController.setPanelVisible(true); - verify(mOverlayViewGlobalStateController, never()).setWindowVisible(true); + verify(mOverlayViewGlobalStateController, never()).showView(mOverlayPanelViewController); } @Test @@ -377,7 +377,7 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { mOverlayPanelViewController.setPanelVisible(false); - verify(mOverlayViewGlobalStateController).setWindowVisible(false); + verify(mOverlayViewGlobalStateController).hideView(mOverlayPanelViewController); } @Test @@ -387,7 +387,7 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { mOverlayPanelViewController.setPanelVisible(false); - verify(mOverlayViewGlobalStateController, never()).setWindowVisible(false); + verify(mOverlayViewGlobalStateController, never()).hideView(mOverlayPanelViewController); } @Test @@ -428,10 +428,6 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { private static class TestOverlayPanelViewController extends OverlayPanelViewController { - private boolean mShouldAnimateCollapsePanel; - private boolean mShouldAnimateExpandPanel; - private boolean mShouldAllowClosingScroll; - boolean mOnAnimateCollapsePanelCalled; boolean mAnimateCollapsePanelCalled; boolean mOnAnimateExpandPanelCalled; @@ -440,6 +436,9 @@ public class OverlayPanelViewControllerTest extends SysuiTestCase { boolean mOnExpandAnimationEndCalled; boolean mOnOpenScrollStartEnd; List<Integer> mOnScrollHeights; + private boolean mShouldAnimateCollapsePanel; + private boolean mShouldAnimateExpandPanel; + private boolean mShouldAllowClosingScroll; TestOverlayPanelViewController( Context context, diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java index 25dd4f502fb7..9e6e616e3ccf 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java @@ -24,25 +24,33 @@ import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; +import android.view.ViewStub; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.car.navigationbar.CarNavigationBarController; +import com.android.systemui.tests.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.Arrays; + @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper @SmallTest public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { - private static final String MOCK_OVERLAY_VIEW_CONTROLLER_NAME = "OverlayViewController"; + private static final int OVERLAY_VIEW_CONTROLLER_1_Z_ORDER = 0; + private static final int OVERLAY_VIEW_CONTROLLER_2_Z_ORDER = 1; + private static final int OVERLAY_PANEL_VIEW_CONTROLLER_Z_ORDER = 2; private OverlayViewGlobalStateController mOverlayViewGlobalStateController; private ViewGroup mBaseLayout; @@ -54,7 +62,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Mock private OverlayViewMediator mOverlayViewMediator; @Mock - private OverlayViewController mOverlayViewController; + private OverlayViewController mOverlayViewController1; + @Mock + private OverlayViewController mOverlayViewController2; + @Mock + private OverlayPanelViewController mOverlayPanelViewController; @Mock private Runnable mRunnable; @@ -62,14 +74,15 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void setUp() { MockitoAnnotations.initMocks(/* testClass= */ this); + mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate( + R.layout.overlay_view_global_state_controller_test, /* root= */ null); + + when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); + mOverlayViewGlobalStateController = new OverlayViewGlobalStateController( mCarNavigationBarController, mSystemUIOverlayWindowController); verify(mSystemUIOverlayWindowController).attach(); - - mBaseLayout = new FrameLayout(mContext); - - when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); } @Test @@ -87,182 +100,445 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { } @Test - public void showView_nothingAlreadyShown_navigationBarsHidden() { - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + public void showView_nothingAlreadyShown_shouldShowNavBarFalse_navigationBarsHidden() { + setupOverlayViewController1(); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(false); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); verify(mCarNavigationBarController).hideBars(); } @Test - public void showView_nothingAlreadyShown_windowIsExpanded() { - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + public void showView_nothingAlreadyShown_shouldShowNavBarTrue_navigationBarsShown() { + setupOverlayViewController1(); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(true); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mCarNavigationBarController).showBars(); + } + + @Test + public void showView_nothingAlreadyShown_windowIsSetVisible() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); verify(mSystemUIOverlayWindowController).setWindowVisible(true); } @Test - public void showView_somethingAlreadyShown_navigationBarsHidden() { - mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME); + public void showView_nothingAlreadyShown_newHighestZOrder() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController1); + } + + @Test + public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( + OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue(); + } + + @Test + public void showView_newHighestZOrder() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); - verify(mCarNavigationBarController, never()).hideBars(); + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController2); } @Test - public void showView_somethingAlreadyShown_windowIsExpanded() { - mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME); + public void showView_newHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + verify(mCarNavigationBarController).hideBars(); + } + + @Test + public void showView_newHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(true); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + verify(mCarNavigationBarController).showBars(); + } + + @Test + public void showView_newHighestZOrder_correctViewsShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.keySet().toArray()) + .isEqualTo(Arrays.asList(OVERLAY_VIEW_CONTROLLER_1_Z_ORDER, + OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); + } + + @Test + public void showView_oldHighestZOrder() { + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController2); + } + + @Test + public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() { + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(true); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mCarNavigationBarController).hideBars(); + } + + @Test + public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() { + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(false); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(true); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mCarNavigationBarController).showBars(); + } + + @Test + public void showView_oldHighestZOrder_correctViewsShown() { + setupOverlayViewController1(); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.keySet().toArray()) + .isEqualTo(Arrays.asList(OVERLAY_VIEW_CONTROLLER_1_Z_ORDER, + OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); + } + + @Test + public void showView_somethingAlreadyShown_windowVisibleNotCalled() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); verify(mSystemUIOverlayWindowController, never()).setWindowVisible(true); } @Test public void showView_viewControllerNotInflated_inflateViewController() { - when(mOverlayViewController.isInflated()).thenReturn(false); + setupOverlayViewController2(); + when(mOverlayViewController2.isInflated()).thenReturn(false); - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); - verify(mOverlayViewController).inflate(mBaseLayout); + verify(mOverlayViewController2).inflate(mBaseLayout); } @Test public void showView_viewControllerInflated_inflateViewControllerNotCalled() { - when(mOverlayViewController.isInflated()).thenReturn(true); + setupOverlayViewController2(); - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); - verify(mOverlayViewController, never()).inflate(mBaseLayout); + verify(mOverlayViewController2, never()).inflate(mBaseLayout); } @Test - public void showView_showRunnableCalled() { - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + public void showView_panelViewController_inflateViewControllerNotCalled() { + setupOverlayPanelViewController(); - verify(mRunnable).run(); + mOverlayViewGlobalStateController.showView(mOverlayPanelViewController, mRunnable); + + verify(mOverlayPanelViewController, never()).inflate(mBaseLayout); + verify(mOverlayPanelViewController, never()).isInflated(); } @Test - public void showView_overlayViewControllerAddedToShownSet() { - mOverlayViewGlobalStateController.showView(mOverlayViewController, mRunnable); + public void showView_showRunnableCalled() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); - assertThat(mOverlayViewGlobalStateController.mShownSet.contains( - mOverlayViewController.getClass().getName())).isTrue(); + verify(mRunnable).run(); } @Test public void hideView_viewControllerNotInflated_hideRunnableNotCalled() { - when(mOverlayViewController.isInflated()).thenReturn(false); + when(mOverlayViewController2.isInflated()).thenReturn(false); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); verify(mRunnable, never()).run(); } @Test public void hideView_nothingShown_hideRunnableNotCalled() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.clear(); + when(mOverlayViewController2.isInflated()).thenReturn(true); + mOverlayViewGlobalStateController.mZOrderMap.clear(); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); verify(mRunnable, never()).run(); } @Test public void hideView_viewControllerNotShown_hideRunnableNotCalled() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + when(mOverlayViewController2.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); verify(mRunnable, never()).run(); } @Test public void hideView_viewControllerShown_hideRunnableCalled() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); verify(mRunnable).run(); } @Test + public void hideView_viewControllerOnlyShown_noHighestZOrder() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isNull(); + } + + @Test public void hideView_viewControllerOnlyShown_nothingShown() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.isEmpty()).isTrue(); + } + + @Test + public void hideView_viewControllerOnlyShown_viewControllerNotShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( + OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isFalse(); + } + + @Test + public void hideView_newHighestZOrder_twoViewsShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController1); + } + + @Test + public void hideView_newHighestZOrder_threeViewsShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + setupOverlayPanelViewController(); + setOverlayViewControllerAsShowing(mOverlayPanelViewController); + + mOverlayViewGlobalStateController.hideView(mOverlayPanelViewController, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController2); + } + + @Test + public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(false); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); + + verify(mCarNavigationBarController).hideBars(); + } + + @Test + public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(true); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + verify(mCarNavigationBarController).showBars(); + } + + @Test + public void hideView_oldHighestZOrder() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); - assertThat(mOverlayViewGlobalStateController.mShownSet.isEmpty()).isTrue(); + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mHighestZOrder).isEqualTo( + mOverlayViewController2); } @Test - public void hideView_viewControllerNotOnlyShown_navigationBarNotShown() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); - mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME); + public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); - verify(mCarNavigationBarController, never()).showBars(); + verify(mCarNavigationBarController).hideBars(); + } + + @Test + public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(true); + + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); + + verify(mCarNavigationBarController).showBars(); } @Test public void hideView_viewControllerNotOnlyShown_windowNotCollapsed() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); - mOverlayViewGlobalStateController.mShownSet.add(MOCK_OVERLAY_VIEW_CONTROLLER_NAME); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable); verify(mSystemUIOverlayWindowController, never()).setWindowVisible(false); } @Test public void hideView_viewControllerOnlyShown_navigationBarShown() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); verify(mCarNavigationBarController).showBars(); } @Test public void hideView_viewControllerOnlyShown_windowCollapsed() { - when(mOverlayViewController.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.mShownSet.add( - mOverlayViewController.getClass().getName()); + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); - mOverlayViewGlobalStateController.hideView(mOverlayViewController, mRunnable); + mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); verify(mSystemUIOverlayWindowController).setWindowVisible(false); } @Test public void inflateView_notInflated_inflates() { - when(mOverlayViewController.isInflated()).thenReturn(false); + when(mOverlayViewController2.isInflated()).thenReturn(false); - mOverlayViewGlobalStateController.inflateView(mOverlayViewController); + mOverlayViewGlobalStateController.inflateView(mOverlayViewController2); - verify(mOverlayViewController).inflate(mBaseLayout); + verify(mOverlayViewController2).inflate(mBaseLayout); } @Test public void inflateView_alreadyInflated_doesNotInflate() { - when(mOverlayViewController.isInflated()).thenReturn(true); + when(mOverlayViewController2.isInflated()).thenReturn(true); - mOverlayViewGlobalStateController.inflateView(mOverlayViewController); + mOverlayViewGlobalStateController.inflateView(mOverlayViewController2); + + verify(mOverlayViewController2, never()).inflate(mBaseLayout); + } + + private void setupOverlayViewController1() { + setupOverlayViewController(mOverlayViewController1, R.id.overlay_view_controller_stub_1, + R.id.overlay_view_controller_1); + } - verify(mOverlayViewController, never()).inflate(mBaseLayout); + private void setupOverlayViewController2() { + setupOverlayViewController(mOverlayViewController2, R.id.overlay_view_controller_stub_2, + R.id.overlay_view_controller_2); + } + + private void setupOverlayPanelViewController() { + setupOverlayViewController(mOverlayPanelViewController, R.id.overlay_view_controller_stub_3, + R.id.overlay_view_controller_3); + } + + private void setupOverlayViewController(OverlayViewController overlayViewController, + int stubId, int inflatedId) { + ViewStub viewStub = mBaseLayout.findViewById(stubId); + View layout; + if (viewStub == null) { + layout = mBaseLayout.findViewById(inflatedId); + } else { + layout = viewStub.inflate(); + } + when(overlayViewController.getLayout()).thenReturn(layout); + when(overlayViewController.isInflated()).thenReturn(true); + } + + private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) { + mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null); + Mockito.reset(mCarNavigationBarController, mSystemUIOverlayWindowController); + when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); } } diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 8c2fab0ae311..44cfef05e32d 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -57,7 +57,7 @@ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Da li želite da deinstalirate ovu aplikaciju za "<b>"sve"</b>" korisnike? Aplikacija i podaci uz nje biće uklonjeni za "<b>"sve"</b>" korisnike ovog uređaja."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"Želite li da deinstalirate ovu aplikaciju za korisnika <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> <string name="uninstall_update_text" msgid="863648314632448705">"Želite li da zamenite ovu aplikaciju fabričkom verzijom? Svi podaci će biti uklonjeni."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Želite li da zamenite ovu aplikaciju fabričkom verzijom? Svi podaci će biti uklonjeni. Ovo utiče na sve korisnike ovog uređaja, uključujući i one sa profilima za Work."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Želite li da zamenite ovu aplikaciju fabričkom verzijom? Svi podaci će biti uklonjeni. Ovo utiče na sve korisnike ovog uređaja, uključujući i one sa poslovnim profilima."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"Zadrži <xliff:g id="SIZE">%1$s</xliff:g> podataka aplikacije."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"Aktivna deinstaliranja"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"Neuspela deinstaliranja"</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 30f6a21efe8b..d5faac23de9d 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -56,8 +56,8 @@ <string name="uninstall_application_text" msgid="3816830743706143980">"तपाईं यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ?"</string> <string name="uninstall_application_text_all_users" msgid="575491774380227119">"तपाईं "<b>"सबै"</b>" प्रयोगकर्ताका लागि यो एपको स्थापना रद्द गर्न चाहनुहुन्छ? यन्त्रका "<b>"सबै"</b>" प्रयोगकर्ताहरूबाट उक्त एप र यसको डेटा हटाइने छ।"</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"तपाईं प्रयोगकर्ता <xliff:g id="USERNAME">%1$s</xliff:g> का लागि यो अनुप्रयोगको स्थापना रद्द गर्न चाहनुहुन्छ?"</string> - <string name="uninstall_update_text" msgid="863648314632448705">"यस अनुप्रयोगलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ।"</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"यस अनुप्रयोगलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ। यसले यस यन्त्रका कार्य प्रोफाइल भएका लगायत सबै प्रयोगकर्ताहरूमा असर पार्छ।"</string> + <string name="uninstall_update_text" msgid="863648314632448705">"यस एपलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ।"</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"यस एपलाई फ्याक्ट्रीको संस्करणले बदल्ने हो? सबै डेटा हटाइने छ। यसले यस यन्त्रका कार्य प्रोफाइल भएका लगायत सबै प्रयोगकर्ताहरूमा असर पार्छ।"</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"<xliff:g id="SIZE">%1$s</xliff:g> अनुप्रयोगको डेटा राख्नुहोस्।"</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"चलिरहेका स्थापना रद्द गर्ने कार्यहरू"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"असफल भएका स्थापना रद्द गर्ने कार्यहरू"</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index 65d14272d2e3..d539f6f67874 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -22,20 +22,20 @@ <string name="cancel" msgid="1018267193425558088">"Cancelar"</string> <string name="installing" msgid="4921993079741206516">"A instalar…"</string> <string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> - <string name="install_done" msgid="5987363587661783896">"Aplicação instalada."</string> - <string name="install_confirm_question" msgid="8176284075816604590">"Pretende instalar esta aplicação?"</string> - <string name="install_confirm_question_update" msgid="7942235418781274635">"Pretende instalar uma atualização para esta aplicação existente? Os seus dados existentes não serão perdidos."</string> - <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Pretende instalar uma atualização para esta aplicação incorporada? Os seus dados existentes não serão perdidos."</string> + <string name="install_done" msgid="5987363587661783896">"App instalada."</string> + <string name="install_confirm_question" msgid="8176284075816604590">"Pretende instalar esta app?"</string> + <string name="install_confirm_question_update" msgid="7942235418781274635">"Pretende instalar uma atualização para esta app existente? Os seus dados existentes não serão perdidos."</string> + <string name="install_confirm_question_update_system" msgid="4713001702777910263">"Pretende instalar uma atualização para esta app incorporada? Os seus dados existentes não serão perdidos."</string> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> - <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicação não foi instalada porque o pacote entra em conflito com um pacote existente."</string> - <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"A aplicação não foi instalada porque não é compatível com o seu tablet."</string> - <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"Esta aplicação não é compatível com a sua TV."</string> - <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"A aplicação não foi instalada porque não é compatível com o seu telemóvel."</string> - <string name="install_failed_invalid_apk" msgid="8581007676422623930">"A aplicação não foi instalada porque o pacote parece ser inválido."</string> - <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"Não foi possível instalar a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> no tablet."</string> - <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"Não foi possível instalar a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> na TV."</string> - <string name="install_failed_msg" product="default" msgid="6484461562647915707">"Não foi possível instalar a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> no telemóvel."</string> + <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string> + <string name="install_failed_incompatible" product="tablet" msgid="6019021440094927928">"A app não foi instalada porque não é compatível com o seu tablet."</string> + <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"Esta app não é compatível com a sua TV."</string> + <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"A app não foi instalada porque não é compatível com o seu telemóvel."</string> + <string name="install_failed_invalid_apk" msgid="8581007676422623930">"A app não foi instalada porque o pacote parece ser inválido."</string> + <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g> no tablet."</string> + <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g> na TV."</string> + <string name="install_failed_msg" product="default" msgid="6484461562647915707">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g> no telemóvel."</string> <string name="launch" msgid="3952550563999890101">"Abrir"</string> <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"O administrador não permite a instalação de aplicações obtidas de fontes desconhecidas."</string> <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Este utilizador não pode instalar aplicações desconhecidas."</string> @@ -43,53 +43,53 @@ <string name="ok" msgid="7871959885003339302">"OK"</string> <string name="manage_applications" msgid="5400164782453975580">"Gerir app"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Sem espaço"</string> - <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>. Liberte algum espaço e tente novamente."</string> + <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Não foi possível instalar a app <xliff:g id="APP_NAME">%1$s</xliff:g>. Liberte algum espaço e tente novamente."</string> <string name="app_not_found_dlg_title" msgid="5107924008597470285">"Aplicação não encontrada"</string> - <string name="app_not_found_dlg_text" msgid="5219983779377811611">"A aplicação não foi encontrada na lista de aplicações instaladas."</string> + <string name="app_not_found_dlg_text" msgid="5219983779377811611">"A app não foi encontrada na lista de aplicações instaladas."</string> <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"Não permitido."</string> <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"O utilizador atual não tem autorização para efetuar esta desinstalação."</string> <string name="generic_error_dlg_title" msgid="5863195085927067752">"Erro"</string> - <string name="generic_error_dlg_text" msgid="5287861443265795232">"Não foi possível desinstalar a aplicação."</string> - <string name="uninstall_application_title" msgid="4045420072401428123">"Desinstalar aplicação"</string> + <string name="generic_error_dlg_text" msgid="5287861443265795232">"Não foi possível desinstalar a app."</string> + <string name="uninstall_application_title" msgid="4045420072401428123">"Desinstalar app"</string> <string name="uninstall_update_title" msgid="824411791011583031">"Desinstalar atualização"</string> - <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> faz parte da seguinte aplicação:"</string> - <string name="uninstall_application_text" msgid="3816830743706143980">"Pretende desinstalar esta aplicação?"</string> - <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Pretende desinstalar esta aplicação para "<b>"todos"</b>" os utilizadores? A aplicação e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string> - <string name="uninstall_application_text_user" msgid="498072714173920526">"Pretende desinstalar esta aplicação para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> - <string name="uninstall_update_text" msgid="863648314632448705">"Pretende substituir esta aplicação pela versão de fábrica? Todos os dados são removidos."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Pretende substituir esta aplicação pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string> - <string name="uninstall_keep_data" msgid="7002379587465487550">"Manter <xliff:g id="SIZE">%1$s</xliff:g> de dados da aplicação."</string> + <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> faz parte da seguinte app:"</string> + <string name="uninstall_application_text" msgid="3816830743706143980">"Pretende desinstalar esta app?"</string> + <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Pretende desinstalar esta app para "<b>"todos"</b>" os utilizadores? A app e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string> + <string name="uninstall_application_text_user" msgid="498072714173920526">"Pretende desinstalar esta app para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> + <string name="uninstall_update_text" msgid="863648314632448705">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string> + <string name="uninstall_keep_data" msgid="7002379587465487550">"Manter <xliff:g id="SIZE">%1$s</xliff:g> de dados da app."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"Desinstalações em execução"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"Desinstalações com falha"</string> <string name="uninstalling" msgid="8709566347688966845">"A desinstalar…"</string> - <string name="uninstalling_app" msgid="8866082646836981397">"A desinstalar a aplicação <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> + <string name="uninstalling_app" msgid="8866082646836981397">"A desinstalar a app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstalação concluída."</string> - <string name="uninstall_done_app" msgid="4588850984473605768">"A aplicação <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> foi desinstalada"</string> + <string name="uninstall_done_app" msgid="4588850984473605768">"A app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> foi desinstalada"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Desinstalação sem êxito."</string> - <string name="uninstall_failed_app" msgid="5506028705017601412">"Falha ao desinstalar a aplicação <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> - <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Não é possível desinstalar a aplicação de administração de dispositivos ativa."</string> - <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Não é possível desinstalar a aplicação de administração de dispositivos ativa para <xliff:g id="USERNAME">%1$s</xliff:g>."</string> - <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"Esta aplicação é necessária para alguns utilizadores ou perfis e foi desinstalada para outros."</string> - <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"O perfil necessita desta aplicação e não é possível desinstalá-la."</string> + <string name="uninstall_failed_app" msgid="5506028705017601412">"Falha ao desinstalar a app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> + <string name="uninstall_failed_device_policy_manager" msgid="785293813665540305">"Não é possível desinstalar a app de administração de dispositivos ativa."</string> + <string name="uninstall_failed_device_policy_manager_of_user" msgid="4813104025494168064">"Não é possível desinstalar a app de administração de dispositivos ativa para <xliff:g id="USERNAME">%1$s</xliff:g>."</string> + <string name="uninstall_all_blocked_profile_owner" msgid="2009393666026751501">"Esta app é necessária para alguns utilizadores ou perfis e foi desinstalada para outros."</string> + <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"O perfil necessita desta app e não é possível desinstalá-la."</string> <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"Esta app é exigida pelo administrador do disp. e não pode ser desinstalada."</string> <string name="manage_device_administrators" msgid="3092696419363842816">"Gerir aplicações de administração de dispositivos"</string> <string name="manage_users" msgid="1243995386982560813">"Gerir utilizadores"</string> - <string name="uninstall_failed_msg" msgid="2176744834786696012">"Não foi possível desinstalar a aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> + <string name="uninstall_failed_msg" msgid="2176744834786696012">"Não foi possível desinstalar a app <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="Parse_error_dlg_text" msgid="1661404001063076789">"Ocorreu um problema ao analisar o pacote."</string> <string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string> <string name="wear_not_allowed_dlg_text" msgid="704615521550939237">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string> - <string name="message_staging" msgid="8032722385658438567">"A preparar a aplicação…"</string> + <string name="message_staging" msgid="8032722385658438567">"A preparar a app…"</string> <string name="app_name_unknown" msgid="6881210203354323926">"Desconhecida"</string> <string name="untrusted_external_source_warning" product="tablet" msgid="6539403649459942547">"Para sua segurança, o tablet não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string> <string name="untrusted_external_source_warning" product="tv" msgid="1206648674551321364">"Para sua segurança, a TV não está autorizada a instalar aplicações desconhecidas a partir desta fonte."</string> <string name="untrusted_external_source_warning" product="default" msgid="7279739265754475165">"Para sua segurança, o telemóvel não está autorizado a instalar aplicações desconhecidas a partir desta fonte."</string> - <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O seu telemóvel e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta aplicação, concorda que é responsável por quaisquer danos causados ao telemóvel ou pelas perdas de dados que possam resultar da utilização da mesma."</string> - <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"O seu tablet e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta aplicação, concorda que é responsável por quaisquer danos causados ao tablet ou pelas perdas de dados que possam resultar da utilização da mesma."</string> - <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A sua TV e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta aplicação, concorda que é responsável por quaisquer danos causados à TV ou pelas perdas de dados que possam resultar da utilização da mesma."</string> + <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"O seu telemóvel e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao telemóvel ou pelas perdas de dados que possam resultar da utilização da mesma."</string> + <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"O seu tablet e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados ao tablet ou pelas perdas de dados que possam resultar da utilização da mesma."</string> + <string name="anonymous_source_warning" product="tv" msgid="5599483539528168566">"A sua TV e os dados pessoais estão mais vulneráveis a ataques por parte de aplicações desconhecidas. Ao instalar esta app, concorda que é responsável por quaisquer danos causados à TV ou pelas perdas de dados que possam resultar da utilização da mesma."</string> <string name="anonymous_source_continue" msgid="4375745439457209366">"Continuar"</string> <string name="external_sources_settings" msgid="4046964413071713807">"Definições"</string> <string name="wear_app_channel" msgid="1960809674709107850">"Instalar/desinstalar aplicações Wear"</string> - <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de aplicação instalada"</string> - <string name="notification_installation_success_message" msgid="6450467996056038442">"Aplicação instalada com êxito"</string> + <string name="app_installed_notification_channel_description" msgid="2695385797601574123">"Notificação de app instalada"</string> + <string name="notification_installation_success_message" msgid="6450467996056038442">"App instalada com êxito"</string> <string name="notification_installation_success_status" msgid="3172502643504323321">"Aplicação \"<xliff:g id="APPNAME">%1$s</xliff:g>\" instalada com êxito"</string> </resources> diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 51995a30a012..2746284686e0 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -57,7 +57,7 @@ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Да ли желите да деинсталирате ову апликацију за "<b>"све"</b>" кориснике? Апликација и подаци уз ње биће уклоњени за "<b>"све"</b>" кориснике овог уређаја."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"Желите ли да деинсталирате ову апликацију за корисника <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> <string name="uninstall_update_text" msgid="863648314632448705">"Желите ли да замените ову апликацију фабричком верзијом? Сви подаци ће бити уклоњени."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Желите ли да замените ову апликацију фабричком верзијом? Сви подаци ће бити уклоњени. Ово утиче на све кориснике овог уређаја, укључујући и оне са профилима за Work."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Желите ли да замените ову апликацију фабричком верзијом? Сви подаци ће бити уклоњени. Ово утиче на све кориснике овог уређаја, укључујући и оне са пословним профилима."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"Задржи <xliff:g id="SIZE">%1$s</xliff:g> података апликације."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"Активна деинсталирања"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"Неуспела деинсталирања"</string> diff --git a/packages/PrintSpooler/res/values-kn/strings.xml b/packages/PrintSpooler/res/values-kn/strings.xml index 868320dd9b07..150ede4f8e62 100644 --- a/packages/PrintSpooler/res/values-kn/strings.xml +++ b/packages/PrintSpooler/res/values-kn/strings.xml @@ -104,7 +104,7 @@ </string-array> <string name="print_write_error_message" msgid="5787642615179572543">"ಫೈಲ್ಗೆ ರೈಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> <string name="print_error_default_message" msgid="8602678405502922346">"ಕ್ಷಮಿಸಿ, ಅದು ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> - <string name="print_error_retry" msgid="1426421728784259538">"ಮರುಪ್ರಯತ್ನಿಸು"</string> + <string name="print_error_retry" msgid="1426421728784259538">"ಮರುಪ್ರಯತ್ನಿಸಿ"</string> <string name="print_error_printer_unavailable" msgid="8985614415253203381">"ಈ ಪ್ರಿಂಟರ್ ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ."</string> <string name="print_cannot_load_page" msgid="6179560924492912009">"ಪೂರ್ವವೀಕ್ಷಣೆ ಪ್ರದರ್ಶಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="print_preparing_preview" msgid="3939930735671364712">"ಪೂರ್ವವೀಕ್ಷಣೆ ತಯಾರಾಗುತ್ತಿದೆ…"</string> diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 86c5351e5a0a..a1675fa7ca76 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -94,7 +94,7 @@ <item msgid="2762241247228983754">"ରଙ୍ଗ"</item> </string-array> <string-array name="duplex_mode_labels"> - <item msgid="3882302912790928315">"କିଛିନୁହେଁ"</item> + <item msgid="3882302912790928315">"କିଛି ନାହିଁ"</item> <item msgid="7296563835355641719">"ଲମ୍ବା ପ୍ରାନ୍ତ"</item> <item msgid="79513688117503758">"ଛୋଟ ପ୍ରାନ୍ତ"</item> </string-array> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index 1c128b4d89d2..4517efe0934a 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -33,7 +33,7 @@ <string name="pages_range_example" msgid="8558694453556945172">"p. ex. 1-5, 8, 11-13"</string> <string name="print_preview" msgid="8010217796057763343">"Pré-visualização de impressão"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Instalar o leitor de PDF para pré-visualização"</string> - <string name="printing_app_crashed" msgid="854477616686566398">"A aplicação de impressão bloqueou"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"A app de impressão bloqueou"</string> <string name="generating_print_job" msgid="3119608742651698916">"A gerar tarefa de impressão"</string> <string name="save_as_pdf" msgid="5718454119847596853">"Guardar como PDF"</string> <string name="all_printers" msgid="5018829726861876202">"Todas as impressoras..."</string> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index c16949ace286..1729027d9613 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Voeg gas by"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Verwyder gas"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gas"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Toestelverstek"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Gedeaktiveer"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Geaktiveer"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Jou toestel moet herselflaai om hierdie verandering toe te pas. Herselflaai nou of kanselleer."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 4c6c7b85bfda..fad7a82aae30 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"እንግዳን አክል"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"እንግዳን አስወግድ"</string> <string name="guest_nickname" msgid="6332276931583337261">"እንግዳ"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"የመሣሪያ ነባሪ"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ተሰናክሏል"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ነቅቷል"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"የእርስዎን መሣሪያ ይህ ለው ለማመልከት እንደገና መነሣት አለበት። አሁን እንደገና ያስነሡ ወይም ይተዉት።"</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 38b7179a6cae..60f4c6b59c73 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -235,7 +235,7 @@ <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"يُرجى الاتصال بشبكة Wi-Fi."</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb، تصحيح الأخطاء، مطور برامج"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"اختصار تقرير الأخطاء"</string> - <string name="bugreport_in_power_summary" msgid="1885529649381831775">"عرض زر في قائمة خيارات التشغيل لإعداد تقرير بالأخطاء"</string> + <string name="bugreport_in_power_summary" msgid="1885529649381831775">"عرض زر في قائمة زر التشغيل لإعداد تقرير بالأخطاء"</string> <string name="keep_screen_on" msgid="1187161672348797558">"البقاء في الوضع النشط"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"لا يتم مطلقًا دخول الشاشة في وضع السكون أثناء الشحن"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"تفعيل سجلّ تطفل بواجهة وحدة تحكم المضيف في بلوتوث"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"عرض خيارات شهادة عرض شاشة لاسلكي"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"زيادة مستوى تسجيل Wi-Fi، وعرض لكل SSID RSSI في منتقي Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"لتقليل استنفاد البطارية وتحسين أداء الشبكة."</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"عند تفعيل هذا الوضع، قد يتم تغيير عنوان MAC لهذا الجهاز في كل مرة تتصل فيها بشبكة تم تفعيل التوزيع العشوائي لعناوين MAC عليها."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"تفرض تكلفة استخدام"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"بدون قياس"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"أحجام ذاكرة التخزين المؤقت للتسجيل"</string> @@ -554,4 +553,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"إضافة ضيف"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"إزالة جلسة الضيف"</string> <string name="guest_nickname" msgid="6332276931583337261">"ضيف"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index ef3649096887..ad344c3803bc 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ কৰক"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি আঁতৰাওক"</string> <string name="guest_nickname" msgid="6332276931583337261">"অতিথি"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 62bb24846abe..5bf468f9f349 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -458,7 +458,7 @@ <string name="disabled" msgid="8017887509554714950">"Deaktiv"</string> <string name="external_source_trusted" msgid="1146522036773132905">"İcazə verilib"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"İcazə verilməyib"</string> - <string name="install_other_apps" msgid="3232595082023199454">"Naməlum tətbiqlərin quraşdırılması"</string> + <string name="install_other_apps" msgid="3232595082023199454">"Tanınmayan tətbiqlərin quraşdırılması"</string> <string name="home" msgid="973834627243661438">"Ayarların əsas səhifəsi"</string> <string-array name="battery_labels"> <item msgid="7878690469765357158">"0%"</item> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Qonaq əlavə edin"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Qonağı silin"</string> <string name="guest_nickname" msgid="6332276931583337261">"Qonaq"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 40432f816a30..85bb91cd55e9 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -143,11 +143,11 @@ <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Uklonjene aplikacije"</string> <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Uklonjene aplikacije i korisnici"</string> <string name="data_usage_ota" msgid="7984667793701597001">"Ažuriranja sistema"</string> - <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB Internet povezivanje"</string> + <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB privezivanje"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Prenosni hotspot"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth privezivanje"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Povezivanje sa internetom"</string> - <string name="tether_settings_title_all" msgid="8910259483383010470">"Povezivanje i prenosni hotspot"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Privezivanje"</string> + <string name="tether_settings_title_all" msgid="8910259483383010470">"Privezivanje i prenosni hotspot"</string> <string name="managed_user_title" msgid="449081789742645723">"Sve radne aplikacije"</string> <string name="user_guest" msgid="6939192779649870792">"Gost"</string> <string name="unknown" msgid="3544487229740637809">"Nepoznato"</string> @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gost"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 3e2bbfeab15d..95e1bdbc8359 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"Невядома"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"Карыстальнiк: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"Усталяваны некаторыя стандартныя налады"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"Параметры па змаўчанні не ўсталяваныя"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"Стандартныя налады не зададзены"</string> <string name="tts_settings" msgid="8130616705989351312">"Налады Text-to-speech"</string> <string name="tts_settings_title" msgid="7602210956640483039">"Сінтэз маўлення"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"Хуткасць маўлення"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Паказаць опцыі сертыфікацыі бесправаднога экрана"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Пры выбары сеткі Wi-Fi указваць у журнале RSSI для кожнага SSID"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Зніжае расход зараду акумулятара і павышае прадукцыйнасць мабільных сетак"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Калі ўключаны гэты рэжым, MAC-адрас гэтай прылады можа змяняцца падчас кожнага падключэння да сеткі з актыўнай рандамізацыяй MAC-адрасоў."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Сетка з улікам трафіка"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Сетка без уліку трафіка"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Памеры буфера журнала"</string> @@ -552,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Дадаць госця"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Выдаліць госця"</string> <string name="guest_nickname" msgid="6332276931583337261">"Госць"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 19ad5346cb53..e426625fd9f8 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Добавяне на гост"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Премахване на госта"</string> <string name="guest_nickname" msgid="6332276931583337261">"Гост"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 94e1f2383388..7bae6eef1aaa 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"অজানা"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"ব্যবহারকারী: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"কিছু ডিফল্ট সেট করা রয়েছে"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"কোনো ডিফল্ট সেট করা নেই"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"কোনও ডিফল্ট সেট করা নেই"</string> <string name="tts_settings" msgid="8130616705989351312">"পাঠ্য থেকে ভাষ্য আউটপুট সেটিংস"</string> <string name="tts_settings_title" msgid="7602210956640483039">"টেক্সট-টু-স্পিচ"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"কথা বলার হার"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ওয়্যারলেস প্রদর্শন সার্টিফিকেশন জন্য বিকল্পগুলি দেখান"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ওয়াই-ফাই লগিং স্তর বাড়ান, ওয়াই-ফাই চয়নকারীতে SSID RSSI অনুযায়ী দেখান"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ব্যাটারির খরচ কমায় এবং নেটওয়ার্কের পারফর্ম্যান্স উন্নত করে"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"এই মোডটি চালু থাকার সময়, MAC র্যান্ডমাইজেশন চালু হওয়া এমন কোনও নেটওয়ার্কে কানেক্ট করার সময় এই ডিভাইসের MAC অ্যাড্রেস পরিবর্তিত হতে পারে।"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"মিটার্ড"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"পরিমাপ করা নয়"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"লগার বাফারের আকারগুলি"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ করুন"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি সরান"</string> <string name="guest_nickname" msgid="6332276931583337261">"অতিথি"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 4ef8871b3404..e965e5f6738a 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gost"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index baee1517711b..2378d3a207c4 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra les opcions per a la certificació de pantalla sense fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Augmenta nivell de registre Wi‑Fi, mostra\'l per SSID RSSI al selector de Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Redueix el consum de bateria i millora el rendiment de la xarxa"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Quan aquest mode està activat, és possible que l’adreça MAC d’aquest dispositiu canviï cada vegada que es connecti a una xarxa amb l\'aleatorització d\'adreces MAC activada."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"D\'ús mesurat"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"D\'ús no mesurat"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Mides de la mem. intermèdia del registrador"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Afegeix un convidat"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Suprimeix el convidat"</string> <string name="guest_nickname" msgid="6332276931583337261">"Convidat"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 26fb72ea860f..aa786128273f 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Zobrazit možnosti certifikace bezdrátového displeje"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Zvýšit úroveň protokolování Wi‑Fi zobrazenou v SSID a RSSI při výběru sítě Wi‑Fi."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Snižuje vyčerpávání baterie a vylepšuje výkon sítě"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Když je tento režim aktivován, adresa MAC tohoto zařízení se může změnit pokaždé, když se zařízení připojí k síti s aktivovanou randomizací adres MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Měřená"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neměřená"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Vyrovnávací paměť protokol. nástroje"</string> @@ -434,7 +433,7 @@ <string name="power_discharge_by" msgid="4113180890060388350">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_discharge_by_only" msgid="92545648425937000">"Vydrží asi do <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_short" msgid="5883041507426914446">"Do <xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterie se může vybít do <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"Baterie se může vybít kolem <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> <string name="power_remaining_less_than_duration" msgid="318215464914990578">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> <string name="power_remaining_more_than_subtext" msgid="446388082266121894">"Zbývá více než <xliff:g id="TIME_REMAINING">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> @@ -552,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Přidat hosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odstranit hosta"</string> <string name="guest_nickname" msgid="6332276931583337261">"Host"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 9ab80da4a379..366bae3bd49b 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -211,10 +211,10 @@ <string name="adb_wireless_error" msgid="721958772149779856">"Fejl"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Trådløs fejlretning"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Du kan se og bruge tilgængelige enheder ved at aktivere trådløs fejlretning"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Dan par med en enhed ved hjælp af en QR-kode"</string> - <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Dan par med nye enheder ved hjælp af QR-kodescanneren"</string> - <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Dan par med en enhed ved hjælp af en parringskode"</string> - <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Dan par med nye enheder ved hjælp af den sekscifrede kode"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Par enhed ved hjælp af en QR-kode"</string> + <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Par nye enheder ved hjælp af QR-kodescanneren"</string> + <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Par enhed ved hjælp af en parringskode"</string> + <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Par nye enheder ved hjælp af den sekscifrede kode"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"Parrede enheder"</string> <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Forbundet lige nu"</string> <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Enhedsoplysninger"</string> @@ -222,16 +222,16 @@ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"Fingeraftryk for enhed: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string> <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Forbindelsen mislykkedes"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Sørg for, at <xliff:g id="DEVICE_NAME">%1$s</xliff:g> har forbindelse til det rigtige netværk."</string> - <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Dan par med enhed"</string> + <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Par med enhed"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Parringskode til Wi-Fi"</string> - <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Parringen mislykkedes"</string> + <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Pardannelse mislykkedes"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Sørg for, at enheden er forbundet til det samme netværk."</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Dan par med en enhed via Wi-Fi ved at scanne en QR-kode"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Par en enhed via Wi-Fi ved at scanne en QR-kode"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Parrer enhed…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Enheden blev ikke parret. Det skyldes enten, at QR-koden var forkert, eller at enheden ikke er forbundet til det samme netværk."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP-adresse og port"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Scan QR-kode"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Dan par med en enhed via Wi-Fi ved at scanne en QR-kode"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Par en enhed via Wi-Fi ved at scanne en QR-kode"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Opret forbindelse til et Wi-Fi-netværk"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, fejlfinding, dev"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"Genvej til fejlrapportering"</string> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Tilføj gæsten"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gæsten"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gæst"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 73a6245a07c7..74f59e2e125c 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Optionen zur Zertifizierung für kabellose Übertragung anzeigen"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"WLAN-Protokollierungsebene erhöhen, pro SSID RSSI in WiFi Picker anzeigen"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Verringert den Akkuverbrauch und verbessert die Netzwerkleistung"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Wenn dieser Modus aktiviert ist, kann sich die MAC-Adresse dieses Geräts bei jeder Verbindung mit einem Netzwerk ändern, bei dem die MAC-Adressen randomisiert werden."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Kostenpflichtig"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Kostenlos"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Logger-Puffergrößen"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Gast hinzufügen"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Gast entfernen"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gast"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index ceabc74922e6..c2502efed188 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Προσθήκη επισκέπτη"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Κατάργηση επισκέπτη"</string> <string name="guest_nickname" msgid="6332276931583337261">"Επισκέπτης"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index fca1c507cd2a..5fa9d45a600a 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Guest"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Device default"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index fca1c507cd2a..5fa9d45a600a 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Guest"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Device default"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index fca1c507cd2a..5fa9d45a600a 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Guest"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Device default"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index fca1c507cd2a..5fa9d45a600a 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Guest"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Device default"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 95bc93628f21..1cd2d84d1671 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Guest"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Device default"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Disabled"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Enabled"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Your device must be rebooted for this change to apply. Reboot now or cancel."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index e2d488c137ce..025cfc43bb33 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -223,8 +223,8 @@ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Error de conexión"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Asegúrate de que <xliff:g id="DEVICE_NAME">%1$s</xliff:g> esté conectado a la red correcta."</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Vincular con dispositivo"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de sincroniz. de Wi‑Fi"</string> - <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Error de sincronización"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de vinculación de Wi‑Fi"</string> + <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Error de vinculación"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Asegúrate de que el dispositivo esté conectado a la misma red."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Escanea un código QR para vincular el dispositivo mediante Wi‑Fi"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Vinculando dispositivo…"</string> @@ -285,7 +285,7 @@ <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumentar nivel de registro Wi-Fi; mostrar por SSID RSSI en el selector de Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Reduce el consumo de batería y mejora el rendimiento de la red"</string> <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Si este modo está habilitado, es posible que la dirección MAC del dispositivo cambie cada vez que se conecte a una red que tenga habilitada la aleatorización de MAC."</string> - <string name="wifi_metered_label" msgid="8737187690304098638">"Con uso medido"</string> + <string name="wifi_metered_label" msgid="8737187690304098638">"De uso medido"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sin tarifa plana"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamaños de búfer de Logger"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Selecciona el tamaño del Logger por búfer"</string> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Agregar invitado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Invitado"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index e7d53f659c6e..03b049529be6 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Añadir invitado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Invitado"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index f6d2c01db42e..4857b1e938f0 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Lisa külaline"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Eemalda külaline"</string> <string name="guest_nickname" msgid="6332276931583337261">"Külaline"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 685facb4dea9..4d79747ce77f 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Erakutsi hari gabe bistaratzeko ziurtagiriaren aukerak"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Erakutsi datu gehiago wifi-sareetan saioa hastean. Erakutsi sarearen identifikatzailea eta seinalearen indarra wifi-sareen hautatzailean."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Bateria gutxiago kontsumituko da, eta sarearen errendimendua hobetuko."</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Modu hau gaituta dagoenean, baliteke gailuaren MAC helbidea aldatzea MAC helbideak ausaz antolatzeko aukera gaituta daukan sare batera konektatzen den bakoitzean."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Sare neurtua"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neurtu gabeko sarea"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Erregistroen buffer-tamainak"</string> @@ -550,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Gehitu gonbidatua"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Kendu gonbidatua"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gonbidatua"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Gailuaren balio lehenetsia"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desgaituta"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Gaituta"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Aldaketa aplikatzeko, berrabiarazi egin behar da gailua. Berrabiaraz ezazu orain, edo utzi bertan behera."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index a893c755ae11..d176114f2ba2 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"ناشناس"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"کاربر: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"بعضی پیشفرضها تنظیم شدهاند"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"هیچ پیشفرضی تنظیم نشده است"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"پیشفرضی تنظیم نشده است"</string> <string name="tts_settings" msgid="8130616705989351312">"تنظیمات متن به گفتار"</string> <string name="tts_settings_title" msgid="7602210956640483039">"خروجی تبدیل متن به گفتار"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"سرعت گفتار"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"افزودن مهمان"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"حذف مهمان"</string> <string name="guest_nickname" msgid="6332276931583337261">"مهمان"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"پیشفرض دستگاه"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"غیرفعال"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"فعال"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"برای اعمال این تغییر، دستگاهتان باید راهاندازی مجدد شود. اکنون راهاندازی مجدد کنید یا لغو کنید."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index c899d9c8daea..af278cb35fd4 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -61,7 +61,7 @@ <string-array name="bt_hci_snoop_log_entries"> <item msgid="695678520785580527">"Ei käytössä"</item> <item msgid="6336372935919715515">"Suodatus käytössä"</item> - <item msgid="2779123106632690576">"Käytössä"</item> + <item msgid="2779123106632690576">"Päällä"</item> </string-array> <string-array name="bluetooth_avrcp_versions"> <item msgid="8036025277512210160">"AVRCP 1.4 (oletus)"</item> @@ -242,7 +242,7 @@ <item msgid="1212561935004167943">"Korosta testatut piirtokom. vihreällä"</item> </string-array> <string-array name="track_frame_time_entries"> - <item msgid="634406443901014984">"Pois käytöstä"</item> + <item msgid="634406443901014984">"Pois päältä"</item> <item msgid="1288760936356000927">"Ruudulla palkkeina"</item> <item msgid="5023908510820531131">"Kohteessa <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item> </string-array> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 5fae2103130b..db5e957dcece 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -24,7 +24,7 @@ <string name="wifi_security_none" msgid="7392696451280611452">"Ei mitään"</string> <string name="wifi_remembered" msgid="3266709779723179188">"Tallennettu"</string> <string name="wifi_disconnected" msgid="7054450256284661757">"Yhteys katkaistu"</string> - <string name="wifi_disabled_generic" msgid="2651916945380294607">"Pois käytöstä"</string> + <string name="wifi_disabled_generic" msgid="2651916945380294607">"Pois päältä"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP-kokoonpanovirhe"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Ei yhteyttä – verkko huonolaatuinen"</string> <string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Wi-Fi-yhteysvirhe"</string> @@ -276,7 +276,7 @@ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="2040810756832027227">"Striimaus: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="select_private_dns_configuration_title" msgid="7887550926056143018">"Yksityinen DNS"</string> <string name="select_private_dns_configuration_dialog_title" msgid="3731422918335951912">"Valitse yksityinen DNS-tila"</string> - <string name="private_dns_mode_off" msgid="7065962499349997041">"Pois käytöstä"</string> + <string name="private_dns_mode_off" msgid="7065962499349997041">"Pois päältä"</string> <string name="private_dns_mode_opportunistic" msgid="1947864819060442354">"Automaattinen"</string> <string name="private_dns_mode_provider" msgid="3619040641762557028">"Yksityisen DNS-tarjoajan isäntänimi"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"Anna isäntänimi tai DNS-tarjoaja"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Näytä langattoman näytön sertifiointiin liittyvät asetukset."</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Lisää Wi‑Fin lokikirjaustasoa, näytä SSID RSSI -kohtaisesti Wi‑Fi-valitsimessa."</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Vähentää virrankulutusta ja parantaa verkon toimintaa"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Kun tämä tila on päällä, laitteen MAC-osoite voi muuttua aina, kun laite yhdistää verkkoon, jossa MAC-satunnaistaminen on käytössä."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Maksullinen"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Maksuton"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Lokipuskurien koot"</string> @@ -399,7 +398,7 @@ </string-array> <string name="inactive_apps_title" msgid="5372523625297212320">"Valmiustilasovellukset"</string> <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ei käytössä. Ota käyttöön koskettamalla."</string> - <string name="inactive_app_active_summary" msgid="8047630990208722344">"Käytössä. Poista käytöstä koskettamalla."</string> + <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiivinen. Vaihda koskettamalla."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Sovelluksen valmiusluokka: <xliff:g id="BUCKET"> %s</xliff:g>"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita."</string> @@ -456,7 +455,7 @@ <string name="battery_info_status_not_charging" msgid="8330015078868707899">"Kytketty virtalähteeseen, lataaminen ei onnistu"</string> <string name="battery_info_status_full" msgid="4443168946046847468">"Täynnä"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Järjestelmänvalvoja hallinnoi tätä asetusta."</string> - <string name="disabled" msgid="8017887509554714950">"Pois käytöstä"</string> + <string name="disabled" msgid="8017887509554714950">"Pois päältä"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Sallittu"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Ei sallittu"</string> <string name="install_other_apps" msgid="3232595082023199454">"Tuntemattomien sovellusten asentaminen"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Lisää vieras"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Poista vieras"</string> <string name="guest_nickname" msgid="6332276931583337261">"Vieras"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 689f26750c44..b8ff6598ec02 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string> <string name="guest_nickname" msgid="6332276931583337261">"Invité"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Valeur par défaut de l\'appareil"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Désactivé"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Activé"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Votre appareil doit être redémarré pour que ce changement prenne effet. Redémarrez-le maintenant ou annulez la modification."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 6a88f6353cf9..064e59fb7db2 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Afficher les options pour la certification de l\'affichage sans fil"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Détailler les infos Wi-Fi, afficher par RSSI de SSID dans l\'outil de sélection Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit la décharge de la batterie et améliore les performances du réseau"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Lorsque ce mode est activé, l\'adresse e-mail MAC de cet appareil peut changer lors de chaque connexion à un réseau pour lequel le changement aléatoire d\'adresse MAC est activé."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non facturé à l\'usage"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des tampons de l\'enregistreur"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string> <string name="guest_nickname" msgid="6332276931583337261">"Invité"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index c1d5548e1f07..8bb04f3a0085 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Engadir convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar convidado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index b6845a0f5246..b88126bf99be 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -195,7 +195,7 @@ </string-array> <string name="choose_profile" msgid="343803890897657450">"પ્રોફાઇલ પસંદ કરો"</string> <string name="category_personal" msgid="6236798763159385225">"વ્યક્તિગત"</string> - <string name="category_work" msgid="4014193632325996115">"કાર્યાલય"</string> + <string name="category_work" msgid="4014193632325996115">"ઑફિસ"</string> <string name="development_settings_title" msgid="140296922921597393">"વિકાસકર્તાનાં વિકલ્પો"</string> <string name="development_settings_enable" msgid="4285094651288242183">"વિકાસકર્તાનાં વિકલ્પો સક્ષમ કરો"</string> <string name="development_settings_summary" msgid="8718917813868735095">"ઍપ્લિકેશન વિકાસ માટે વિકલ્પો સેટ કરો"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"વાયરલેસ ડિસ્પ્લે પ્રમાણપત્ર માટેના વિકલ્પો બતાવો"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"વાઇ-ફાઇ લોગિંગ સ્તર વધારો, વાઇ-ફાઇ પીકરમાં SSID RSSI દીઠ બતાવો"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"બૅટરીનો ચાર્જ ઝડપથી ઓછો થવાનું ટાળે છે અને નેટવર્કની કાર્યક્ષમતામાં સુધારો કરે છે"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"આ મોડ ચાલુ કરેલો હશે, ત્યારે MAC રેન્ડમાઇઝેશન ચાલુ કરેલું હોય તેવા નેટવર્ક સાથે આ ડિવાઇસ જોડાશે ત્યારે દર વખતે તેનું MAC ઍડ્રેસ બદલાય તેમ બની શકે છે."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"મીટર કરેલ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"મીટર ન કરેલ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"લોગર બફર કદ"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"અતિથિ ઉમેરો"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"અતિથિને કાઢી નાખો"</string> <string name="guest_nickname" msgid="6332276931583337261">"અતિથિ"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index aae58c497125..d8aa092b6eeb 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिसप्ले सर्टिफ़िकेशन के विकल्प दिखाएं"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाई-फ़ाई लॉगिंग का स्तर बढ़ाएं, वाई-फ़ाई पिकर में प्रति SSID RSSI दिखाएं"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बैटरी की खपत कम और नेटवर्क की परफ़ॉर्मेंस बेहतर होती है"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"जब यह मोड चालू होता है, तब नेटवर्क से कनेक्ट होने पर हर बार इस डिवाइस का MAC पता बदल सकता है. ऐसा तब होता है, जब डिवाइस किसी ऐसे नेटवर्क से जुड़ता है जिस पर MAC पते को बिना किसी तय नियम के बदलने की सुविधा चालू होती है."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"डेटा इस्तेमाल करने की सीमा तय की गई है"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"डेटा इस्तेमाल करने की सीमा तय नहीं की गई है"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफ़र आकार"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"मेहमान जोड़ें"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"मेहमान हटाएं"</string> <string name="guest_nickname" msgid="6332276931583337261">"मेहमान"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 64cd891feee6..548fc20a35bf 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -196,7 +196,7 @@ <string name="choose_profile" msgid="343803890897657450">"Odabir profila"</string> <string name="category_personal" msgid="6236798763159385225">"Osobno"</string> <string name="category_work" msgid="4014193632325996115">"Posao"</string> - <string name="development_settings_title" msgid="140296922921597393">"Za razvojne programere"</string> + <string name="development_settings_title" msgid="140296922921597393">"Opcije za razvojne programere"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Omogući opcije za razvojne programere"</string> <string name="development_settings_summary" msgid="8718917813868735095">"Postavljanje opcija za razvoj aplikacije"</string> <string name="development_settings_not_available" msgid="355070198089140951">"Opcije razvojnih programera nisu dostupne za ovog korisnika"</string> @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Dodavanje gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Uklanjanje gosta"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gost"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index ca410f27314f..9e51cfd819f6 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Vezeték nélküli kijelző tanúsítványával kapcsolatos lehetőségek megjelenítése"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi-naplózási szint növelése, RSSI/SSID megjelenítése a Wi‑Fi-választóban"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Csökkenti az akkumulátorhasználatot, és javítja a hálózat teljesítményét"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Ha ez a mód be van kapcsolva, akkor ennek az eszköznek a MAC-címe minden alkalommal módosulhat, amikor olyan hálózathoz csatlakozik, amelyen engedélyezve van a MAC-címek randomizálása."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Forgalomkorlátos"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Nem forgalomkorlátos"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Naplózási puffer mérete"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Vendég hozzáadása"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Vendég munkamenet eltávolítása"</string> <string name="guest_nickname" msgid="6332276931583337261">"Vendég"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 22c01ace9d3f..52e9175a8117 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Ավելացնել հյուր"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Հեռացնել հյուրին"</string> <string name="guest_nickname" msgid="6332276931583337261">"Հյուր"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index a578d311c74c..561b7c43567d 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Tambahkan tamu"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Hapus tamu"</string> <string name="guest_nickname" msgid="6332276931583337261">"Tamu"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 862dabda2960..e99faaf33fdc 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Bæta gesti við"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjarlægja gest"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gestur"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index ff3df16617ca..ece0ba489ebc 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -207,11 +207,11 @@ <string name="enable_adb_summary" msgid="3711526030096574316">"Modalità debug quando è connesso tramite USB"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"Revoca autorizzazioni debug USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Debug wireless"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Modalità Debug quando il Wi-Fi è connesso"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Modalità debug quando il Wi-Fi è connesso"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Errore"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Debug wireless"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Per trovare e utilizzare i dispositivi disponibili, attiva il debug wireless"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Accoppia il dispositivo con il codice QR"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Accoppia dispositivo con codice QR"</string> <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Accoppia i nuovi dispositivi utilizzando lo scanner di codici QR"</string> <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Accoppia dispositivo con codice di accoppiamento"</string> <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Accoppia i nuovi dispositivi utilizzando un codice di sei cifre"</string> @@ -284,7 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Mostra opzioni per la certificazione display wireless"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Aumenta livello di logging Wi-Fi, mostra SSID RSSI nel selettore Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Riduce il consumo della batteria e migliora le prestazioni della rete"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Quando questa modalità è attiva, l\'indirizzo MAC del dispositivo potrebbe cambiare ogni volta che si connette a una rete con randomizzazione MAC attivata"</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Quando questa modalità è attiva, l\'indirizzo MAC del dispositivo potrebbe cambiare ogni volta che si connette a una rete con randomizzazione MAC attivata."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"A consumo"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non a consumo"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Dimensioni buffer logger"</string> @@ -359,7 +359,7 @@ <string name="track_frame_time" msgid="522674651937771106">"Rendering HWUI profilo"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Attiva livelli debug GPU"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Consenti caricamento livelli debug GPU per app di debug"</string> - <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Attiva reg. dettagl. fornitori"</string> + <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Attiva log dettagliati fornitori"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Includi log aggiuntivi di fornitori relativi a un dispositivo specifico nelle segnalazioni di bug che potrebbero contenere informazioni private, causare un maggior consumo della batteria e/o utilizzare più spazio di archiviazione."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Scala animazione finestra"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Scala animazione transizione"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Aggiungi ospite"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Rimuovi ospite"</string> <string name="guest_nickname" msgid="6332276931583337261">"Ospite"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Predefinito dispositivo"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Non attivo"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Attivo"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Devi riavviare il dispositivo per applicare questa modifica. Riavvia ora o annulla."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index ca0849e82b75..06111b6b1ae8 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"הצג אפשרויות עבור אישור של תצוגת WiFi"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"העלה את רמת הרישום של Wi‑Fi ביומן, הצג לכל SSID RSSI ב-Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"מפחית את קצב התרוקנות הסוללה ומשפר את ביצועי הרשת"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"כשמצב זה מופעל, כתובת ה-MAC של המכשיר הזה עשויה להשתנות בכל פעם שהוא מתחבר לרשת שפועלת בה רנדומיזציה של כתובות MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"נמדדת"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"לא נמדדת"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"גדלי מאגר של יומן רישום"</string> @@ -552,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"הוספת אורח"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"הסרת אורח"</string> <string name="guest_nickname" msgid="6332276931583337261">"אורח"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 604ceb223155..850fd977dc7b 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ワイヤレス ディスプレイ認証のオプションを表示"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ログレベルを上げて、Wi-Fi 選択ツールで SSID RSSI ごとに表示します"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"電池の消耗が軽減され、ネットワーク パフォーマンスが改善されます"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"このモードが有効な場合、このデバイスは、MAC アドレスのランダム化が有効なネットワークに接続するたびに MAC アドレスが変わる可能性があります。"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"従量制"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"定額制"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ログバッファのサイズ"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ゲストを追加"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ゲストを削除"</string> <string name="guest_nickname" msgid="6332276931583337261">"ゲスト"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 754d4a05fdcc..025cd94b52ca 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"სტუმრის დამატება"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"სტუმრის ამოშლა"</string> <string name="guest_nickname" msgid="6332276931583337261">"სტუმარი"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 50ff04d320f4..9bcc0a2ebbb0 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Сымсыз дисплей сертификаты опцияларын көрсету"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi тіркеу деңгейін арттыру, Wi‑Fi таңдағанда әр SSID RSSI бойынша көрсету"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Батарея зарядының шығынын азайтады және желі жұмысын жақсартады."</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Бұл режим қосулы болса, құрылғының MAC мекенжайы MAC рандомизациясы қосулы желіге жалғанған сайын өзгеруі мүмкін."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Трафик саналады"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Трафик саналмайды"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Журналға тіркеуші буферінің өлшемдері"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Қонақты енгізу"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Қонақты өшіру"</string> <string name="guest_nickname" msgid="6332276931583337261">"Қонақ"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 92ea817f591b..ce03f22c7262 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"បង្ហាញជម្រើសសម្រាប់សេចក្តីបញ្ជាក់ការបង្ហាញឥតខ្សែ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"បង្កើនកម្រិតកំណត់ហេតុ Wi-Fi បង្ហាញក្នុង SSID RSSI ក្នុងកម្មវិធីជ្រើសរើស Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"កាត់បន្ថយការប្រើប្រាស់ថ្ម និងកែលម្អប្រតិបត្តិការបណ្ដាញ"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"នៅពេលបើកមុខងារនេះ អាសយដ្ឋាន MAC របស់ឧបករណ៍នេះអាចផ្លាស់ប្ដូរ រាល់ពេលដែលវាភ្ជាប់ជាមួយបណ្ដាញដែលបានបើកការតម្រៀប MAC តាមលំដាប់ចៃដន្យ។"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"មានការកំណត់"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"មិនមានការកំណត់"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ទំហំកន្លែងផ្ទុករបស់ logger"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"បញ្ចូលភ្ញៀវ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"លុបភ្ញៀវ"</string> <string name="guest_nickname" msgid="6332276931583337261">"ភ្ញៀវ"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index f495857a307e..52e3b994a424 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ಅತಿಥಿಯನ್ನು ಸೇರಿಸಿ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string> <string name="guest_nickname" msgid="6332276931583337261">"ಅತಿಥಿ"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 782791ae1233..b95ad9baaf31 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -210,7 +210,7 @@ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi가 연결되었을 때 디버그 모드 사용"</string> <string name="adb_wireless_error" msgid="721958772149779856">"오류"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"무선 디버깅"</string> - <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"사용 가능한 기기를 보고 사용하려면 무선 디버깅을 사용 설정하세요."</string> + <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"사용 가능한 기기를 확인하고 사용하려면 무선 디버깅을 사용 설정하세요."</string> <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR 코드로 기기 페어링"</string> <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR 코드 스캐너를 사용하여 새 기기 페어링"</string> <string name="adb_pair_method_code_title" msgid="1122590300445142904">"페어링 코드로 기기 페어링"</string> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"게스트 추가"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"게스트 삭제"</string> <string name="guest_nickname" msgid="6332276931583337261">"게스트"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 3d9311090503..45fc6cb3be8e 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -203,29 +203,29 @@ <string name="vpn_settings_not_available" msgid="2894137119965668920">"Бул колдонуучу VPN жөндөөлөрүн колдоно албайт"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"Бул колдонуучу модем режиминин жөндөөлөрүн өзгөртө албайт"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"Бул колдонуучу мүмкүндүк алуу түйүнүнүн аталышынын жөндөөлөрүн колдоно албайт"</string> - <string name="enable_adb" msgid="8072776357237289039">"USB аркылуу мүчүлүштүктөрдү оңдоо"</string> + <string name="enable_adb" msgid="8072776357237289039">"USB аркылуу мүчүлүштүктөрдү аныктоо"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"USB компьютерге сайылганда мүчүлүштүктөрдү оңдоо режими иштейт"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"USB аркылуу мүчүлүштүктөрдү оңдоо уруксатын артка кайтаруу"</string> - <string name="enable_adb_wireless" msgid="6973226350963971018">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташтырылганда мүчүлүштүктөрдү оңдоо режими"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"USB аркылуу мүчүлүштүктөрдү аныктоо уруксатын артка кайтаруу"</string> + <string name="enable_adb_wireless" msgid="6973226350963971018">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Wi‑Fi\'га туташканда, мүчүлүштүктөрдү аныктоо режими иштейт оңдоо режими"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Ката"</string> - <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо"</string> - <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн мүчүлүштүктөрдү Wi-Fi аркылуу оңдоону күйгүзүңүз"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR кодун колдонуп, түзмөктү жупташтырыңыз"</string> + <string name="adb_wireless_settings" msgid="2295017847215680229">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо"</string> + <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Жеткиликтүү түзмөктөрдү көрүү үчүн, мүчүлүштүктөрдү Wi-Fi аркылуу аныктоону күйгүзүңүз"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Түзмөктү QR коду аркылуу жупташтыруу"</string> <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR кодунун сканерин колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string> - <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Жупташтыруучу код менен түзмөктү жупташтырыңыз"</string> - <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Алты сандан турган кодду колдонуп, жаңы түзмөктөрдү жупташтырыңыз"</string> + <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Түзмөктү атайын код аркылуу жупташтыруу"</string> + <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Жаңы түзмөктөрдү алты сандан турган код аркылуу жупташтырасыз"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"Жупташтырылган түзмөктөр"</string> <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Учурда туташып турган түзмөктөр"</string> <string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Түзмөктүн чоо-жайы"</string> <string name="adb_device_forget" msgid="193072400783068417">"Унутулсун"</string> <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"Түзмөктөгү манжа изи: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string> - <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Туташкан жок"</string> + <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Байланышкан жок"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> туура тармакка туташып турганын текшериңиз"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Түзмөктү жупташтыруу"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi жупташтыруучу коду"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Жупташтырылган жок"</string> - <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Түзмөк бир тармакка туташканын текшериңиз."</string> + <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Түзмөк бир тармакка туташып турушу керек."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR кодун скандап, түзмөктү Wi‑Fi аркылуу жупташтырыңыз"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Түзмөк жупташтырылууда…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Түзмөк жупташтырылган жок. QR коду туура эмес же түзмөк бир тармакка туташпай турат."</string> @@ -303,7 +303,7 @@ <string name="adb_warning_title" msgid="7708653449506485728">"USB аркылуу жөндөөгө уруксат бересизби?"</string> <string name="adb_warning_message" msgid="8145270656419669221">"USB-жөндөө - өндүрүү максатында гана түзүлгөн. Аны компүтериңиз менен түзмөгүңүздүн ортосунда берилиштерди алмашуу, түзмөгүңүзгө колдонмолорду эскертүүсүз орнотуу жана лог берилиштерин окуу үчүн колдонсоңуз болот."</string> <string name="adbwifi_warning_title" msgid="727104571653031865">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоого уруксат берилсинби?"</string> - <string name="adbwifi_warning_message" msgid="8005936574322702388">"Мүчүлүштүктөрдү Wi-Fi аркылуу оңдоо – өндүрүү максатында гана түзүлгөн. Аны компьютериңиз менен түзмөгүңүздүн ортосунда маалыматты алмашуу, колдонмолорду түзмөгүңүзгө эскертүүсүз орнотуу жана маалыматтар таржымалын окуу үчүн колдонсоңуз болот."</string> + <string name="adbwifi_warning_message" msgid="8005936574322702388">"Мүчүлүштүктөрдү Wi-Fi аркылуу аныктоо – өндүрүү максатында гана түзүлгөн. Аны компьютериңиз менен түзмөгүңүздүн ортосунда маалыматты алмашуу, колдонмолорду түзмөгүңүзгө эскертүүсүз орнотуу жана маалыматтар таржымалын окуу үчүн колдонсоңуз болот."</string> <string name="adb_keys_warning_message" msgid="2968555274488101220">"Сиз мурун USB жөндөөлөрүнө уруксат берген бардык компүтерлердин жеткиси жокко чыгарылсынбы?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"Жөндөөлөрдү өзгөртүү"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"Бул орнотуулар өндүрүүчүлөр үчүн гана берилген. Булар түзмөгүңүздүн колдонмолорун бузулушуна же туура эмес иштешине алып келиши мүмкүн."</string> @@ -317,7 +317,7 @@ <string name="enable_terminal_summary" msgid="2481074834856064500">"Жергиликтүү буйрук кабыгын сунуштаган терминалга уруксат берүү"</string> <string name="hdcp_checking_title" msgid="3155692785074095986">"HDCP текшерүү"</string> <string name="hdcp_checking_dialog_title" msgid="7691060297616217781">"HDCP текшерүү тартиби"</string> - <string name="debug_debugging_category" msgid="535341063709248842">"Мүчүлүштүктөрдү оңдоо"</string> + <string name="debug_debugging_category" msgid="535341063709248842">"Мүчүлүштүктөрдү аныктоо"</string> <string name="debug_app" msgid="8903350241392391766">"Мүчүлүштүктөрдү оңдоочу колдонмону тандоо"</string> <string name="debug_app_not_set" msgid="1934083001283807188">"Бир дагы колдонмо орнотула элек."</string> <string name="debug_app_set" msgid="6599535090477753651">"Жөндөөчү колдонмо: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -360,7 +360,7 @@ <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетүү"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"GPU мүчүлүштүктөрдү оңдоо катмарларын иштетет"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Кызмат көрсөтүүчүнү оозеки киргизүүнү иштетет"</string> - <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Түзмөккө байланыштуу кызмат көрсөтүүчүнүн кирүүлөрү боюнча мүчүлүштүк тууралуу кабар берүү камтылсын. Анда купуя маалымат көрсөтүлүп, батарея тезирээк отуруп жана/же сактагычтан көбүрөөк орун ээлениши мүмкүн."</string> + <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Түзмөккө байланыштуу кызмат көрсөтүүчүнүн кирүүлөрү боюнча мүчүлүштүк тууралуу кабарлоо камтылсын. Анда купуя маалымат көрсөтүлүп, батарея тезирээк отуруп жана/же сактагычтан көбүрөөк орун ээлениши мүмкүн."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Терезелердин анимациясы"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"Өткөрүү анимацснн шкаласы"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Анимациянын узактыгы"</string> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Конок кошуу"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string> <string name="guest_nickname" msgid="6332276931583337261">"Конок"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 856f26c76320..4e3967445d0f 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ເພີ່ມແຂກ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ລຶບແຂກອອກ"</string> <string name="guest_nickname" msgid="6332276931583337261">"ແຂກ"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"ຄ່າເລີ່ມຕົ້ນອຸປະກອນ"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"ປິດການນຳໃຊ້ແລ້ວ"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"ເປີດການນຳໃຊ້ແລ້ວ"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"ທ່ານຕ້ອງປິດເປີດອຸປະກອນຄືນໃໝ່ເພື່ອນຳໃຊ້ການປ່ຽນແປງນີ້. ປິດເປີດໃໝ່ດຽວນີ້ ຫຼື ຍົກເລີກ."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index eefc7092217d..81357cc78c45 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Rodyti belaidžio rodymo sertifikavimo parinktis"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Padidinti „Wi‑Fi“ įrašymo į žurnalą lygį, rodyti SSID RSSI „Wi-Fi“ rinkiklyje"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Sumažinamas akumuliatoriaus eikvojimas ir patobulinamas tinklo našumas"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Kai įgalintas šis režimas, šio įrenginio MAC adresas gali keistis kas kartą prisijungus prie tinklo, kuriame įgalintas atsitiktinis MAC parinkimas."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Matuojamas"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Neišmatuotas"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Registruotuvo buferio dydžiai"</string> @@ -552,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Pridėti svečią"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Pašalinti svečią"</string> <string name="guest_nickname" msgid="6332276931583337261">"Svečias"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 758fba7f5271..c63f3123e27b 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Pievienot viesi"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Noņemt viesi"</string> <string name="guest_nickname" msgid="6332276931583337261">"Viesis"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index a662cd3c2d0a..e0cc38de584a 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Додај гостин"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Отстрани гостин"</string> <string name="guest_nickname" msgid="6332276931583337261">"Гостин"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Стандардно за уредот"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Оневозможено"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Овозможено"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"За да се примени променава, уредот мора да се рестартира. Рестартирајте сега или откажете."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 1af22b24b00d..1a3f06830bab 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"അജ്ഞാതം"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"ഉപയോക്താവ്: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"സ്ഥിരമായ ചിലത് സജ്ജീകരിച്ചു"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"സ്ഥിരമായൊന്നും സജ്ജീകരിച്ചിട്ടില്ല"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"ഡിഫോൾട്ടുകളൊന്നും സജ്ജീകരിച്ചിട്ടില്ല"</string> <string name="tts_settings" msgid="8130616705989351312">"ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ക്രമീകരണങ്ങൾ"</string> <string name="tts_settings_title" msgid="7602210956640483039">"ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ഔട്ട്പുട്ട്"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"വായനയുടെ വേഗത"</string> @@ -207,7 +207,7 @@ <string name="enable_adb_summary" msgid="3711526030096574316">"USB കണക്റ്റുചെയ്തിരിക്കുമ്പോഴുള്ള ഡീബഗ് മോഡ്"</string> <string name="clear_adb_keys" msgid="3010148733140369917">"USB ഡീബഗ്ഗിംഗ് അംഗീകാരം പിൻവലിക്കുക"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"വയർലെസ് ഡീബഗ്ഗിംഗ്"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"വൈഫൈ കണക്റ്റ് ചെയ്തിരിക്കുമ്പോൾ ഡീബഗ് ചെയ്യൽ മോഡിലാക്കുക"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"വൈഫൈ കണക്റ്റ് ചെയ്തിരിക്കുമ്പോൾ ഡീബഗ് മോഡിലാക്കുക"</string> <string name="adb_wireless_error" msgid="721958772149779856">"പിശക്"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"വയർലെസ് ഡീബഗ്ഗിംഗ്"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"ലഭ്യമായ ഉപകരണങ്ങൾ കാണാനും ഉപയോഗിക്കാനും വയർലെസ് ഡീബഗ്ഗിംഗ് ഓണാക്കുക"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"വയർലെസ് ഡിസ്പ്ലേ സർട്ടിഫിക്കേഷനായി ഓപ്ഷനുകൾ ദൃശ്യമാക്കുക"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"വൈഫൈ പിക്കറിൽ ഓരോ SSID RSSI പ്രകാരം കാണിക്കാൻ വൈഫൈ ലോഗിംഗ് നില വർദ്ധിപ്പിക്കുക"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ബാറ്ററി ചാർജ് വേഗത്തിൽ തീരുന്ന അവസ്ഥ കുറച്ച് നെറ്റ്വർക്ക് പ്രകടനം മെച്ചപ്പെടുത്തുന്നു"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"ഈ മോഡ് പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ, MAC ക്രമരഹിതമാക്കൽ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുമ്പോഴെല്ലാം ഈ ഉപകരണത്തിന്റെ MAC വിലാസം മാറിയേക്കാം."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"മീറ്റർ ചെയ്തത്"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"മീറ്റർമാപകമല്ലാത്തത്"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ലോഗർ ബഫർ വലുപ്പം"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"അതിഥിയെ ചേർക്കുക"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"അതിഥിയെ നീക്കം ചെയ്യുക"</string> <string name="guest_nickname" msgid="6332276931583337261">"അതിഥി"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 05e13936cd92..81733f2129a2 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Зочин нэмэх"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Зочин хасах"</string> <string name="guest_nickname" msgid="6332276931583337261">"Зочин"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index e5f676414ffc..0895cd4dfdaf 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"वायरलेस डिस्प्ले प्रमाणिकरणाचे पर्याय दाखवा"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"वाय-फाय लॉगिंग स्तर वाढवा, वाय-फाय सिलेक्टरमध्ये प्रति SSID RSSI दर्शवा"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"बॅटरी जलदरीतीने संपण्यापासून रोखते आणि नेटवर्क परफॉर्मन्समध्ये सुधारणा करते"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"हा मोड सुरू केला असल्यास, या डिव्हाइसचा MAC अॅड्रेस प्रत्येक वेळी MAC रँडमायझेशन सुरू असलेल्या नेटवर्कशी कनेक्ट झाल्यास, कदाचित बदलू शकतो."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"मीटरने मोजलेले"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"मीटरने न मोजलेले"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लॉगर बफर आकार"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"अतिथी जोडा"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"अतिथी काढून टाका"</string> <string name="guest_nickname" msgid="6332276931583337261">"अतिथी"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index c6be11f78dc3..bb70a8629fe4 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Tunjukkan pilihan untuk pensijilan paparan wayarles"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tingkatkan tahap pengelogan Wi-Fi, tunjuk setiap SSID RSSI dalam Pemilih Wi-Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Mengurangkan penyusutan bateri & meningkatkan prestasi rangkaian"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Apabila mod ini didayakan, alamat MAC peranti ini mungkin berubah setiap kali peranti bersambung kepada rangkaian yang telah mendayakan perawakan MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Bermeter"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Tidak bermeter"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Saiz penimbal pengelog"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Tambah tetamu"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Alih keluar tetamu"</string> <string name="guest_nickname" msgid="6332276931583337261">"Tetamu"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 037436ec3f58..920d65926c82 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ဧည့်သည့် ထည့်ရန်"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string> <string name="guest_nickname" msgid="6332276931583337261">"ဧည့်သည်"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 1ab840c10709..8dfa9a1a0273 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Legg til en gjest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gjesten"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gjest"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 7c6785b81de5..42ef1627c430 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ताररहित प्रदर्शन प्रमाणीकरणका लागि विकल्पहरू देखाउनुहोस्"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi लग स्तर बढाउनुहोस्, Wi-Fi चयनकर्तामा प्रति SSID RSSI देखाइन्छ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ब्याट्रीको खपत कम गरी नेटवर्कको कार्यसम्पादनमा सुधार गर्दछ"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"यो मोड अन गरिएका बेला यो यन्त्र MAC ठेगाना बदल्ने सुविधा अन गरिएको कुनै इन्टरनेटसँग जति पटक कनेक्ट हुन्छ त्यति नै पटक यस यन्त्रको MAC ठेगाना पनि परिवर्तन हुन सक्छ।"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"सशुल्क वाइफाइ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"मिटर नगरिएको"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"लगर बफर आकारहरू"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"अतिथि थप्नुहोस्"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"अतिथि हटाउनुहोस्"</string> <string name="guest_nickname" msgid="6332276931583337261">"अतिथि"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 417cd95bcf16..63916908033d 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Gast toevoegen"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Gast verwijderen"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gast"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Apparaatstandaard"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Uitgeschakeld"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ingeschakeld"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 74c14779b77b..aea13b5cb444 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"ଅଜଣା"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"ଉପଯୋଗକର୍ତ୍ତା: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"କିଛି ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ ମାନ ସେଟ୍ ହୋଇଛି"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"କୌଣସି ପୂର୍ବ-ନିର୍ଦ୍ଧାରଣ ସେଟ୍ ହୋଇନାହିଁ"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"କୌଣସି ଡିଫଲ୍ଟ ସେଟ୍ ହୋଇନାହିଁ"</string> <string name="tts_settings" msgid="8130616705989351312">"ଟେକ୍ସଟ-ରୁ-ସ୍ପିଚ୍ ସେଟିଂସ୍"</string> <string name="tts_settings_title" msgid="7602210956640483039">"ଟେକ୍ସଟ-ରୁ-ସ୍ପିଚ୍ ଆଉଟପୁଟ୍"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"ସ୍ପିଚ୍ ରେଟ୍"</string> @@ -203,9 +203,9 @@ <string name="vpn_settings_not_available" msgid="2894137119965668920">"VPN ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନୁହେଁ"</string> <string name="tethering_settings_not_available" msgid="266821736434699780">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଟିଥରିଙ୍ଗ ସେଟିଙ୍ଗ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="apn_settings_not_available" msgid="1147111671403342300">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ନାମର ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନାହିଁ"</string> - <string name="enable_adb" msgid="8072776357237289039">"USB ଡିବଗ୍ ହେଉଛି"</string> + <string name="enable_adb" msgid="8072776357237289039">"USB ଡିବଗିଂ"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"USB ସଂଯୁକ୍ତ ହେବାବେଳେ ଡିବଗ୍ ମୋଡ୍"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"USB ଡିବଗିଙ୍ଗ ଅଧିକାରକୁ କାଢ଼ିଦିଅନ୍ତୁ"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"USB ଡିବଗିଂ ଅଧିକାରକୁ ବାତିଲ୍ କରନ୍ତୁ"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"ୱାୟାରଲେସ୍ ଡିବଗିଂ"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"ୱାଇ-ଫାଇ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଡିବଗ୍ ମୋଡ୍"</string> <string name="adb_wireless_error" msgid="721958772149779856">"ତ୍ରୁଟି"</string> @@ -222,7 +222,7 @@ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"ଡିଭାଇସ୍ ଫିଙ୍ଗରପ୍ରିଣ୍ଟ: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string> <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"ସଂଯୋଗ ବିଫଳ ହେଲା"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଫୋନ୍ ନେଟୱାର୍କ ସହ ସଂଯୁକ୍ତ ଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ"</string> - <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"ଡିଭାଇସରୁ ପେୟାର୍ କରନ୍ତୁ"</string> + <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"ଡିଭାଇସରେ ପେୟାର୍ କରନ୍ତୁ"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"ୱାଇ-ଫାଇ ପେୟାରିଂ କୋଡ୍"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"ପେୟାରିଂ ବିଫଳ ହେଲା"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"ଡିଭାଇସଟି ସମାନ ନେଟୱାର୍କରେ ସଂଯୋଗ ହୋଇଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ।"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"ୱେୟାରଲେସ୍ ଡିସ୍ପ୍ଲେ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପ ଦେଖାନ୍ତୁ"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ବ୍ୟାଟେରୀ ଖର୍ଚ୍ଚ କମ୍ ଏବଂ ନେଟ୍ୱାର୍କ କାର୍ଯ୍ୟକ୍ଷମତା ଉନ୍ନତ କରିଥାଏ"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"ଯେତେବେଳେ ଏହି ମୋଡ୍ ସକ୍ଷମ ହୁଏ, ପ୍ରତ୍ୟେକ ଥର MAC ରେଣ୍ଡୋମାଇଜେସନ୍ ସକ୍ଷମ ଥିବା କୌଣସି ନେଟୱାର୍କ ସହ ଏହି ଡିଭାଇସ୍ ସଂଯୋଗ ହେଲେ ଏହାର MAC ଠିକଣା ବଦଳିପାରେ।"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"ମପାଯାଉଥିବା"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ମପାଯାଉନଥିବା"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ଲଗର୍ ବଫର୍ ସାଇଜ୍"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ଅତିଥି ଯୋଗ କରନ୍ତୁ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ଅତିଥିଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="guest_nickname" msgid="6332276931583337261">"ଅତିଥି"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 68cc06109906..b502f3fa25e6 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ਮਹਿਮਾਨ ਹਟਾਓ"</string> <string name="guest_nickname" msgid="6332276931583337261">"ਮਹਿਮਾਨ"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 9db0f5e9b2ea..cdcb651aee83 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -195,7 +195,7 @@ </string-array> <string name="choose_profile" msgid="343803890897657450">"Wybierz profil"</string> <string name="category_personal" msgid="6236798763159385225">"Osobiste"</string> - <string name="category_work" msgid="4014193632325996115">"Służbowe"</string> + <string name="category_work" msgid="4014193632325996115">"Do pracy"</string> <string name="development_settings_title" msgid="140296922921597393">"Opcje programistyczne"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Włącz opcje dla programistów"</string> <string name="development_settings_summary" msgid="8718917813868735095">"Ustaw opcje związane z programowaniem aplikacji."</string> @@ -551,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gościa"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Usuń gościa"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gość"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index b33b2b510384..d685802a1509 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -223,7 +223,7 @@ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Falha na conexão"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Verifique se o <xliff:g id="DEVICE_NAME">%1$s</xliff:g> está conectado à rede correta"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Parear com o dispositivo"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de pareamento de Wi‑Fi"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de pareamento por Wi‑Fi"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Falha no pareamento"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Verifique se o dispositivo está conectado à mesma rede."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Padrão do dispositivo"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativado"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativado"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 36b84681ae44..ca808b9aab70 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Predefinição do dispositivo"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativada"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativada"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reiniciar o dispositivo para aplicar esta alteração. Reinicie agora ou cancele."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index b33b2b510384..d685802a1509 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -223,7 +223,7 @@ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Falha na conexão"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Verifique se o <xliff:g id="DEVICE_NAME">%1$s</xliff:g> está conectado à rede correta"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Parear com o dispositivo"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de pareamento de Wi‑Fi"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Código de pareamento por Wi‑Fi"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Falha no pareamento"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Verifique se o dispositivo está conectado à mesma rede."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Parear dispositivo na rede Wi‑Fi fazendo a leitura do código QR"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string> <string name="guest_nickname" msgid="6332276931583337261">"Convidado"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Padrão do dispositivo"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Desativado"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Ativado"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index e784873c3f43..5954d7412c44 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Adăugați un invitat"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ștergeți invitatul"</string> <string name="guest_nickname" msgid="6332276931583337261">"Invitat"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index bdda5ee5b0ee..22b8b25645c8 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -551,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Добавить аккаунт гостя"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Удалить аккаунт гостя"</string> <string name="guest_nickname" msgid="6332276931583337261">"Гость"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index ba710e29e1b1..26677f7ef285 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"අමුත්තා එක් කරන්න"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"අමුත්තා ඉවත් කරන්න"</string> <string name="guest_nickname" msgid="6332276931583337261">"අමුත්තා"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 5abba6ff9405..53c2eb087191 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -211,9 +211,9 @@ <string name="adb_wireless_error" msgid="721958772149779856">"Chyba"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Bezdrôtové ladenie"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Ak chcete zobraziť a používať dostupné zariadenia, zapnite bezdrôtové ladenie"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Spárovať zariadenie pomocou QR kódu"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Spárovať zariadenie QR kódom"</string> <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Spárujte nové zariadenia pomocou skenera QR kódov"</string> - <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Spárovať zariadenie pomocou párovacieho kódu"</string> + <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Spárovať zariadenie párovacím kódom"</string> <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Spárujte nové zariadenia pomocou šesťmiestneho kódu"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"Spárované zariadenia"</string> <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Aktuálne pripojené"</string> @@ -226,15 +226,15 @@ <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Párovací kód siete Wi-Fi"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Párovanie zlyhalo"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Skontrolujte, či je zariadenie pripojené k rovnakej sieti."</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Spárujte zariadenie cez sieť Wi-Fi naskenovaním QR kódu"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Spárujte zariadenie cez Wi-Fi naskenovaním QR kódu"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Páruje sa zariadenie…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Zariadenie sa nepodarilo spárovať. Buď bol QR kód nesprávny, alebo zariadenie nie je pripojené k rovnakej sieti."</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Adresa IP a port"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Naskenujte QR kód"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Spárujte zariadenie cez sieť Wi-Fi naskenovaním QR kódu"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Spárujte zariadenie cez Wi-Fi naskenovaním QR kódu"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Pripojte sa k sieti Wi‑Fi"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, ladenie, dev"</string> - <string name="bugreport_in_power" msgid="8664089072534638709">"Skratka hlásenia chyby"</string> + <string name="bugreport_in_power" msgid="8664089072534638709">"Odkaz na hlásenie chyby"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"Zobraziť v hlavnej ponuke tlačidlo na vytvorenie hlásenia chyby"</string> <string name="keep_screen_on" msgid="1187161672348797558">"Nevypínať obrazovku"</string> <string name="keep_screen_on_summary" msgid="1510731514101925829">"Obrazovka sa pri nabíjaní neprepne do režimu spánku"</string> @@ -551,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Pridať hosťa"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string> <string name="guest_nickname" msgid="6332276931583337261">"Hosť"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index b0c61177f223..38ca86ace5fe 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -72,14 +72,14 @@ <string name="bluetooth_connected_no_a2dp" msgid="8566874395813947092">"Povezano (brez predstavnosti) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_map" msgid="3381860077002724689">"Povezano (brez dostopa do sporočil) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2893204819854215433">"Povezano (brez telefona/predstavnosti) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> - <string name="bluetooth_connected_battery_level" msgid="5410325759372259950">"Povezano, raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> - <string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (brez telefona), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> - <string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (brez predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> - <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> - <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivna, akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> - <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> + <string name="bluetooth_connected_battery_level" msgid="5410325759372259950">"Povezano, raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> + <string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Povezano (brez telefona), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> + <string name="bluetooth_connected_no_a2dp_battery_level" msgid="6499078454894324287">"Povezano (brez predstavnosti), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> + <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="8477440576953067242">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> + <string name="bluetooth_active_battery_level" msgid="3450745316700494425">"Aktivna, baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_active_battery_level_untethered" msgid="2706188607604205362">"Aktivno, L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_battery_level" msgid="2893696778200201555">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> - <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> + <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, D: napolnjenost baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktivna"</string> <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvok predstavnosti"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonski klici"</string> @@ -129,8 +129,8 @@ <string name="bluetooth_talkback_bluetooth" msgid="1143241359781999989">"Bluetooth"</string> <string name="bluetooth_hearingaid_left_pairing_message" msgid="8561855779703533591">"Seznanjanje z levim slušnim pripomočkom …"</string> <string name="bluetooth_hearingaid_right_pairing_message" msgid="2655347721696331048">"Seznanjanje z desnim slušnim pripomočkom …"</string> - <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"Levi – akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> - <string name="bluetooth_hearingaid_right_battery_level" msgid="1850094448499089312">"Desni – akumulator na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_hearingaid_left_battery_level" msgid="7375621694748104876">"Levi – baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> + <string name="bluetooth_hearingaid_right_battery_level" msgid="1850094448499089312">"Desni – baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="accessibility_wifi_off" msgid="1195445715254137155">"Wi-Fi je izklopljen."</string> <string name="accessibility_no_wifi" msgid="5297119459491085771">"Povezava Wi-Fi je prekinjena."</string> <string name="accessibility_wifi_one_bar" msgid="6025652717281815212">"Ena črtica signala Wi-Fi."</string> @@ -283,9 +283,8 @@ <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"Povezave ni bilo mogoče vzpostaviti"</string> <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Pokaži možnosti za potrdilo brezžičnega zaslona"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Povečaj raven zapisovanja dnevnika za Wi-Fi; v izbirniku Wi‑Fi-ja pokaži glede na SSID RSSI"</string> - <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmanjša porabo energije akumulatorja in izboljša delovanje omrežja"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zmanjša porabo energije baterije in izboljša delovanje omrežja"</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Ko je ta način omogočen, se lahko naslov MAC te naprave spremeni vsakič, ko se naprava poveže v omrežje z omogočenim naključnim dodeljevanjem naslova MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Omejen prenos podatkov"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Z neomejenim prenosom podatkov"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Velikosti medpomnilnikov zapisovalnika dnevnika"</string> @@ -552,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Dodajanje gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odstranitev gosta"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gost"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 71f62d437361..17d2d502d386 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Shfaq opsionet për certifikimin e ekranit valor"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Rrit nivelin regjistrues të Wi‑Fi duke shfaqur SSID RSSI-në te Zgjedhësi i Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Zvogëlon shkarkimin e baterisë dhe përmirëson cilësinë e funksionimit të rrjetit"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Kur ky modalitet është i aktivizuar, adresa MAC e kësaj pajisjeje mund të ndryshojë çdo herë që lidhet me një rrjet që ka të aktivizuar renditjen e rastësishme të adresave MAC."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Me matje"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Pa matje"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Madhësitë e regjistruesit"</string> @@ -550,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Shto të ftuar"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Hiq të ftuarin"</string> <string name="guest_nickname" msgid="6332276931583337261">"I ftuar"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Parazgjedhja e pajisjes"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Joaktiv"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Aktiv"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Pajisja jote duhet të riniset që ky ndryshim të zbatohet. Rinise tani ose anuloje."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 15df19c81e0f..ca15c2d0712c 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -143,11 +143,11 @@ <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Уклоњене апликације"</string> <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Уклоњене апликације и корисници"</string> <string name="data_usage_ota" msgid="7984667793701597001">"Ажурирања система"</string> - <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB Интернет повезивање"</string> + <string name="tether_settings_title_usb" msgid="3728686573430917722">"USB привезивање"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Преносни хотспот"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth привезивање"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Повезивање са интернетом"</string> - <string name="tether_settings_title_all" msgid="8910259483383010470">"Повезивање и преносни хотспот"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Привезивање"</string> + <string name="tether_settings_title_all" msgid="8910259483383010470">"Привезивање и преносни хотспот"</string> <string name="managed_user_title" msgid="449081789742645723">"Све радне апликације"</string> <string name="user_guest" msgid="6939192779649870792">"Гост"</string> <string name="unknown" msgid="3544487229740637809">"Непознато"</string> @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Додај госта"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Уклони госта"</string> <string name="guest_nickname" msgid="6332276931583337261">"Гост"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 6b1a63c5b819..ee48c2f84df1 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Lägg till gäst"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ta bort gäst"</string> <string name="guest_nickname" msgid="6332276931583337261">"Gäst"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index e041bea1867a..7df39d5ded33 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -224,7 +224,7 @@ <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Hakikisha kuwa <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kimeunganishwa kwenye mtandao sahihi"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Oanisha na kifaa"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Msimbo wa kuoanisha wa Wi-Fi"</string> - <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Imeshindwa kuunganisha"</string> + <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Imeshindwa kuoanisha"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Hakikisha kuwa kifaa kimeunganishwa kwenye mtandao mmoja."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Oanisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Inaoanisha kifaa…"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Weka mgeni"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ondoa mgeni"</string> <string name="guest_nickname" msgid="6332276931583337261">"Mgeni"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Hali chaguomsingi ya kifaa"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Imezimwa"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Imewashwa"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Ni lazima uwashe tena kifaa chako ili mabadiliko haya yatekelezwe. Washa tena sasa au ughairi."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index d403858d000a..eb7fc05bd52c 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -550,4 +550,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"கெஸ்ட்டைச் சேர்"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string> <string name="guest_nickname" msgid="6332276931583337261">"கெஸ்ட்"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 3c8650922d6a..0e36c5fe53cf 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -153,7 +153,7 @@ <string name="unknown" msgid="3544487229740637809">"తెలియదు"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"వినియోగదారు: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"కొన్ని డిఫాల్ట్లు సెట్ చేయబడ్డాయి"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"డిఫాల్ట్లు ఏవీ సెట్ చేయబడలేదు"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"ఆటోమేటిక్ ఆప్షన్లు వేటినీ సెట్ చేయలేదు"</string> <string name="tts_settings" msgid="8130616705989351312">"వచనం నుండి ప్రసంగం సెట్టింగ్లు"</string> <string name="tts_settings_title" msgid="7602210956640483039">"వచనం నుండి మాట అవుట్పుట్"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"ప్రసంగం రేట్"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి & నెట్వర్క్ పనితీరును మెరుగుపరుస్తుంది"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"ఈ మోడ్ ఎనేబుల్ అయ్యాక, MAC ర్యాండమైజేషన్ను ఎనేబుల్ చేసిన నెట్వర్క్తో కనెక్ట్ అయ్యే ప్రతిసారీ ఈ పరికరం MAC అడ్రస్ మారవచ్చు."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"గణించబడుతోంది"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"గణించబడటం లేదు"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"లాగర్ బఫర్ పరిమాణాలు"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"అతిథిని జోడించండి"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"అతిథిని తీసివేయండి"</string> <string name="guest_nickname" msgid="6332276931583337261">"అతిథి"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 2e809c243495..b4e1eea8ff35 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -205,7 +205,7 @@ <string name="apn_settings_not_available" msgid="1147111671403342300">"การตั้งค่าจุดเข้าใช้งานไม่สามารถใช้ได้สำหรับผู้ใช้รายนี้"</string> <string name="enable_adb" msgid="8072776357237289039">"การแก้ไขข้อบกพร่อง USB"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"โหมดแก้ไขข้อบกพร่องเมื่อเชื่อมต่อ USB"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"ยกเลิกการให้สิทธิ์การแก้ปัญหา USB"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"เพิกถอนการให้สิทธิ์การแก้ไขข้อบกพร่อง USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"การแก้ไขข้อบกพร่องผ่าน Wi-Fi"</string> <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"โหมดแก้ไขข้อบกพร่องเมื่อเชื่อมต่อ Wi-Fi"</string> <string name="adb_wireless_error" msgid="721958772149779856">"ข้อผิดพลาด"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"แสดงตัวเลือกสำหรับการรับรองการแสดงผล แบบไร้สาย"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"เพิ่มระดับการบันทึก Wi‑Fi แสดงต่อ SSID RSSI ในตัวเลือก Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"ลดการเปลืองแบตเตอรี่และเพิ่มประสิทธิภาพเครือข่าย"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"เมื่อเปิดใช้โหมดนี้ ที่อยู่ MAC ของอุปกรณ์นี้อาจเปลี่ยนทุกครั้งที่เชื่อมต่อกับเครือข่ายที่มีการเปิดใช้การสุ่ม MAC"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"ไม่มีการวัดปริมาณอินเทอร์เน็ต"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"ขนาดบัฟเฟอร์ของตัวบันทึก"</string> @@ -360,7 +359,7 @@ <string name="track_frame_time" msgid="522674651937771106">"การแสดงผล HWUI ตามโปรไฟล์"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"เปิดใช้เลเยอร์การแก้ไขข้อบกพร่อง GPU"</string> <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"อนุญาตให้โหลดเลเยอร์การแก้ไขข้อบกพร่อง GPU สำหรับแอปแก้ไขข้อบกพร่อง"</string> - <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"เปิดบันทึกเวนเดอร์เพิ่มเติม"</string> + <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"เปิดการบันทึกเวนเดอร์แบบละเอียด"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"รวมบันทึกเวนเดอร์เพิ่มเติมเฉพาะอุปกรณ์ไว้ในรายงานข้อบกพร่อง ซึ่งอาจมีข้อมูลส่วนตัว ใช้แบตเตอรี่มากขึ้น และ/หรือใช้พื้นที่เก็บข้อมูลมากขึ้น"</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"อัตราการเคลื่อนไหวของหน้าต่าง"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"อัตราการเคลื่อนไหวของการเปลี่ยนภาพ"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"เพิ่มผู้เข้าร่วม"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้เข้าร่วมออก"</string> <string name="guest_nickname" msgid="6332276931583337261">"ผู้ใช้ชั่วคราว"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 69b94ef09d1a..22ad220a02d4 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Ipakita ang mga opsyon para sa certification ng wireless display"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Pataasin ang antas ng Wi‑Fi logging, ipakita sa bawat SSID RSSI sa Wi‑Fi Picker"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Binabawasan ang pagkaubos ng baterya at pinapahusay ang performance ng network"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Kapag naka-enable ang mode na ito, puwedeng magbago ang MAC address ng device na ito sa tuwing kokonekta ito sa isang network na may naka-enable na MAC randomization."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Nakametro"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Hindi Nakametro"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Mga laki ng buffer ng Logger"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Magdagdag ng bisita"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Alisin ang bisita"</string> <string name="guest_nickname" msgid="6332276931583337261">"Bisita"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 6c714207cd28..daa3eed7424f 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Misafir ekle"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Misafir oturumunu kaldır"</string> <string name="guest_nickname" msgid="6332276931583337261">"Misafir"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Cihaz varsayılanı"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Devre dışı"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Etkin"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Bu değişikliğin geçerli olması için cihazının yeniden başlatılması gerekir. Şimdi yeniden başlatın veya iptal edin."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 174f6fa1409f..442c52ed66a7 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -551,4 +551,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Додати гостя"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Видалити гостя"</string> <string name="guest_nickname" msgid="6332276931583337261">"Гість"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 4ad4ddba49e8..463c1617b1a6 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"وائرلیس ڈسپلے سرٹیفیکیشن کیلئے اختیارات دکھائیں"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi لاگنگ لیول میں اضافہ کریں، Wi‑Fi منتخب کنندہ میں فی SSID RSSI دکھائیں"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"بیٹری ڈرین کم کرتا ہے اور نیٹ ورک کارکردگی کو بہتر بناتا ہے"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"جب یہ وضع فعال ہوتا ہے تو، اس آلہ کا MAC پتہ ہر بار تبدیل ہو سکتا ہے جب یہ کسی نیٹ ورک سے منسلک ہوتا ہے جس میں MAC ہے رینڈمائزیشن کو فعال کرتا ہے۔"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"میٹرڈ"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"غیر میٹر شدہ"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"لاگر بفر کے سائز"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"مہمان کو شامل کریں"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string> <string name="guest_nickname" msgid="6332276931583337261">"مہمان"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 80f415748727..762a246a4453 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -148,12 +148,12 @@ <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Bluetooth modem"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Modem"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"Modem rejimi"</string> - <string name="managed_user_title" msgid="449081789742645723">"Barcha ishchi ilovalar"</string> + <string name="managed_user_title" msgid="449081789742645723">"Barcha ishga oid ilovalar"</string> <string name="user_guest" msgid="6939192779649870792">"Mehmon"</string> <string name="unknown" msgid="3544487229740637809">"Noma’lum"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"Foydalanuvchi: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="3631650616557252926">"Ba’zi birlamchi sozlamalar o‘rnatilgan"</string> - <string name="launch_defaults_none" msgid="8049374306261262709">"Birlamchi sozlamalar o‘rnatilmagan"</string> + <string name="launch_defaults_none" msgid="8049374306261262709">"Birlamchi sozlamalar belgilanmagan"</string> <string name="tts_settings" msgid="8130616705989351312">"Nutq sintezi sozlamalari"</string> <string name="tts_settings_title" msgid="7602210956640483039">"Nutq sintezi"</string> <string name="tts_default_rate_title" msgid="3964187817364304022">"Nutq tezligi"</string> @@ -284,7 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Simsiz monitorlarni sertifikatlash parametrini ko‘rsatish"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi-Fi ulanishini tanlashda har bir SSID uchun jurnalda ko‘rsatilsin"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Batareya sarfini tejaydi va tarmoq samaradorligini oshiradi"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Bu rejim yoqilganda qurilmaning MAC manzili tasodifiy MAC manzillar yaratish imkoniyatli tarmoqqa har safar ulanganda almashishi mumkin."</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Bu rejim yoqilganda qurilmaning MAC manzili tasodifiy MAC manzillar yaratish imkoniyati mavjud tarmoqqa har safar ulanganda almashishi mumkin."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Trafik hisoblanadigan tarmoq"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Trafik hisobi yuritilmaydigan tarmoq"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Jurnal buferi hajmi"</string> @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Mehmon kiritish"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Mehmon rejimini olib tashlash"</string> <string name="guest_nickname" msgid="6332276931583337261">"Mehmon"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Qurilma standarti"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Yoqilmagan"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Yoniq"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Oʻzgarishlar qurilma oʻchib yonganda bajariladi. Hoziroq oʻchib yoqish yoki bekor qilish."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index fcfbb02b299c..4f93fe366956 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -205,9 +205,9 @@ <string name="apn_settings_not_available" msgid="1147111671403342300">"Cài đặt tên điểm truy cập không khả dụng cho người dùng này"</string> <string name="enable_adb" msgid="8072776357237289039">"Gỡ lỗi qua USB"</string> <string name="enable_adb_summary" msgid="3711526030096574316">"Bật chế độ gỡ lỗi khi kết nối USB"</string> - <string name="clear_adb_keys" msgid="3010148733140369917">"Thu hồi ủy quyền gỡ lỗi USB"</string> + <string name="clear_adb_keys" msgid="3010148733140369917">"Thu hồi các lượt ủy quyền gỡ lỗi qua USB"</string> <string name="enable_adb_wireless" msgid="6973226350963971018">"Gỡ lỗi qua Wi-Fi"</string> - <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Chế độ gỡ lỗi khi có kết nối Wi-Fi"</string> + <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Bật chế độ gỡ lỗi khi có kết nối Wi-Fi"</string> <string name="adb_wireless_error" msgid="721958772149779856">"Lỗi"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"Gỡ lỗi qua Wi-Fi"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Để xem và sử dụng các thiết bị có sẵn, hãy bật tính năng gỡ lỗi qua Wi-Fi"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"Hiển thị tùy chọn chứng nhận hiển thị không dây"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Tăng mức ghi nhật ký Wi‑Fi, hiển thị mỗi SSID RSSI trong bộ chọn Wi‑Fi"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Giảm hao pin và cải thiện hiệu suất mạng"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Khi bật chế độ này, địa chỉ MAC của thiết bị này có thể thay đổi mỗi lần thiết bị kết nối với mạng đã bật tính năng sử dụng địa chỉ MAC ngẫu nhiên."</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Đo lượng dữ liệu"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Không đo lượng dữ liệu"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Kích thước bộ đệm của trình ghi nhật ký"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Thêm khách"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Xóa phiên khách"</string> <string name="guest_nickname" msgid="6332276931583337261">"Khách"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 58d12afc34f6..3d8b6d7b9c5c 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -225,7 +225,7 @@ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"与设备配对"</string> <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"WLAN 配对码"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"配对失败"</string> - <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"确保设备已连接到同一网络。"</string> + <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"请确保设备已连接到同一网络。"</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"扫描二维码即可通过 WLAN 配对设备"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"正在配对设备…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"无法配对设备。可能是因为二维码不正确,或者设备未连接到同一网络。"</string> @@ -284,8 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"显示无线显示认证选项"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"提升 WLAN 日志记录级别(在 WLAN 选择器中显示每个 SSID 的 RSSI)"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"降低耗电量以及改善网络性能"</string> - <!-- no translation found for wifi_enhanced_mac_randomization_summary (1210663439867489931) --> - <skip /> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"启用此模式后,每当此设备连接到已启用随机分配 MAC 地址功能的网络时,它的 MAC 地址就可能会发生更改。"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"按流量计费"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"不按流量计费"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"日志记录器缓冲区大小"</string> @@ -550,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"添加访客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除访客"</string> <string name="guest_nickname" msgid="6332276931583337261">"访客"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 33969938ad42..b4905c7ecbba 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -23,7 +23,7 @@ <string name="wifi_fail_to_scan" msgid="2333336097603822490">"無法掃瞄網絡"</string> <string name="wifi_security_none" msgid="7392696451280611452">"無"</string> <string name="wifi_remembered" msgid="3266709779723179188">"已儲存"</string> - <string name="wifi_disconnected" msgid="7054450256284661757">"已解除連接"</string> + <string name="wifi_disconnected" msgid="7054450256284661757">"已中斷連線"</string> <string name="wifi_disabled_generic" msgid="2651916945380294607">"已停用"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP 設定失敗"</string> <string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"網絡品質欠佳,因此無法連線"</string> @@ -284,7 +284,7 @@ <string name="wifi_display_certification_summary" msgid="8111151348106907513">"顯示無線螢幕分享認證的選項"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"讓 Wi‑Fi 記錄功能升級,在 Wi‑Fi 選擇器中依每個 SSID RSSI 顯示 Wi‑Fi 詳細紀錄"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"減低耗電量並改善網絡表現"</string> - <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"啟用這個模式後,每次連線到啟用了 MAC 隨機化的網路時,這部裝置的 MAC 位址都可能會有所變更。"</string> + <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"啟用此模式後,每次連接至已啟用 MAC 隨機處理的網絡時,此裝置的 MAC 位址都可能會變更。"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"按用量收費"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"不限數據用量收費"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"記錄器緩衝區空間"</string> @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string> <string name="guest_nickname" msgid="6332276931583337261">"訪客"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index dfebe81383f1..9a3f2f94c8ed 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -549,4 +549,14 @@ <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string> <string name="guest_nickname" msgid="6332276931583337261">"訪客"</string> + <!-- no translation found for cached_apps_freezer_device_default (2616594131750144342) --> + <skip /> + <!-- no translation found for cached_apps_freezer_disabled (4816382260660472042) --> + <skip /> + <!-- no translation found for cached_apps_freezer_enabled (8866703500183051546) --> + <skip /> + <!-- no translation found for cached_apps_freezer_reboot_dialog_text (695330563489230096) --> + <skip /> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 45cd737c8c73..86698f4134f0 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -549,4 +549,10 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Engeza isivakashi"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Susa isihambeli"</string> <string name="guest_nickname" msgid="6332276931583337261">"Isihambeli"</string> + <string name="cached_apps_freezer_device_default" msgid="2616594131750144342">"Idivayisi ezenzakalelayo"</string> + <string name="cached_apps_freezer_disabled" msgid="4816382260660472042">"Ikhutshaziwe"</string> + <string name="cached_apps_freezer_enabled" msgid="8866703500183051546">"Inikwe amandla"</string> + <string name="cached_apps_freezer_reboot_dialog_text" msgid="695330563489230096">"Kufanele idivayisi yakho iqaliswe ukuze lolu shintsho lusebenze. Qalisa manje noma khansela."</string> + <!-- no translation found for accessibility_work_profile_app_description (5470883112342119165) --> + <skip /> </resources> diff --git a/packages/SettingsLib/res/values/arrays.xml b/packages/SettingsLib/res/values/arrays.xml index 7b58937049d1..d59d698efba2 100644 --- a/packages/SettingsLib/res/values/arrays.xml +++ b/packages/SettingsLib/res/values/arrays.xml @@ -633,4 +633,18 @@ <item>@color/bt_color_bg_7</item> </integer-array> + <!-- Cached apps freezer modes --> + <array name="cached_apps_freezer_entries"> + <item>@string/cached_apps_freezer_device_default</item> + <item>@string/cached_apps_freezer_enabled</item> + <item>@string/cached_apps_freezer_disabled</item> + </array> + + <!-- Values for cached apps freezer modes --> + <array name="cached_apps_freezer_values"> + <item>device_default</item> + <item>enabled</item> + <item>disabled</item> + </array> + </resources> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 7ca0e809143a..e42e43801936 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1365,4 +1365,15 @@ <!-- Name for the guest user [CHAR LIMIT=35] --> <string name="guest_nickname">Guest</string> + <!-- List entry in developer settings to choose default device/system behavior for the app freezer [CHAR LIMIT=30]--> + <string name="cached_apps_freezer_device_default">Device default</string> + <!-- List entry in developer settings to disable the app freezer in developer settings [CHAR LIMIT=30]--> + <string name="cached_apps_freezer_disabled">Disabled</string> + <!-- List entry in developer settings to enable the app freezer in developer settings [CHAR LIMIT=30]--> + <string name="cached_apps_freezer_enabled">Enabled</string> + <!-- Developer setting dialog prompting the user to reboot after changing the app freezer setting [CHAR LIMIT=NONE]--> + <string name="cached_apps_freezer_reboot_dialog_text">Your device must be rebooted for this change to apply. Reboot now or cancel.</string> + + <!-- A content description for work profile app [CHAR LIMIT=35] --> + <string name="accessibility_work_profile_app_description">Work <xliff:g id="app_name" example="Camera">%s</xliff:g></string> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java index c4ff71940d20..b1f2a397bde6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/AppUtils.java @@ -26,6 +26,7 @@ import android.hardware.usb.IUsbManager; import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; +import android.os.UserManager; import android.util.Log; import com.android.settingslib.R; @@ -129,7 +130,7 @@ public class AppUtils { */ public static boolean isHiddenSystemModule(Context context, String packageName) { return ApplicationsState.getInstance((Application) context.getApplicationContext()) - .isHiddenModule(packageName); + .isHiddenModule(packageName); } /** @@ -140,4 +141,28 @@ public class AppUtils { .isSystemModule(packageName); } + /** + * Returns a boolean indicating whether a given package is a mainline module. + */ + public static boolean isMainlineModule(Context context, String packageName) { + final PackageManager pm = context.getPackageManager(); + try { + return pm.getModuleInfo(packageName, 0 /* flags */) != null; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + /** + * Returns a content description of an app name which distinguishes a personal app from a + * work app for accessibility purpose. + * If the app is in a work profile, then add a "work" prefix to the app name. + */ + public static String getAppContentDescription(Context context, String packageName, + int userId) { + final CharSequence appLabel = getApplicationLabel(context.getPackageManager(), packageName); + return UserManager.get(context).isManagedProfile(userId) + ? context.getString(R.string.accessibility_work_profile_app_description, appLabel) + : appLabel.toString(); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java index 31ea5b40d756..887a49b95279 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java @@ -27,10 +27,13 @@ import android.util.Log; import androidx.annotation.IntDef; import com.android.internal.annotations.VisibleForTesting; +import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; +import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfile; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -430,7 +433,8 @@ public class LocalMediaManager implements BluetoothCallback { cachedDeviceManager.findDevice(device); if (cachedDevice != null) { if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED - && !cachedDevice.isConnected()) { + && !cachedDevice.isConnected() + && isA2dpOrHearingAidDevice(cachedDevice)) { deviceCount++; cachedBluetoothDeviceList.add(cachedDevice); if (deviceCount >= MAX_DISCONNECTED_DEVICE_NUM) { @@ -454,6 +458,15 @@ public class LocalMediaManager implements BluetoothCallback { return new ArrayList<>(mDisconnectedMediaDevices); } + private boolean isA2dpOrHearingAidDevice(CachedBluetoothDevice device) { + for (LocalBluetoothProfile profile : device.getConnectableProfiles()) { + if (profile instanceof A2dpProfile || profile instanceof HearingAidProfile) { + return true; + } + } + return false; + } + @Override public void onDeviceRemoved(MediaDevice device) { if (mMediaDevices.contains(device)) { diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 34de1528ed9a..139a12c44e0f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -31,18 +31,14 @@ import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import android.content.Context; -import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; import android.text.TextUtils; -import android.util.Log; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; -import com.android.settingslib.R; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -215,30 +211,6 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { * * @return application label. */ - public String getClientAppLabel() { - final String packageName = mRouteInfo.getClientPackageName(); - if (TextUtils.isEmpty(packageName)) { - Log.d(TAG, "Client package name is empty"); - return mContext.getResources().getString(R.string.unknown); - } - try { - final PackageManager packageManager = mContext.getPackageManager(); - final String appLabel = packageManager.getApplicationLabel( - packageManager.getApplicationInfo(packageName, 0)).toString(); - if (!TextUtils.isEmpty(appLabel)) { - return appLabel; - } - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, "unable to find " + packageName); - } - return mContext.getResources().getString(R.string.unknown); - } - - /** - * Get application label from MediaDevice. - * - * @return application label. - */ public int getDeviceType() { return mType; } diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index 42f2542e5c30..8ea5ff1bf662 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -41,7 +41,10 @@ public class PhoneMediaDevice extends MediaDevice { private static final String TAG = "PhoneMediaDevice"; - public static final String ID = "phone_media_device_id_1"; + public static final String PHONE_ID = "phone_media_device_id"; + // For 3.5 mm wired headset + public static final String WIRED_HEADSET_ID = "wired_headset_media_device_id"; + public static final String USB_HEADSET_ID = "usb_headset_media_device_id"; private String mSummary = ""; @@ -109,7 +112,25 @@ public class PhoneMediaDevice extends MediaDevice { @Override public String getId() { - return ID; + String id; + switch (mRouteInfo.getType()) { + case TYPE_WIRED_HEADSET: + case TYPE_WIRED_HEADPHONES: + id = WIRED_HEADSET_ID; + break; + case TYPE_USB_DEVICE: + case TYPE_USB_HEADSET: + case TYPE_USB_ACCESSORY: + case TYPE_DOCK: + case TYPE_HDMI: + id = USB_HEADSET_ID; + break; + case TYPE_BUILTIN_SPEAKER: + default: + id = PHONE_ID; + break; + } + return id; } @Override diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java index 77316e91bae2..365a16c50b99 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java @@ -41,6 +41,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.settingslib.bluetooth.LocalBluetoothProfile; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; import com.android.settingslib.testutils.shadow.ShadowBluetoothAdapter; @@ -560,6 +561,10 @@ public class LocalMediaManagerTest { mLocalMediaManager.mMediaDevices.add(device3); mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice); + final List<LocalBluetoothProfile> profiles = new ArrayList<>(); + final A2dpProfile a2dpProfile = mock(A2dpProfile.class); + profiles.add(a2dpProfile); + final List<BluetoothDevice> bluetoothDevices = new ArrayList<>(); final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); @@ -571,6 +576,7 @@ public class LocalMediaManagerTest { when(cachedManager.findDevice(bluetoothDevice)).thenReturn(cachedDevice); when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(cachedDevice.isConnected()).thenReturn(false); + when(cachedDevice.getConnectableProfiles()).thenReturn(profiles); when(device1.getId()).thenReturn(TEST_DEVICE_ID_1); when(device2.getId()).thenReturn(TEST_DEVICE_ID_2); @@ -634,6 +640,10 @@ public class LocalMediaManagerTest { mLocalMediaManager.mMediaDevices.add(device3); mLocalMediaManager.mMediaDevices.add(mLocalMediaManager.mPhoneDevice); + final List<LocalBluetoothProfile> profiles = new ArrayList<>(); + final A2dpProfile a2dpProfile = mock(A2dpProfile.class); + profiles.add(a2dpProfile); + final List<BluetoothDevice> bluetoothDevices = new ArrayList<>(); final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class); final BluetoothDevice bluetoothDevice2 = mock(BluetoothDevice.class); @@ -662,6 +672,7 @@ public class LocalMediaManagerTest { when(cachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); when(cachedDevice.isConnected()).thenReturn(false); when(cachedDevice.getDevice()).thenReturn(bluetoothDevice); + when(cachedDevice.getConnectableProfiles()).thenReturn(profiles); when(bluetoothDevice.getBluetoothClass()).thenReturn(bluetoothClass); when(bluetoothClass.getDeviceClass()).thenReturn(AUDIO_VIDEO_HEADPHONES); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java index 6664870a6257..47d4beb752c5 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java @@ -29,13 +29,9 @@ import static org.mockito.Mockito.when; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageStats; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; -import com.android.settingslib.R; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.HearingAidProfile; @@ -49,8 +45,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; -import org.robolectric.shadows.ShadowPackageManager; import java.util.ArrayList; import java.util.Collections; @@ -70,8 +64,6 @@ public class MediaDeviceTest { private static final String ROUTER_ID_2 = "RouterId_2"; private static final String ROUTER_ID_3 = "RouterId_3"; private static final String TEST_PACKAGE_NAME = "com.test.playmusic"; - private static final String TEST_PACKAGE_NAME2 = "com.test.playmusic2"; - private static final String TEST_APPLICATION_LABEL = "playmusic"; private final BluetoothClass mHeadreeClass = new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES); private final BluetoothClass mCarkitClass = @@ -125,10 +117,6 @@ public class MediaDeviceTest { private InfoMediaDevice mInfoMediaDevice3; private List<MediaDevice> mMediaDevices = new ArrayList<>(); private PhoneMediaDevice mPhoneMediaDevice; - private ShadowPackageManager mShadowPackageManager; - private ApplicationInfo mAppInfo; - private PackageInfo mPackageInfo; - private PackageStats mPackageStats; @Before public void setUp() { @@ -459,41 +447,6 @@ public class MediaDeviceTest { assertThat(mInfoMediaDevice1.getClientPackageName()).isEqualTo(TEST_PACKAGE_NAME); } - private void initPackage() { - mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager()); - mAppInfo = new ApplicationInfo(); - mAppInfo.flags = ApplicationInfo.FLAG_INSTALLED; - mAppInfo.packageName = TEST_PACKAGE_NAME; - mAppInfo.name = TEST_APPLICATION_LABEL; - mPackageInfo = new PackageInfo(); - mPackageInfo.packageName = TEST_PACKAGE_NAME; - mPackageInfo.applicationInfo = mAppInfo; - mPackageStats = new PackageStats(TEST_PACKAGE_NAME); - } - - @Test - public void getClientAppLabel_matchedPackageName_returnLabel() { - initPackage(); - when(mRouteInfo1.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME); - - assertThat(mInfoMediaDevice1.getClientAppLabel()).isEqualTo( - mContext.getResources().getString(R.string.unknown)); - - mShadowPackageManager.addPackage(mPackageInfo, mPackageStats); - - assertThat(mInfoMediaDevice1.getClientAppLabel()).isEqualTo(TEST_APPLICATION_LABEL); - } - - @Test - public void getClientAppLabel_noMatchedPackageName_returnDefault() { - initPackage(); - mShadowPackageManager.addPackage(mPackageInfo, mPackageStats); - when(mRouteInfo1.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME2); - - assertThat(mInfoMediaDevice1.getClientAppLabel()).isEqualTo( - mContext.getResources().getString(R.string.unknown)); - } - @Test public void setState_verifyGetState() { mInfoMediaDevice1.setState(LocalMediaManager.MediaDeviceState.STATE_CONNECTED); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index 6f265dd603e5..47f6fe3bce02 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -21,6 +21,10 @@ import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; +import static com.android.settingslib.media.PhoneMediaDevice.PHONE_ID; +import static com.android.settingslib.media.PhoneMediaDevice.USB_HEADSET_ID; +import static com.android.settingslib.media.PhoneMediaDevice.WIRED_HEADSET_ID; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; @@ -108,4 +112,22 @@ public class PhoneMediaDeviceTest { assertThat(mPhoneMediaDevice.getName()) .isEqualTo(mContext.getString(R.string.media_transfer_this_device_name)); } + + @Test + public void getId_returnCorrectId() { + when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + + assertThat(mPhoneMediaDevice.getId()) + .isEqualTo(WIRED_HEADSET_ID); + + when(mInfo.getType()).thenReturn(TYPE_USB_DEVICE); + + assertThat(mPhoneMediaDevice.getId()) + .isEqualTo(USB_HEADSET_ID); + + when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); + + assertThat(mPhoneMediaDevice.getId()) + .isEqualTo(PHONE_ID); + } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index a5dce6da348f..3d7559b2c1a6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -376,6 +376,9 @@ class SettingsProtoDumpUtil { Settings.Global.BUGREPORT_IN_POWER_MENU, GlobalSettingsProto.BUGREPORT_IN_POWER_MENU); dumpSetting(s, p, + Settings.Global.CACHED_APPS_FREEZER_ENABLED, + GlobalSettingsProto.CACHED_APPS_FREEZER_ENABLED); + dumpSetting(s, p, Settings.Global.CALL_AUTO_RETRY, GlobalSettingsProto.CALL_AUTO_RETRY); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index be0a8640760f..29c31eaddfa6 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -264,6 +264,7 @@ public class SettingsBackupTest { Settings.Global.ENABLE_DELETION_HELPER_NO_THRESHOLD_TOGGLE, Settings.Global.ENABLE_DISKSTATS_LOGGING, Settings.Global.ENABLE_EPHEMERAL_FEATURE, + Settings.Global.ENABLE_RESTRICTED_BUCKET, Settings.Global.DYNAMIC_POWER_SAVINGS_ENABLED, Settings.Global.DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD, Settings.Global.SMART_REPLIES_IN_NOTIFICATIONS_FLAGS, @@ -587,7 +588,8 @@ public class SettingsBackupTest { Settings.Global.POWER_BUTTON_VERY_LONG_PRESS, Settings.Global.SHOW_MEDIA_ON_QUICK_SETTINGS, // Temporary for R beta Settings.Global.INTEGRITY_CHECK_INCLUDES_RULE_PROVIDER, - Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT); + Settings.Global.ADVANCED_BATTERY_USAGE_AMOUNT, + Settings.Global.CACHED_APPS_FREEZER_ENABLED); private static final Set<String> BACKUP_BLACKLISTED_SECURE_SETTINGS = newHashSet( diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 4771c4139a5b..8f05e78555f3 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -291,6 +291,9 @@ <uses-permission android:name="android.permission.ACCESS_TV_TUNER" /> <uses-permission android:name="android.permission.TUNER_RESOURCE_ACCESS" /> + <!-- Permissions required for CTS test - AutoRevokeTest --> + <uses-permission android:name="android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS" /> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/Shell/res/values-cs/strings.xml b/packages/Shell/res/values-cs/strings.xml index 7893ab5298cb..ab031a4e0f28 100644 --- a/packages/Shell/res/values-cs/strings.xml +++ b/packages/Shell/res/values-cs/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"Přejetím můžete zprávu o chybě sdílet bez snímku obrazovky, nebo vyčkejte, než se snímek připraví"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Klepnutím můžete zprávu o chybě sdílet bez snímku obrazovky, nebo vyčkejte, než se snímek připraví"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Klepnutím můžete zprávu o chybě sdílet bez snímku obrazovky, nebo vyčkejte, než se snímek připraví"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"Zprávy o chybách obsahují data z různých souborů protokolů systému a mohou zahrnovat data, která považujete za citlivá (například informace o využití aplikací a údaje o poloze).Chybová hlášení sdílejte pouze s lidmi a aplikacemi, kterým důvěřujete."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"Zprávy o chybách obsahují data z různých souborů protokolů systému a mohou zahrnovat data, která považujete za citlivá (například informace o využití aplikací a údaje o poloze). Chybová hlášení sdílejte pouze s lidmi a aplikacemi, kterým důvěřujete."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Tuto zprávu příště nezobrazovat"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Zprávy o chybách"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Soubor chybové zprávy nelze načíst"</string> diff --git a/packages/Shell/res/values-es/strings.xml b/packages/Shell/res/values-es/strings.xml index fe5ef9c41d91..223d1676e761 100644 --- a/packages/Shell/res/values-es/strings.xml +++ b/packages/Shell/res/values-es/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Toca para compartir el informe de errores sin captura de pantalla o espera a que se haga la captura."</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Los informes de errores contienen datos de los distintos archivos de registro del sistema, que pueden incluir información confidencial (como los datos de uso de las aplicaciones o los de ubicación). Comparte los informes de errores únicamente con usuarios y aplicaciones en los que confíes."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"No volver a mostrar"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de error"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de errores"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"No se ha podido leer el archivo del informe de errores"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"No se han podido añadir los detalles del informe de errores al archivo ZIP"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"sin nombre"</string> diff --git a/packages/Shell/res/values-gu/strings.xml b/packages/Shell/res/values-gu/strings.xml index 5c25e9321c82..e98e11be264a 100644 --- a/packages/Shell/res/values-gu/strings.xml +++ b/packages/Shell/res/values-gu/strings.xml @@ -28,9 +28,9 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"સ્ક્રીનશૉટ વિના કે સ્ક્રીનશૉટ પૂરો થાય ત્યાં સુધી રાહ જોયા વિના બગ રિપોર્ટ શેર કરવાનું પસંદ કરો"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"સ્ક્રીનશૉટ વગર અથવા સ્ક્રીનશૉટ સમાપ્ત થવાની રાહ જોયા વગર તમારી બગ રિપોર્ટ શેર કરવા ટૅપ કરો"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"સ્ક્રીનશૉટ વગર અથવા સ્ક્રીનશૉટ સમાપ્ત થવાની રાહ જોયા વગર તમારી બગ રિપોર્ટ શેર કરવા ટૅપ કરો"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"બગ રિપોર્ટ્સ સિસ્ટમની વિભિન્ન લૉગ ફાઇલોનો ડેટા ધરાવે છે, જેમાં તે ડેટા શામેલ હોઈ શકે છે જેને તમે સંવેદી ગણો છો (જેમ કે ઍપ્લિકેશન-વપરાશ અને સ્થાન ડેટા). બગ રિપોર્ટ્સ ફક્ત તમે વિશ્વાસ કરતા હો તે ઍપ્લિકેશનો અને લોકો સાથે જ શેર કરો."</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"બગ રિપોર્ટ સિસ્ટમની વિભિન્ન લૉગ ફાઇલોનો ડેટા ધરાવે છે, જેમાં તે ડેટા શામેલ હોઈ શકે છે જેને તમે સંવેદી ગણો છો (જેમ કે ઍપ્લિકેશન-વપરાશ અને સ્થાન ડેટા). બગ રિપોર્ટ ફક્ત તમે વિશ્વાસ કરતા હો તે ઍપ્લિકેશનો અને લોકો સાથે જ શેર કરો."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ફરી બતાવશો નહીં"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"બગ રિપોર્ટ્સ"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"બગ રિપોર્ટ"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"બગ રીપોર્ટ ફાઇલ વાંચી શકાઇ નથી"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"ZIP ફાઇલમાં બગ રિપોર્ટની વિગતો ઉમેરી શકાઈ નથી"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"અનામાંકિત"</string> diff --git a/packages/Shell/res/values-nl/strings.xml b/packages/Shell/res/values-nl/strings.xml index 00669eaf1a05..3868f4a27021 100644 --- a/packages/Shell/res/values-nl/strings.xml +++ b/packages/Shell/res/values-nl/strings.xml @@ -30,7 +30,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Tik om je bugrapport te delen zonder screenshot of wacht tot het screenshot is voltooid"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"Bugrapporten bevatten gegevens uit de verschillende logbestanden van het systeem, die gegevens kunnen bevatten die je als gevoelig beschouwt (zoals gegevens met betrekking tot app-gebruik en locatie). Deel bugrapporten alleen met mensen en apps die je vertrouwt."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Niet opnieuw weergeven"</string> - <string name="bugreport_storage_title" msgid="5332488144740527109">"Foutenrapporten"</string> + <string name="bugreport_storage_title" msgid="5332488144740527109">"Bugrapporten"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Bestand met bugrapport kan niet worden gelezen"</string> <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Kan details van bugrapport niet toevoegen aan zip-bestand"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"naamloos"</string> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index aadd201b06ee..d89bf6a8c0ae 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Şifrənizi daxil edin"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Yanlış PIN kod."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Yanlış Kart."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Enerji yığdı"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Enerji yığılıb"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Simsiz şəkildə batareya yığır"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Enerji yığır"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Sürətlə enerji yığır"</string> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 3813dddc49a1..38451c7cfba5 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduce tu contraseña"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"El código PIN es incorrecto."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Cargada"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sin cables"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando rápidamente"</string> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 5b8a255b7f26..f5d5bb4d13d4 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduce o contrasinal"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Código PIN incorrecto"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"A tarxeta non é válida."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Cargada"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sen fíos"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando rapidamente"</string> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index 9c00ff72721e..d62795ba1b14 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Masukkan sandi"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Kode PIN salah."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Kartu Tidak Valid"</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Terisi"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Terisi penuh"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya secara nirkabel"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Mengisi daya dengan cepat"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index a770297cfcd6..1e47efa2cc4f 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Digite sua senha"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Código PIN incorreto."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Carregada"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando rapidamente"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index a770297cfcd6..1e47efa2cc4f 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Digite sua senha"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Código PIN incorreto."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Cartão inválido."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Carregada"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Carregado"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando sem fio"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Carregando rapidamente"</string> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 16dc4a859d4c..168158d9d602 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Vnesite geslo"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Napačna koda PIN."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Neveljavna kartica"</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Akumulator napolnjen"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Baterija napolnjena"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • brezžično polnjenje"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • polnjenje"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • hitro polnjenje"</string> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index ec44b61956b9..14973f82dc4d 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -33,7 +33,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Fut fjalëkalimin"</string> <string name="keyguard_password_wrong_pin_code" msgid="3514267777289393046">"Kodi PIN është i pasaktë."</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Karta e pavlefshme."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"I ngarkuar"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"I karikuar"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet me valë"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet"</string> <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Po karikohet me shpejtësi"</string> diff --git a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml index 5eb81a45e629..800fdcf2ed97 100644 --- a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml @@ -34,10 +34,10 @@ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string> <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string> <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo ovog korisnika, čime se brišu svi podaci korisnika."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo profil za Work, čime se brišu svi podaci sa profila."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Pogrešno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate tablet pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate telefon pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> </resources> diff --git a/packages/SystemUI/res-product/values-sr/strings.xml b/packages/SystemUI/res-product/values-sr/strings.xml index d43f0a3e382a..b6a98503a1c0 100644 --- a/packages/SystemUI/res-product/values-sr/strings.xml +++ b/packages/SystemUI/res-product/values-sr/strings.xml @@ -34,10 +34,10 @@ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, уклонићемо овог корисника, чиме се бришу сви подаци корисника."</string> <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо овог корисника, чиме се бришу сви подаци корисника."</string> <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо овог корисника, чиме се бришу сви подаци корисника."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо профил за Work, чиме се бришу сви подаци са профила."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Погрешно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате таблет помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате телефон помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> </resources> diff --git a/packages/SystemUI/res-product/values-uz/strings.xml b/packages/SystemUI/res-product/values-uz/strings.xml index c3e3a3a59e90..d701d926918f 100644 --- a/packages/SystemUI/res-product/values-uz/strings.xml +++ b/packages/SystemUI/res-product/values-uz/strings.xml @@ -36,7 +36,7 @@ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="3051962486994265014">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ushbu foydalanuvchi oʻchirib tashlanadi va undagi barcha foydalanuvchi maʼlumotlari ham oʻchib ketadi."</string> <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="1049523640263353830">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ish profili oʻchirib tashlanadi va undagi barcha profil maʼlumotlari ham oʻchib ketadi."</string> <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ish profili oʻchirib tashlanadi va undagi barcha profil maʼlumotlari ham oʻchib ketadi."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ishchi profil oʻchirib tashlanadi va undagi barcha maʼlumotlar ham oʻchib ketadi."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ish profili oʻchirib tashlanadi va undagi barcha maʼlumotlar ham oʻchib ketadi."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ish profili oʻchirib tashlanadi va undagi barcha maʼlumotlar ham oʻchib ketadi."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailingizdan foydalanib, planshet qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin yana urinib koʻring."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailngizdan foydalanib, telefon qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin qayta urinib koʻring."</string> diff --git a/packages/SystemUI/res/drawable/qs_media_background.xml b/packages/SystemUI/res/drawable/qs_media_background.xml index 2821e4c28bab..e79c9a40918c 100644 --- a/packages/SystemUI/res/drawable/qs_media_background.xml +++ b/packages/SystemUI/res/drawable/qs_media_background.xml @@ -14,13 +14,9 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="?android:attr/colorBackgroundFloating" /> - <corners - android:bottomLeftRadius="@dimen/qs_media_corner_radius" - android:topLeftRadius="@dimen/qs_media_corner_radius" - android:bottomRightRadius="@dimen/qs_media_corner_radius" - android:topRightRadius="@dimen/qs_media_corner_radius" - /> -</shape>
\ No newline at end of file +<com.android.systemui.media.IlluminationDrawable + xmlns:systemui="http://schemas.android.com/apk/res-auto" + systemui:rippleMinSize="30dp" + systemui:rippleMaxSize="135dp" + systemui:highlight="15" + systemui:cornerRadius="@dimen/qs_media_corner_radius" />
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/screenshot_actions_background_protection.xml b/packages/SystemUI/res/drawable/screenshot_actions_background_protection.xml index 163015b7b0f0..21013c6c7b16 100644 --- a/packages/SystemUI/res/drawable/screenshot_actions_background_protection.xml +++ b/packages/SystemUI/res/drawable/screenshot_actions_background_protection.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:angle="90" - android:startColor="#1f000000" + android:startColor="@color/global_screenshot_background_protection_start" android:endColor="#00000000"/> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/bubble_overflow_view.xml b/packages/SystemUI/res/layout/bubble_overflow_view.xml index 88a05ec5824a..1ed1f07fb277 100644 --- a/packages/SystemUI/res/layout/bubble_overflow_view.xml +++ b/packages/SystemUI/res/layout/bubble_overflow_view.xml @@ -36,6 +36,8 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxLines="1" + android:lines="2" + android:ellipsize="end" android:layout_gravity="center" android:paddingTop="@dimen/bubble_overflow_text_padding" android:gravity="center"/> diff --git a/packages/SystemUI/res/layout/global_screenshot.xml b/packages/SystemUI/res/layout/global_screenshot.xml index de19303b4948..1dbb38d5dc7a 100644 --- a/packages/SystemUI/res/layout/global_screenshot.xml +++ b/packages/SystemUI/res/layout/global_screenshot.xml @@ -22,7 +22,7 @@ android:layout_height="match_parent"> <ImageView android:id="@+id/global_screenshot_actions_background" - android:layout_height="@dimen/global_screenshot_bg_protection_height" + android:layout_height="@dimen/screenshot_bg_protection_height" android:layout_width="match_parent" android:alpha="0.0" android:src="@drawable/screenshot_actions_background_protection" diff --git a/packages/SystemUI/res/layout/keyguard_media_header.xml b/packages/SystemUI/res/layout/keyguard_media_header.xml index de9ef218083b..20ec10ca1e1b 100644 --- a/packages/SystemUI/res/layout/keyguard_media_header.xml +++ b/packages/SystemUI/res/layout/keyguard_media_header.xml @@ -124,7 +124,7 @@ android:layout_gravity="center" > <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" @@ -132,7 +132,7 @@ android:id="@+id/action0" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" @@ -140,7 +140,7 @@ android:id="@+id/action1" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" diff --git a/packages/SystemUI/res/layout/qqs_media_panel.xml b/packages/SystemUI/res/layout/qqs_media_panel.xml index 403b5dc3a427..2e86732f3cad 100644 --- a/packages/SystemUI/res/layout/qqs_media_panel.xml +++ b/packages/SystemUI/res/layout/qqs_media_panel.xml @@ -63,7 +63,7 @@ android:gravity="center" > <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" @@ -71,7 +71,7 @@ android:id="@+id/action0" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" @@ -79,7 +79,7 @@ android:id="@+id/action1" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:gravity="center" diff --git a/packages/SystemUI/res/layout/qs_media_panel.xml b/packages/SystemUI/res/layout/qs_media_panel.xml index a194569dcca4..d633ff40df9e 100644 --- a/packages/SystemUI/res/layout/qs_media_panel.xml +++ b/packages/SystemUI/res/layout/qs_media_panel.xml @@ -197,7 +197,7 @@ android:gravity="center" > <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="8dp" @@ -207,7 +207,7 @@ android:id="@+id/action0" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="8dp" @@ -217,7 +217,7 @@ android:id="@+id/action1" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="52dp" android:layout_height="52dp" android:layout_marginStart="8dp" @@ -227,7 +227,7 @@ android:id="@+id/action2" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="8dp" @@ -237,7 +237,7 @@ android:id="@+id/action3" /> <ImageButton - style="@android:style/Widget.Material.Button.Borderless.Small" + style="@style/MediaPlayer.Button" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="8dp" diff --git a/packages/SystemUI/res/layout/screen_record_dialog.xml b/packages/SystemUI/res/layout/screen_record_dialog.xml index df576d83323f..fd9936f6b8ea 100644 --- a/packages/SystemUI/res/layout/screen_record_dialog.xml +++ b/packages/SystemUI/res/layout/screen_record_dialog.xml @@ -59,29 +59,16 @@ android:layout_gravity="center" android:layout_weight="0" android:layout_marginRight="@dimen/screenrecord_dialog_padding"/> - <LinearLayout + <Spinner + android:id="@+id/screen_recording_options" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - android:layout_weight="1"> - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center_vertical" - android:text="@string/screenrecord_audio_label" - android:textColor="?android:attr/textColorPrimary" - android:textAppearance="?android:attr/textAppearanceMedium"/> - <TextView - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/audio_type" - android:text="@string/screenrecord_mic_label" - android:textAppearance="?android:attr/textAppearanceSmall"/> - </LinearLayout> + android:layout_height="48dp" + android:prompt="@string/screenrecord_audio_label"/> <Switch android:layout_width="wrap_content" android:layout_height="48dp" - android:layout_weight="0" + android:layout_weight="1" + android:layout_gravity="end" android:id="@+id/screenrecord_audio_switch"/> </LinearLayout> @@ -102,7 +89,8 @@ android:id="@+id/screenrecord_taps_switch" android:text="@string/screenrecord_taps_label" android:textColor="?android:attr/textColorPrimary" - android:textAppearance="?android:attr/textAppearanceMedium"/> + android:textAppearance="?android:attr/textAppearanceSmall"/> + </LinearLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml new file mode 100644 index 000000000000..af6f9bb827f6 --- /dev/null +++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="48dp" + android:orientation="vertical" + android:padding="10dp" + android:layout_weight="1"> + <TextView + android:id="@+id/screen_recording_dialog_source_text" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary"/> + <TextView + android:id="@+id/screen_recording_dialog_source_description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorSecondary"/> +</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml new file mode 100644 index 000000000000..fabe9e2d4453 --- /dev/null +++ b/packages/SystemUI/res/layout/screen_record_dialog_audio_source_selected.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="48dp" + android:orientation="vertical" + android:layout_weight="1"> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/screenrecord_audio_label" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary"/> + <TextView + android:id="@+id/screen_recording_dialog_source_text" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:textColor="?android:attr/textColorSecondary" + android:textAppearance="?android:attr/textAppearanceSmall"/> +</LinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index b393d2143ed2..e341f5674cc2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Maak skermkiekie toe"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skermkiekievoorskou"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skermopnemer"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Deurlopende kennisgewing vir \'n skermopnamesessie"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Begin opname?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Terwyl dit opneem, kan die Android-stelsel enige sensitiewe inligting wat op jou skerm sigbaar is of wat op jou toestel gespeel word, vasvang. Dit sluit wagwoorde, betalinginligting, foto\'s, boodskappe en oudio in."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Vee alles uit"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Bestuur"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Geskiedenis"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Stil kennisgewings"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Opletkennisgewings"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekke"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Titelloos"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tik om hierdie program te herbegin en maak volskerm oop."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Instellings vir <xliff:g id="APP_NAME">%1$s</xliff:g>-borrels"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Bestuur"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> vanaf <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> meer af"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Die lys met alle kontroles kon nie gelaai word nie."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Ander"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Voeg by toestelkontroles"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Voeg by gunstelinge"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> het voorgestel dat hierdie kontrole by jou gunstelinge gevoeg word."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Voeg by"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Voorgestel deur <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontroles opgedateer"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN bevat letters of simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifieer <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 195000e85e42..85e06c3727c5 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ቅጽበታዊ ገጽ እይታን አሰናብት"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"የማያ መቅጃ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገጽ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"መቅረጽ ይጀመር?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"እየቀረጹ ሳለ የAndroid ስርዓት በማያ ገጽዎ ላይ የሚታይ ወይም በመሣሪያዎ ላይ የሚጫወት ማንኛውም ሚስጥራዊነት ያለው መረጃን መያዝ ይችላል። ይህ የይለፍ ቃላትን፣ የክፍያ መረጃን፣ ፎቶዎችን፣ መልዕክቶችን እና ኦዲዮን ያካትታል።"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ሁሉንም አጽዳ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ያቀናብሩ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ታሪክ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ጸጥ ያሉ ማሳወቂያዎች"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"የማንቂያ ማሳወቂያዎች"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ውይይቶች"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ርዕስ የለም"</string> <string name="restart_button_description" msgid="6916116576177456480">"ይህን መተግበሪያ እንደገና ለማስጀመር መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"ቅንብሮች ለ <xliff:g id="APP_NAME">%1$s</xliff:g> አረፋዎች"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ያቀናብሩ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ<xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ከ <xliff:g id="APP_NAME">%2$s</xliff:g> እና <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ተጨማሪ"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"የሁሉም መቆጣጠሪያዎች ዝርዝር ሊጫን አልተቻለም።"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ሌላ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ወደ የመሣሪያ መቆጣጠሪያዎች ያክሉ"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ወደ ተወዳጆች አክል"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ይህን ቁጥጥር ወደ ተወዳጆችዎ እንዲታከል ሐሳብ ጠቁሟል።"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"አክል"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"በ<xliff:g id="APP">%s</xliff:g> የተጠቆመ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"መቆጣጠሪያዎች ተዘምነዋል"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ፒን ፊደሎችን ወይም ምልክቶችን ይይዛል"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> አረጋግጥ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 9cc6ec3f5229..e6388e99c1a1 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -64,7 +64,7 @@ <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"لا يُسمح بتصحيح أخطاء USB"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تفعيل تصحيح الأخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"هل تريد السماح باستخدام ميزة \"تصحيح الأخطاء اللاسلكي\" على هذه الشبكة؟"</string> - <string name="wifi_debugging_message" msgid="5461204211731802995">"اسم الشبكة (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nعنوان شبكة Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> + <string name="wifi_debugging_message" msgid="5461204211731802995">"اسم الشبكة (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nعنوان شبكة Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"السماح باستخدام هذه الميزة على هذه الشبكة دائمًا"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"سماح"</string> <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"غير مسموح باستخدام ميزة \"تصحيح الأخطاء اللاسلكي\""</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"إغلاق لقطة الشاشة"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"معاينة لقطة الشاشة"</string> <string name="screenrecord_name" msgid="2596401223859996572">"مسجّل الشاشة"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"إشعار مستمر لجلسة تسجيل شاشة"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"هل تريد بدء التسجيل؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"أثناء التسجيل، يمكن أن يسجّل نظام Android أي معلومات حساسة مرئية على شاشتك أو يتم تشغيلها على جهازك. ويشمل ذلك كلمات المرور ومعلومات الدفع والصور والرسائل والمقاطع الصوتية."</string> @@ -521,6 +523,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"محو الكل"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"إدارة"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"السجلّ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"الإشعارات الصامتة"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"إشعارات التنبيه"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"المحادثات"</string> @@ -1007,6 +1011,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"بلا عنوان"</string> <string name="restart_button_description" msgid="6916116576177456480">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"إعدادات فقاعات المحادثات على <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"إدارة"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> من <xliff:g id="APP_NAME">%2$s</xliff:g> و<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> أيضًا"</string> @@ -1055,8 +1063,10 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"تعذّر تحميل قائمة كل عناصر التحكّم."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"غير ذلك"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"إضافة إلى أدوات التحكم بالجهاز"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"إضافة إلى الإعدادات المفضّلة"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"اقترح تطبيق <xliff:g id="APP">%s</xliff:g> إضافة عنصر التحكّم هذا إلى الإعدادات المفضّلة."</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"تم تعديل عناصر التحكّم."</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"يشتمل رقم التعريف الشخصي على أحرف أو رموز."</string> <string name="controls_pin_verify" msgid="3452778292918877662">"إثبات ملكية <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 6957e20d01b3..df62189c5f3b 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্ৰীনশ্বট অগ্ৰাহ্য কৰক"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্ৰীনশ্বটৰ পূৰ্বদৰ্শন"</string> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্ৰীন ৰেকৰ্ডাৰ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রীণ ৰেকৰ্ডিং ছেশ্বন চলি থকা সময়ত পোৱা জাননী"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ৰেকৰ্ড কৰা আৰম্ভ কৰিবনে?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ৰেকৰ্ড কৰি থাকোঁতে, Android Systemএ আপোনাৰ স্ক্রীনত দৃশ্যমান হোৱা অথবা আপোনাৰ ডিভাইচত প্লে’ হৈ থকা যিকোনো সংবেনদশীল তথ্য কেপচাৰ কৰিব পাৰে। এইটোত পাছৱর্ড, পৰিশোধৰ তথ্য, ফট’, বার্তাসমূহ আৰু অডিঅ’ অন্তর্ভুক্ত হয়।"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"সকলো মচক"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"পৰিচালনা"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ইতিহাস"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"নীৰৱ জাননীসমূহ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"সতৰ্কতামূলক জাননীসমূহ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"বাৰ্তালাপ"</string> @@ -960,7 +964,7 @@ <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"অসুবিধা নিদিব-ক কোনো এপ্ (<xliff:g id="ID_1">%s</xliff:g>)এ অন কৰিলে।"</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"অসুবিধা নিদিব-ক এটা স্বয়ংক্ৰিয় নিয়ম বা এপে অন কৰিলে।"</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> পৰ্যন্ত"</string> - <string name="qs_dnd_keep" msgid="3829697305432866434">"ৰাখক"</string> + <string name="qs_dnd_keep" msgid="3829697305432866434">"Keep"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"সলনি কৰক"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"নেপথ্যত চলি থকা এপসমূহ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"বেটাৰি আৰু ডেটাৰ ব্যৱহাৰৰ বিষয়ে বিশদভাৱে জানিবলৈ টিপক"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"কোনো শিৰোনাম নাই"</string> <string name="restart_button_description" msgid="6916116576177456480">"এপ্টো ৰিষ্টাৰ্ট কৰক আৰু পূৰ্ণ স্ক্ৰীণ ব্যৱহাৰ কৰক।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিংসমূহ"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"পৰিচালনা কৰক"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> আৰু<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টাৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"নিয়ন্ত্ৰণসমূহৰ সম্পূর্ণ সূচীখন ল’ড কৰিব পৰা নগ’ল।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইচৰ নিয়ন্ত্ৰণসমূহত যোগ দিয়ক"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"প্ৰিয়সমূহত যোগ কৰক"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>এ এই নিয়ন্ত্ৰণটো আপোনাৰ প্ৰিয়সমূহত যোগ কৰাৰ পৰামৰ্শ দিছে।"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"যোগ দিয়ক"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g>এ পৰামৰ্শ হিচাপে আগবঢ়োৱা"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"নিয়ন্ত্ৰণসমূহ আপডে\'ট কৰা হৈছে"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"পিনত বৰ্ণ অথবা প্ৰতীকসমূহ থাকে"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> সত্যাপন কৰক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 2714811b7e08..f09a6d621c60 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -76,7 +76,7 @@ <string name="learn_more" msgid="4690632085667273811">"Ətraflı məlumat"</string> <string name="compat_mode_on" msgid="4963711187149440884">"Ekranı doldurmaq üçün yaxınlaşdır"</string> <string name="compat_mode_off" msgid="7682459748279487945">"Ekranı doldurmaq üçün uzat"</string> - <string name="global_action_screenshot" msgid="2760267567509131654">"Ekran şəkli"</string> + <string name="global_action_screenshot" msgid="2760267567509131654">"Skrinşot"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"şəkil göndərdi"</string> <string name="screenshot_saving_ticker" msgid="6519186952674544916">"Skrinşot yadda saxlanılır..."</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinşot yadda saxlanır..."</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran şəklini ötürün"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Yazıcısı"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Yazmağa başlanılsın?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Yazarkən Android Sistemi ekranınızda görünən və ya cihazınızda göstərilən istənilən həssas məlumatı qeydə ala bilər. Buraya parollar, ödəniş məlumatı, fotolar, mesajlar və audio daxildir."</string> @@ -435,7 +437,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Tətbiqləri cəld dəyişmək üçün sağa çəkin"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"İcmala Keçin"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Dolub"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Enerji yığılıb"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Enerji doldurulur"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> dolana kimi"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Doldurulmur"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hamısını silin"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"İdarə edin"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Tarixçə"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Səssiz bildirişlər"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Xəbərdarlıq bildirişləri"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Söhbətlər"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıq yoxdur"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün klikləyin."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> yumrucuqları üçün ayarlar"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"İdarə edin"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> tətbiqindən <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> və daha <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> qabarcıq"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Bütün nizamlayıcıların siyahısı yüklənmədi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Digər"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz idarəetmələrinə əlavə edin"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Sevimlilərə əlavə edin"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> sevimlilərə əlavə etmək üçün bu nizamlayıcını təklif edib."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Əlavə edin"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> tərəfindən təklif edilib"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Nizamlayıcılar güncəlləndi"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN hərflər və ya simvollar ehtiva edir"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> cihazını doğrulayın"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index a74917776d09..b9af5e99b3ee 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obaveštenje o sesiji snimanja ekrana je aktivno"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite da započnete snimanje?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Tokom snimanja Android sistem može da snimi osetljive informacije koje su vidljive na ekranu ili koje se puštaju na uređaju. To obuhvata lozinke, informacije o plaćanju, slike, poruke i zvuk."</string> @@ -396,7 +398,7 @@ <string name="quick_settings_connected" msgid="3873605509184830379">"Povezan"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Povezano, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Povezuje se..."</string> - <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Povezivanje"</string> + <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Privezivanje"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Hotspot"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Uključuje se..."</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ušteda podataka je uključena"</string> @@ -512,6 +514,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Obriši sve"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istorija"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obaveštenja"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Obaveštenja koja privlače pažnju"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzacije"</string> @@ -992,6 +996,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Podešavanja za <xliff:g id="APP_NAME">%1$s</xliff:g> oblačiće"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljajte"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1037,8 +1045,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Učitavanje liste svih kontrola nije uspelo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajte u kontrole uređaja"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodajte u omiljene"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> predlaže da dodate ovu kontrolu u omiljene."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Dodaj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Predlaže <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrole su ažurirane"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN sadrži slova ili simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifikujte: <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 6de173649a49..0f3f537a27ec 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Адхіліць здымак экрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перадпрагляд здымка экрана"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запіс экрана"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Бягучае апавяшчэнне для сеанса запісу экрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Пачаць запіс?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Падчас запісу сістэма Android можа збіраць канфідэнцыяльную інфармацыю, якая адлюстроўваецца на экране вашай прылады ці прайграецца на ёй. Гэта могуць быць паролі, плацежная інфармацыя, фота, паведамленні і аўдыяданыя."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ачысціць усё"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Кіраваць"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Гісторыя"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Апавяшчэнні без гуку"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Апавяшчэнні з абвесткамі"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Размовы"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без назвы"</string> <string name="restart_button_description" msgid="6916116576177456480">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налады ўсплывальных апавяшчэнняў у праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Кіраваць"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ад праграмы \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" і яшчэ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не ўдалося загрузіць спіс усіх сродкаў кіравання."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Іншае"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Дадаць у элементы кіравання прыладай"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Дадаць у абраныя"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> прапануе дадаць гэты элемент кіравання ў вашы абраныя."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Дадаць"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Прапанавана праграмай \"<xliff:g id="APP">%s</xliff:g>\""</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Элементы кіравання абноўлены"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-код складаецца з літар або знакаў"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Спраўдзіце прыладу \"<xliff:g id="DEVICE">%s</xliff:g>\""</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 156fb0fe91bd..50781e138d5f 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -63,7 +63,7 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"Разрешаване"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"Отстраняването на грешки през USB не е разрешено"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"Искате ли да разрешите безжичното отстраняване на грешки в тази мрежа?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"Разрешаване на безжичното отстраняване на грешки?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Име на мрежата (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nАдрес на Wi‑Fi мрежата (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Винаги да се разрешава в тази мрежа"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Разрешаване"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отхвърляне на екранната снимка"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Визуализация на екранната снимка"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Запис на екрана"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущо известие за сесия за записване на екрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се стартира ли записът?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"По време на записване системата Android може да прихване поверителна информация, която е показана на екрана или възпроизвеждана на устройството ви. Това включва пароли, данни за плащане, снимки, съобщения и аудио."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Изчистване на всички"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управление"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"История"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучни известия"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Известия за сигнализиране"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Няма заглавие"</string> <string name="restart_button_description" msgid="6916116576177456480">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки за балончетата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управление"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ от<xliff:g id="APP_NAME">%2$s</xliff:g> и още <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Списъкът с всички контроли не бе зареден."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Добавяне към контролите за устройството"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Добавяне в любимите"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> предложи тази контрола да се добави към любимите ви."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Добавяне"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Предложено от <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Контролите са актуализирани"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ПИН кодът съдържа букви или символи"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Потвърждаване на <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 599bf631ebe5..50a88f25660f 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"স্ক্রিনশট বাতিল করুন"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"স্ক্রিনশটের প্রিভিউ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"স্ক্রিন রেকর্ডার"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"স্ক্রিন রেকর্ডিং সেশন চলার বিজ্ঞপ্তি"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"রেকর্ডিং শুরু করবেন?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"রেকর্ড করার সময়, আপনার স্ক্রিনে দেখানো বা ডিভাইসে চালানো যেকোনও ধরনের সংবেদনশীল তথ্য Android সিস্টেম ক্যাপচার করতে পারে। এর মধ্যে পাসওয়ার্ড, পেমেন্টের তথ্য, ফটো, মেসেজ এবং অডিও সম্পর্কিত তথ্য থাকে।"</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"বিজ্ঞপ্তি খারিজ করা হয়েছে৷"</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"বাবল বাতিল করা হয়েছে।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"বিজ্ঞপ্তি শেড৷"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"দ্রুত সেটিংস৷"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"লক স্ক্রিন।"</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"সবকিছু সাফ করুন"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"পরিচালনা করুন"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ইতিহাস"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"নীরব বিজ্ঞপ্তি"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"বিজ্ঞপ্তি সংক্রান্ত সতর্কতা"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"কথোপকথন"</string> @@ -961,7 +964,7 @@ <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"বিরক্ত করবে না বিকল্পটি একটি অ্যাপ <xliff:g id="ID_1">%s</xliff:g> এর দ্বারা চালু করা হয়েছে।"</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"বিরক্ত করবে না বিকল্পটি একটি স্বয়ংক্রিয় নিয়ম বা অ্যাপের দ্বারা চালু করা হয়েছে।"</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> পর্যন্ত"</string> - <string name="qs_dnd_keep" msgid="3829697305432866434">"রাখুন"</string> + <string name="qs_dnd_keep" msgid="3829697305432866434">"Keep"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"বদলে দিন"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"পটভূমিতে অ্যাপ চালু আছে"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ব্যাটারি এবং ডেটার ব্যবহারের বিশদ বিবরণের জন্য ট্যাপ করুন"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"কোনও শীর্ষক নেই"</string> <string name="restart_button_description" msgid="6916116576177456480">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও ফুল-স্ক্রিন ব্যবহার করুন।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> বাবলের জন্য সেটিংস"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ম্যানেজ করা"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> অ্যাপ এবং আরও <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>টি থেকে <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"যেসব কন্ট্রোল অ্যাক্সেস করতে চান সেগুলি পাওয়ার মেনু থেকে বেছে নিন"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"কন্ট্রোলগুলিকে আবার সাজানোর জন্য ধরে রেখে টেনে আনুন"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"সমস্ত কন্ট্রোল সরানো হয়েছে"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"পরিবর্তন সেভ করা হয়নি"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"সব কন্ট্রোলের তালিকা লোড করা যায়নি।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"অন্য"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ডিভাইস কন্ট্রোলে যোগ করুন"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"পছন্দসইতে যোগ করুন"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"আপনার পছন্দসইতে যোগ করতে <xliff:g id="APP">%s</xliff:g> এই কন্ট্রোল সাজেস্ট করেছে।"</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"কন্ট্রোল আপডেট করা হয়েছে"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"পিন-এ অক্ষর বা চিহ্ন রয়েছে"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> যাচাই করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 6e7722d0729d..d334f3ceab78 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacite snimak ekrana"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimka ekrana"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač ekrana"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Obavještenje za sesiju snimanja ekrana je u toku"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Započeti snimanje?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Prilikom snimanja, Android sistem može snimiti sve osjetljive informacije koje su vidljive na vašem ekranu ili koje reproducirate na uređaju. To uključuje lozinke, informacije za plaćanje, fotografije, poruke i zvuk."</string> @@ -512,6 +513,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Očisti sve"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historija"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Dolazno"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Nečujna obavještenja"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Zvučna obavještenja"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> @@ -994,6 +996,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Postavke za oblačiće aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Dodatno"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodajte natrag u nizove"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljaj"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> od aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"Obavještenje <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1039,8 +1043,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Učitavanje liste svih kontrola nije uspjelo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajte u kontrole uređaja"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodajte u omiljeno"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikacija <xliff:g id="APP">%s</xliff:g> je predložila da se ova kontrola doda u omiljeno."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Dodaj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Predlaže <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrole su ažurirane"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN sadrži slova ili simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Potvrdite <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index bf8c113bcd74..ed3bb8db81f2 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora la captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previsualització de la captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravació de pantalla"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vols iniciar la gravació?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Quan graves contingut, el sistema Android pot capturar qualsevol informació sensible que es mostri a la pantalla o que es reprodueixi al dispositiu. Això inclou les contrasenyes, la informació de pagament, les fotos, els missatges i l\'àudio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Esborra-ho tot"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestiona"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacions silencioses"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificacions d\'alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Converses"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sense títol"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca per reiniciar l\'aplicació i passar a pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuració de les bombolles: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestiona"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) i <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> més"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"No s\'ha pogut carregar la llista completa de controls."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altres"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Afegeix als controls de dispositius"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Afegeix als preferits"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ha suggerit aquest control perquè l\'afegeixis als preferits."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Afegeix"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggerit per <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"S\'han actualitzat els controls"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"El PIN conté lletres o símbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifica <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 8bce8ece357c..73378ddd01d9 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavřít snímek obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Náhled snímku obrazovky"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Trvalé oznámení o relaci nahrávání"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Spustit nahrávání?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Při nahrávání může systém Android zaznamenávat citlivé údaje, které jsou viditelné na obrazovce nebo které jsou přehrávány na zařízení. Týká se to hesel, údajů o platbě, fotek, zpráv a zvuků."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Smazat vše"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Spravovat"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historie"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tichá oznámení"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Oznámení s upozorněním"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzace"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavení bublin aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovat"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"Oznámení <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g> a dalších (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Načtení seznamu všech ovládacích prvků se nezdařilo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Jiné"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Přidání ovládání zařízení"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Přidat k oblíbeným"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikace <xliff:g id="APP">%s</xliff:g> navrhuje přidat tento ovládací prvek do oblíbených."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Přidat"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Návrh z aplikace <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládací prvky aktualizovány"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Kód PIN obsahuje písmena nebo symboly"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Ověření zařízení <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 18370737dba9..88b74de6b2f9 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Luk screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning af screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skærmoptagelse"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Konstant notifikation om skærmoptagelse"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte optagelse?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Når du optager, kan Android-systemet registrere følsomme oplysninger, der er synlige på din skærm, eller som afspilles på din enhed. Dette inkluderer adgangskoder, betalingsoplysninger, fotos, meddelelser og lyd."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ryd alle"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historik"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse notifikationer"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifikationer med vibration eller lyd"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tryk for at genstarte denne app, og gå til fuld skærm."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Indstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> andre"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over styringselementer kunne ikke indlæses."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Føj til enhedsstyring"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Føj til favoritter"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> har foreslået, at du føjer denne funktion til dine favoritter."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Tilføj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Foreslået af <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Betjeningselementerne er opdateret"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Pinkoden indeholder bogstaver eller symboler"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Bekræft <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 1f78537ca63d..acfdd47fadeb 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Screenshot schließen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshotvorschau"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Bildschirmaufzeichnung"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Fortlaufende Benachrichtigung für eine Bildschirmaufzeichnung"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Aufzeichnung starten?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Beim Aufnehmen kann das Android-System vertrauliche Informationen erfassen, die auf deinem Bildschirm angezeigt oder von deinem Gerät wiedergegeben werden. Das können Passwörter, Zahlungsinformationen, Fotos, Nachrichten und Audioinhalte sein."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Benachrichtigung geschlossen"</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bubble verworfen."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Benachrichtigungsleiste"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Schnelleinstellungen"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Sperrbildschirm"</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Alle löschen"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Verwalten"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Verlauf"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lautlose Benachrichtigungen"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Laut gestellte Benachrichtigungen"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Unterhaltungen"</string> @@ -712,7 +715,7 @@ <string name="notification_channel_summary_default" msgid="3539949463907902037">"Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt."</string> <string name="notification_channel_summary_default_with_bubbles" msgid="6298026344552480458">"Benachrichtigungen werden mit einem Ton oder einer Vibration angekündigt. Unterhaltungen von <xliff:g id="APP_NAME">%1$s</xliff:g> werden standardmäßig als Bubble angezeigt."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Du wirst mit einer unverankerten Verknüpfung darauf aufmerksam gemacht."</string> - <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wird oben im Bereich für Unterhaltungen als Bubble angezeigt."</string> + <string name="notification_channel_summary_priority" msgid="7415770044553264622">"Wird oben im Bereich \"Unterhaltungen\" als Bubble angezeigt."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Einstellungen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string> <string name="no_shortcut" msgid="7176375126961212514">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine unterhaltungsspezifischen Einstellungen"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Kein Titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tippe, um die App im Vollbildmodus neu zu starten."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Einstellungen für <xliff:g id="APP_NAME">%1$s</xliff:g>-Bubbles"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Verwalten"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> von <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> aus <xliff:g id="APP_NAME">%2$s</xliff:g> und <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> weiteren"</string> @@ -1028,13 +1035,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Karten auswählen, auf die man über das Ein-/Aus-Menü zugreifen kann"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Zum Verschieben von Steuerelementen halten und ziehen"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle Steuerelemente entfernt"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Änderungen nicht gespeichert"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Fehler beim Laden der Liste mit Steuerelementen."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andere"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Zur Gerätesteuerung hinzufügen"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Zu Favoriten hinzufügen"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"\"<xliff:g id="APP">%s</xliff:g>\" hat vorgeschlagen, dieses Steuerelement deinen Favoriten hinzuzufügen."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Hinzufügen"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Vorgeschlagen von <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Gerätekarten aktualisiert"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Die PIN enthält Buchstaben oder Symbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> bestätigen"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 16cf78b65474..1a930096c8fa 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Παράβλεψη στιγμιότυπου οθόνης"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Προεπισκόπηση στιγμιότυπου οθόνης"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Εγγραφή οθόνης"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Επεξεργασία εγγραφής οθόνης"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ειδοποίηση σε εξέλιξη για μια περίοδο λειτουργίας εγγραφής οθόνης"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Έναρξη εγγραφής;"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Κατά την εγγραφή, το σύστημα Android μπορεί να καταγράψει τυχόν ευαίσθητες πληροφορίες που είναι ορατές στην οθόνη ή αναπαράγονται στη συσκευή σας. Σε αυτές περιλαμβάνονται οι κωδικοί πρόσβασης, οι πληροφορίες πληρωμής, οι φωτογραφίες, τα μηνύματα και ο ήχος."</string> @@ -232,7 +233,7 @@ <string name="cell_data_off_content_description" msgid="9165555931499878044">"Τα δεδομένα κινητής τηλεφωνίας απενεργοποιήθηκαν"</string> <string name="not_default_data_content_description" msgid="6757881730711522517">"Δεν ρυθμίστηκε ώστε να χρησιμοποιεί δεδομένα"</string> <string name="cell_data_off" msgid="4886198950247099526">"Ανενεργά"</string> - <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Πρόσδεση Bluetooth"</string> + <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"Σύνδεση με Bluetooth"</string> <string name="accessibility_airplane_mode" msgid="1899529214045998505">"Λειτουργία πτήσης."</string> <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ενεργό."</string> <string name="accessibility_no_sims" msgid="5711270400476534667">"Δεν υπάρχει κάρτα SIM."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Διαγραφή όλων"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Διαχείριση"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Ιστορικό"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Εισερχόμενες"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Ειδοποιήσεις σε σίγαση"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Ειδοποιήσεις"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Συζητήσεις"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Χωρίς τίτλο"</string> <string name="restart_button_description" msgid="6916116576177456480">"Πατήστε για επανεκκίνηση αυτής της εφαρμογής και ενεργοποίηση πλήρους οθόνης."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ρυθμίσεις για συννεφάκια <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Υπερχείλιση"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Προσθήκη ξανά στη στοίβα"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Διαχείριση"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> από την εφαρμογή <xliff:g id="APP_NAME">%2$s</xliff:g> και <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ακόμη"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ανεπιτυχής φόρτωση λίστας όλων των στοιχ. ελέγχου."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Άλλο"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Προσθήκη στα στοιχεία ελέγχου συσκευής"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Προσθήκη στα αγαπημένα"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> πρότεινε αυτό το στοιχείο ελέγχου για προσθήκη στα αγαπημένα."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Προσθήκη"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Προτείνεται από <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ενημέρωση στοιχείων ελέγχου"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Το PIN περιέχει γράμματα ή σύμβολα"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Επαλήθευση <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 296d974023b0..b2a03d269443 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android system can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Incoming"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerting notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Add back to stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Add to favourites"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suggested this control to add to your favourites."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Add"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggested by <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controls updated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN contains letters or symbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verify <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 4e85aad7c87b..db9ed99b6607 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android system can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Incoming"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerting notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Add back to stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Add to favourites"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suggested this control to add to your favourites."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Add"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggested by <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controls updated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN contains letters or symbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verify <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 296d974023b0..b2a03d269443 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android system can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Incoming"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerting notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Add back to stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Add to favourites"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suggested this control to add to your favourites."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Add"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggested by <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controls updated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN contains letters or symbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verify <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 296d974023b0..b2a03d269443 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android system can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Incoming"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerting notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Add back to stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Add to favourites"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suggested this control to add to your favourites."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Add"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggested by <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controls updated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN contains letters or symbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verify <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 69a226c23006..2b87b82e59b3 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dismiss screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Screenshot preview"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Screen Recorder"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start Recording?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages, and audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Clear all"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Manage"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Incoming"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Silent notifications"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerting notifications"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"No title"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tap to restart this app and go full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Settings for <xliff:g id="APP_NAME">%1$s</xliff:g> bubbles"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overflow"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Add back to stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Manage"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g> and <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> more"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"The list of all controls could not be loaded."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Other"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Add to device controls"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Add to favorites"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suggested this control to add to your favorites."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Add"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggested by <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controls updated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN contains letters or symbols"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verify <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 966d07ac1721..7ef57f85366c 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Descartar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de la captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabadora de pantalla"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación constante para una sesión de grabación de pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Comenzar grabación?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante la grabación, el sistema de Android puede capturar la información sensible que aparezca en la pantalla o que se reproduzca en el dispositivo. Se incluyen contraseñas, información de pago, fotos, mensajes y audio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciosas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración para burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se cargó la lista completa de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Agregar a controles de dispositivos"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Agregar a favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"La app <xliff:g id="APP">%s</xliff:g> sugirió que agregaras este control a favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Agregar"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles actualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"El PIN contiene letras o símbolos"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 1b5c32a8946c..1c59325a8227 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cerrar captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa de captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Grabación de pantalla"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación continua de una sesión de grabación de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"¿Empezar a grabar?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Mientras grabas, el sistema Android puede capturar información sensible que se muestre o se reproduzca en tu dispositivo, como contraseñas, datos de pago, fotos, mensajes y audio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificaciones silenciadas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificaciones de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversaciones"</string> @@ -587,8 +591,8 @@ <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Transcripción instantánea"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Cerrar las recomendaciones de subtítulos"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Superposición de subtítulos"</string> - <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"habilitar"</string> - <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"inhabilitar"</string> + <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"activar"</string> + <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"desactivar"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"Cambiar dispositivo de salida"</string> <string name="screen_pinning_title" msgid="7357611095909618178">"Pantalla fijada"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás y Aplicaciones recientes."</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sin título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> y <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> más"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"No se ha podido cargar la lista de los controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Otros"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Añadir a control de dispositivos"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Añadir a favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"La aplicación <xliff:g id="APP">%s</xliff:g> ha sugerido este control para que lo añadas a tus favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Añadir"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles actualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"El PIN contiene letras o símbolos"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 4b911a9d6f16..dce209c007a8 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Sule ekraanipilt"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekraanipildi eelvaade"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekraanisalvesti"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pooleli märguanne ekraanikuva salvestamise seansi puhul"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Kas alustada salvestamist?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Heli salvestamise ajal võib Androidi süsteem jäädvustada tundlikku teavet, mis on ekraanikuval nähtav või mida seadmes esitatakse. See hõlmab paroole, makseteavet, fotosid, sõnumeid ja heli."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tühjenda kõik"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Haldamine"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Ajalugu"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Hääletud märguanded"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Hoiatusmärguanded"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Vestlused"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Pealkiri puudub"</string> <string name="restart_button_description" msgid="6916116576177456480">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> mullide seaded"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Halda"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakendusest <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> rakenduselt <xliff:g id="APP_NAME">%2$s</xliff:g> ja veel <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1014,7 +1022,7 @@ <string name="magnification_overlay_title" msgid="6584179429612427958">"Suurendamisakna ülekate"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Suurendamisaken"</string> <string name="magnification_controls_title" msgid="8421106606708891519">"Suurendamisakna juhtelemendid"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhtimisvidinad"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string> <string name="quick_controls_subtitle" msgid="1667408093326318053">"Lisage juhtelemendid ühendatud seadmete jaoks"</string> <string name="quick_controls_setup_title" msgid="8901436655997849822">"Seadmete juhtimisvidinate seadistamine"</string> <string name="quick_controls_setup_subtitle" msgid="1681506617879773824">"Juhtelementidele juurdepääsemiseks hoidke all toitenuppu"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kõikide juhtelementide loendit ei saanud laadida."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Seadmete juhtimisvidinate hulka lisamine"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Lisa lemmikutesse"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> soovitas selle juhtnupu teie lemmikutesse lisada."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Lisa"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Soovitas <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Juhtelemente värskendati"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-kood sisaldab tähti või sümboleid"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Kinnitage <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 930d571ad7cf..6172462912a2 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Baztertu pantaila-argazkia"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pantaila-argazkiaren aurrebista"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Pantaila-grabagailua"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Pantaila-grabaketa prozesatzen"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pantailaren grabaketa-saioaren jakinarazpen jarraitua"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Grabatzen hasi nahi duzu?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Pantaila grabatzen duzun bitartean, Android sistemak detektatu egin dezake pantailan agertzen den edo gailuak erreproduzitzen duen kontuzko informazioa; besteak beste, pasahitzak, ordainketen informazioa, argazkiak, mezuak eta audioak."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Garbitu guztiak"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Kudeatu"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Jasotako azkenak"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Soinurik gabeko jakinarazpenak"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Soinua/Dar-dar egiten duten jakinarazpenak"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Elkarrizketak"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ez du izenik"</string> <string name="restart_button_description" msgid="6916116576177456480">"Berrabiarazi aplikazio hau eta ezarri pantaila osoko modua."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren ezarpenen burbuilak"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Gainezkatzea"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Gehitu berriro sortan"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kudeatu"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> aplikazioaren \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" jakinarazpena, eta beste <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ezin izan da kargatu kontrol guztien zerrenda."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Beste bat"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Gehitu gailuak kontrolatzeko widgetetan"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Gehitu gogokoetan"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> aplikazioak aukera hau gogokoetan gehitzea iradoki du."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Gehitu"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> aplikazioak iradoki du"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Eguneratu dira kontrolatzeko aukerak"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN kodeak hizkiak edo ikurrak ditu"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Egiaztatu <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index dab05e21b851..17e3ad716144 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"رد کردن نماگرفت"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"پیشنمایش نماگرفت"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ضبطکننده صفحهنمایش"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اعلان درحال انجام برای جلسه ضبط صفحهنمایش"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ضبط شروع شود؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"هنگام ضبط، «سیستم Android» میتواند هر اطلاعات حساسی را که روی صفحهنمایش شما نشان داده میشود یا روی دستگاه شما پخش میشود ضبط کند. این شامل گذرواژهها، اطلاعات پرداخت، عکسها، پیامها، و صدا میشود."</string> @@ -509,8 +511,10 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"پاک کردن همه موارد"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"مدیریت"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"سابقه"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"اعلانهای بیصدا"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"اعلانهای هشدار"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"اعلانهای هشداردهنده"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"مکالمهها"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"پاک کردن همه اعلانهای بیصدا"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"اعلانها توسط «مزاحم نشوید» موقتاً متوقف شدند"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"بدون عنوان"</string> <string name="restart_button_description" msgid="6916116576177456480">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"تنظیم برای ابزارکهای اعلان <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"مدیریت"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> از <xliff:g id="APP_NAME">%2$s</xliff:g> و <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مورد بیشتر"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"فهرست همه کنترلها را نمیتوان بارگیری کرد."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"موارد دیگر"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"افزودن به کنترلهای دستگاه"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"افزودن به موارد دلخواه"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> پیشنهاد میکند این کنترل به موارد دلخواهتان اضافه شود."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"افزودن"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"پیشنهاد <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"کنترلها بهروزرسانی شد"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"پین شامل حروف یا نماد است"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"تأیید <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 3efc0d810918..62779904b30c 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -28,7 +28,7 @@ <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> jäljellä"</string> <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> käytettävissä, noin <xliff:g id="TIME">%2$s</xliff:g> jäljellä käytön perusteella"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> käytettävissä, noin <xliff:g id="TIME">%2$s</xliff:g> jäljellä"</string> - <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> jäljellä. Virransäästö on käytössä."</string> + <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> jäljellä. Virransäästö on päällä."</string> <string name="invalid_charger" msgid="4370074072117767416">"Lataaminen USB:llä ei onnistu. Käytä laitteesi mukana tullutta laturia."</string> <string name="invalid_charger_title" msgid="938685362320735167">"Lataaminen USB:llä ei onnistu"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Käytä laitteesi mukana tullutta laturia"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hylkää kuvakaappaus"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Kuvakaappauksen esikatselu"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Näytön tallentaja"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pysyvä ilmoitus näytön tallentamisesta"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Aloitetaanko tallennus?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Tallennuksen aikana Android-järjestelmä voi tallentaa mitä tahansa näytöllä näkyvää tai laitteen toistamaa arkaluontoista tietoa. Näitä tietoja ovat esimerkiksi salasanat, maksutiedot, kuvat, viestit ja äänisisältö."</string> @@ -498,7 +500,7 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"Poistetaanko käyttäjä?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"Kaikki käyttäjän tiedot ja sovellukset poistetaan."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"Poista"</string> - <string name="battery_saver_notification_title" msgid="8419266546034372562">"Virransäästö on käytössä"</string> + <string name="battery_saver_notification_title" msgid="8419266546034372562">"Virransäästö on päällä"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Rajoittaa suorituskykyä ja taustatiedonsiirtoa"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Poista virransäästö käytöstä"</string> <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> saa pääsyn kaikkiin näytölläsi näkyviin tietoihin ja tietoihin laitteesi toistamasta sisällöstä tallennuksen tai striimauksen aikana. Näitä tietoja ovat esimerkiksi salasanat, maksutiedot, kuvat, viestit ja toistettava audiosisältö."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Poista kaikki"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Muuta asetuksia"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Hiljaiset ilmoitukset"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Ääni-ilmoitukset"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Keskustelut"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ei nimeä"</string> <string name="restart_button_description" msgid="6916116576177456480">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Kuplien asetukset: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Ylläpidä"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>) ja <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> muuta"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kaikkien säätimien luetteloa ei voitu ladata."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Muu"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Lisää laitteiden hallintaan"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Lisää suosikkeihin"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ehdotti tämän säätimen lisäämistä suosikkeihisi."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Lisää"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Ehdottaja: <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Säätimet päivitetty"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-koodi sisältää kirjaimia tai symboleja"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Vahvista <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 25f886d3161c..b34a038d7f34 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Trait. de l\'enregist. d\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Commencer l\'enregistrement?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durant l\'enregistrement, le système Android peut capturer de l\'information confidentielle qui s\'affiche sur votre écran ou qui joue sur votre appareil. Cela comprend les mots de passe, les renseignements sur le paiement, les photos, les messages et l\'audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historique"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Entrantes"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifications d\'alerte"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="restart_button_description" msgid="6916116576177456480">"Touchez pour redémarrer cette application et passer en plein écran."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Paramètres pour les bulles de l\'application <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menu déroulant"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Replacer sur la pile"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gérer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger la liste des commandes."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Ajouter aux favoris"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"L\'application <xliff:g id="APP">%s</xliff:g> a suggéré d\'ajouter cette commande à vos favoris."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Ajouter"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggestion de <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Commandes mises à jour"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Le NIP contient des lettres ou des symboles"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Vérifier <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 0c8bb931643f..7140c5b3784f 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Fermer la capture d\'écran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Aperçu de la capture d\'écran"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement de l\'écran"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Démarrer l\'enregistrement ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Pendant l\'enregistrement, le système Android peut capturer toute information sensible affichée à l\'écran ou lue sur votre appareil. Ceci inclut les mots de passe, les informations de paiement, les photos, les messages et les contenus audio."</string> @@ -155,7 +157,7 @@ <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"Mot de passe incorrect"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Trop de tentatives incorrectes.\nVeuillez réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"Réessayez. Tentative <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> sur <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g>."</string> - <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"Vos données seront supprimées"</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"Risque de perte des données"</string> <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"Si vous dessinez un schéma incorrect lors de la prochaine tentative, les données de cet appareil seront supprimées."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"Si vous saisissez un code incorrect lors de la prochaine tentative, les données de cet appareil seront supprimées."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"Si vous saisissez un mot de passe incorrect lors de la prochaine tentative, les données de cet appareil seront supprimées."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tout effacer"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gérer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historique"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifications silencieuses"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifications d\'alerte"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversations"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sans titre"</string> <string name="restart_button_description" msgid="6916116576177456480">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Paramètres des bulles de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gérer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de l\'application <xliff:g id="APP_NAME">%2$s</xliff:g> et <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> autres"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossible de charger toutes les commandes."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Autre"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ajouter aux commandes de contrôle des appareils"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Ajouter aux favoris"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> a suggéré d\'ajouter cette commande aux favoris."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Ajouter"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggérée par <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Commandes mises à jour"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Le code contient des lettres ou des symboles"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Valider <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index de290e07ccb2..a86c768c6717 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora a captura de pantalla"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Vista previa da captura de pantalla"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravadora da pantalla"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificación en curso sobre unha sesión de gravación de pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Queres iniciar a gravación?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante a gravación, o sistema Android pode captar información confidencial visible na pantalla ou reproducila no dispositivo. Isto inclúe contrasinais, información de pago, fotos, mensaxes e audio."</string> @@ -435,7 +437,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Pasar o dedo cara arriba para cambiar de aplicación"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arrastra cara á dereita para cambiar de aplicacións rapidamente"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Activar/desactivar Visión xeral"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Cargada"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Cargado"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Cargando"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> para completar a carga"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Non está cargando"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Eliminar todas"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Xestionar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificacións silenciadas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificación de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> @@ -895,7 +899,7 @@ <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"Abrir configuración rápida."</string> <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"Pechar a configuración rápida."</string> <string name="accessibility_quick_settings_alarm_set" msgid="7237918261045099853">"Alarma definida."</string> - <string name="accessibility_quick_settings_user" msgid="505821942882668619">"Iniciaches sesión como <xliff:g id="ID_1">%s</xliff:g>"</string> + <string name="accessibility_quick_settings_user" msgid="505821942882668619">"Sesión iniciada como <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Non hai conexión a Internet"</string> <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"Abrir detalles."</string> <string name="accessibility_quick_settings_not_available" msgid="6860875849497473854">"Opcións non-dispoñibles polo seguinte motivo: <xliff:g id="REASON">%s</xliff:g>"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sen título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configuración das burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Xestionar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> e <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> máis"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Non se puido cargar a lista de todos os controis."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outra"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Engadir ao control de dispositivos"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Engadir a favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> suxeriu que se engada este control aos teus favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Engadir"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Control suxerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Actualizáronse os controis"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"O PIN contén letras ou símbolos"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index afbe13bf894c..e38155154608 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"સ્ક્રીનશૉટ છોડી દો"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"સ્ક્રીનશૉટનો પ્રીવ્યૂ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"સ્ક્રીન રેકૉર્ડર"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"સ્ક્રીન રેકોર્ડિંગ સત્ર માટે ચાલુ નોટિફિકેશન"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"રેકૉર્ડિંગ શરૂ કરીએ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"રેકૉર્ડ કરતી વખતે, Android System તમારી સ્ક્રીન પર દેખાતી હોય અથવા તમારા ડિવાઇસ પર ચલાવવામાં આવતી હોય તેવી કોઈપણ સંવેદનશીલ માહિતીને કૅપ્ચર કરી શકે છે. આમાં પાસવર્ડ, ચુકવણીની માહિતી, ફોટા, સંદેશા અને ઑડિયોનો સમાવેશ થાય છે."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"સૂચના કાઢી નાખી."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"બબલ છોડી દેવાયો."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"નોટિફિકેશન શેડ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ઝડપી સેટિંગ્સ."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"લૉક સ્ક્રીન."</string> @@ -414,7 +415,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> વાપર્યો"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"<xliff:g id="DATA_LIMIT">%s</xliff:g> મર્યાદા"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ચેતવણી"</string> - <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"ઑફિસની પ્રોફાઇલ"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"રાત્રિ પ્રકાશ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"સૂર્યાસ્ત વખતે"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"સૂર્યોદય સુધી"</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"બધુ સાફ કરો"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"મેનેજ કરો"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ઇતિહાસ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"સાઇલન્ટ નોટિફિકેશન"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"નોટિફિકેશન બદલી રહ્યાં છીએ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"વાતચીત"</string> @@ -650,7 +653,7 @@ <string name="show_demo_mode" msgid="3677956462273059726">"ડેમો મોડ બતાવો"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"ઇથરનેટ"</string> <string name="status_bar_alarm" msgid="87160847643623352">"એલાર્મ"</string> - <string name="status_bar_work" msgid="5238641949837091056">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="status_bar_work" msgid="5238641949837091056">"ઑફિસની પ્રોફાઇલ"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"એરપ્લેન મોડ"</string> <string name="add_tile" msgid="6239678623873086686">"ટાઇલ ઉમેરો"</string> <string name="broadcast_tile" msgid="5224010633596487481">"બ્રોડકાસ્ટ ટાઇલ"</string> @@ -660,7 +663,7 @@ <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> એ"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"ઝડપી સેટિંગ્સ, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"હૉટસ્પૉટ"</string> - <string name="accessibility_managed_profile" msgid="4703836746209377356">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="accessibility_managed_profile" msgid="4703836746209377356">"ઑફિસની પ્રોફાઇલ"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"કેટલાક માટે મજા પરંતુ બધા માટે નહીં"</string> <string name="tuner_warning" msgid="1861736288458481650">"સિસ્ટમ UI ટ્યૂનર તમને Android વપરાશકર્તા ઇન્ટરફેસને ટ્વીક અને કસ્ટમાઇઝ કરવાની વધારાની રીતો આપે છે. ભાવિ રીલિઝેસમાં આ પ્રાયોગિક સુવિધાઓ બદલાઈ, ભંગ અથવા અદૃશ્ય થઈ શકે છે. સાવધાની સાથે આગળ વધો."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"ભાવિ રીલિઝેસમાં આ પ્રાયોગિક સુવિધાઓ બદલાઈ, ભંગ અથવા અદૃશ્ય થઈ શકે છે. સાવધાની સાથે આગળ વધો."</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string> <string name="restart_button_description" msgid="6916116576177456480">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> બબલ માટેનાં સેટિંગ"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"મેનેજ કરો"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> અને વધુ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> તરફથી <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"પાવર મેનૂમાંથી ઍક્સેસ કરવા માટેના નિયંત્રણોને પસંદ કરો"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"નિયંત્રણોને ફરીથી ગોઠવવા માટે તેમને હોલ્ડ કરીને ખેંચો"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"બધા નિયંત્રણો કાઢી નાખ્યા"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ફેરફારો સાચવ્યા નથી"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"બધા નિયંત્રણોની સૂચિ લોડ કરી શકાઈ નથી."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"અન્ય"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ડિવાઇસનાં નિયંત્રણોમાં ઉમેરો"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"મનપસંદમાં ઉમેરો"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> એ આ નિયંત્રણને તમારા મનપસંદમાં ઉમેરવાનું સૂચવ્યું છે."</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"નિયંત્રણ અપડેટ કર્યા"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"પિનમાં અક્ષરો અથવા પ્રતીકોનો સમાવેશ થાય છે"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>ને ચકાસો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index df76774ecb2f..3e4beacd8605 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट खारिज करें"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉट की झलक"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रिकॉर्डर"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रिकॉर्ड सेशन के लिए जारी सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रिकॉर्डिंग शुरू करना चाहते हैं?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रिकॉर्ड करते समय, Android सिस्टम आपकी स्क्रीन पर दिखने वाली या चलाई जाने वाली संवेदनशील जानकारी को कैप्चर कर सकता है. इसमें पासवर्ड, पैसे चुकाने से जुड़ी जानकारी, फ़ोटो, मैसेज, और ऑडियो शामिल हैं."</string> @@ -257,8 +259,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना खारिज की गई."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"बबल खारिज किया गया."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"त्वरित सेटिंग."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> @@ -512,6 +513,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सभी को हटाएं"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"प्रबंधित करें"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"बिना आवाज़ या वाइब्रेशन वाली सूचनाएं"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"आवाज़ या वाइब्रेशन वाली सूचनाएं"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string> @@ -990,6 +993,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"कोई शीर्षक नहीं"</string> <string name="restart_button_description" msgid="6916116576177456480">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन चालू करने के लिए टैप करें."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबल्स की सेटिंग"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"प्रबंधित करें"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> और <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> अन्य ऐप्लिकेशन से <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1030,13 +1037,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेन्यू से ऐक्सेस करने के लिए कंट्रोल चुनें"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"कंट्रोल का क्रम फिर से बदलने के लिए उन्हें दबाकर रखें और खींचें"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"सभी कंट्रोल हटा दिए गए"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"बदलाव सेव नहीं किए गए"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"सभी कंट्रोल की सूची लोड नहीं हो सकी."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"डिवाइस कंट्रोल में जोड़ें"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"पसंदीदा में जोड़ें"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> आपको इस कंट्रोल को अपनी पसंदीदा में जोड़ने का सुझाव देता है."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"जोड़ें"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ने सुझाव दिया"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"कंट्रोल अपडेट किए गए"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिन में अक्षर या चिह्न शामिल होते हैं"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> की पुष्टि करें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 488de5d9df26..0c0f4de7bb1e 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Odbacivanje snimke zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pregled snimke zaslona"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snimač zaslona"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obrada snimanja zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Tekuća obavijest za sesiju snimanja zaslona"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite li započeti snimanje?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Za vrijeme snimanja sustav Android može snimiti osjetljive podatke koji su vidljivi na vašem zaslonu ili se reproduciraju na vašem uređaju. To uključuje zaporke, podatke o plaćanju, fotografije, poruke i zvuk."</string> @@ -512,8 +513,9 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši sve"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Povijest"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Dolazno"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Bešumne obavijesti"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"Upozoravajuće obavijesti"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"Zvučne obavijesti"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Razgovori"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Izbriši sve bešumne obavijesti"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Značajka Ne uznemiravaj pauzirala je Obavijesti"</string> @@ -992,6 +994,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dodirnite da biste ponovo pokrenuli tu aplikaciju i prikazali je na cijelom zaslonu."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Postavke za oblačiće za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Dodatno"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodajte natrag u nizove"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljanje"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> i još <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1037,8 +1041,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Popis svih kontrola nije se učitao."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodavanje kontrolama uređaja"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodaj u favorite"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikacija <xliff:g id="APP">%s</xliff:g> predlaže dodavanje ove kontrole u vaše favorite."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Dodaj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Preporuka s kanala <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrole su ažurirane"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN sadrži slova ili simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Potvrdite uređaj <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index d44f837d45c0..63f0f3f319f9 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Képernyőkép elvetése"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Képernyőkép előnézete"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Képernyőrögzítő"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Folyamatban lévő értesítés képernyőrögzítési munkamenethez"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Elindítja a felvételt?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"A felvétel készítése során az Android rendszer rögzítheti az eszközön lejátszott, illetve a képernyőjén megjelenő bizalmas információkat. Ide tartoznak például a jelszavak, a fizetési információk, a fotók, az üzenetek és az audiotartalmak is."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Az összes törlése"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Kezelés"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Előzmények"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Néma értesítések"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Figyelemfelkeltő értesítések"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Beszélgetések"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nincs cím"</string> <string name="restart_button_description" msgid="6916116576177456480">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g>-buborékok beállításai"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kezelés"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> a(z) <xliff:g id="APP_NAME">%2$s</xliff:g> alkalmazásból és <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> további"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nem sikerült betölteni az összes vezérlő listáját."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Más"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Hozzáadás az eszközvezérlőkhöz"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Hozzáadás a kedvencekhez"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"A(z) <xliff:g id="APP">%s</xliff:g> azt javasolta, hogy adja hozzá ezt a vezérlőt a kedvenceihez."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Hozzáadás"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> javasolta"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Vezérlők frissítve"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"A PIN-kód betűket vagy szimbólumokat tartalmaz"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ellenőrzése"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 1ce80ff71e6e..b7343be97439 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Փակել սքրինշոթը"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Սքրինշոթի նախադիտում"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Էկրանի տեսագրիչ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Էկրանի տեսագրման աշխատաշրջանի ընթացիկ ծանուցում"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Սկսե՞լ տեսագրումը"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Տեսագրման ընթացքում Android-ի համակարգը կարող է գրանցել անձնական տեղեկություններ, որոնք տեսանելի են էկրանին կամ նվագարկվում են ձեր սարքում։ Սա ներառում է այնպիսի տեղեկություններ, ինչպիսիք են, օրինակ, գաղտնաբառերը, վճարային տվյալները, լուսանկարները, հաղորդագրությունները և նվագարկվող աուդիո ֆայլերը։"</string> @@ -193,8 +195,8 @@ <string name="accessibility_data_three_bars" msgid="3036562180893930325">"Տվյալների երեք գիծ:"</string> <string name="accessibility_data_signal_full" msgid="283507058258113551">"Տվյալների ազդանշանը լրիվ է:"</string> <string name="accessibility_wifi_name" msgid="4863440268606851734">"Միացված է <xliff:g id="WIFI">%s</xliff:g>-ին:"</string> - <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Կապակցված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string> - <string name="accessibility_cast_name" msgid="7344437925388773685">"Կապակցված է <xliff:g id="CAST">%s</xliff:g>-ին:"</string> + <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Միացված է <xliff:g id="BLUETOOTH">%s</xliff:g>-ին:"</string> + <string name="accessibility_cast_name" msgid="7344437925388773685">"Միացված է <xliff:g id="CAST">%s</xliff:g>-ին:"</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"WiMAX չկա:"</string> <string name="accessibility_wimax_one_bar" msgid="2996915709342221412">"WiMAX-ի մեկ գիծ:"</string> <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"WiMAX-ի երկու գիծ:"</string> @@ -392,7 +394,7 @@ <string name="quick_settings_color_space_label" msgid="537528291083575559">"Գունաշտկման ռեժիմ"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Հավելյալ կարգավորումներ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Պատրաստ է"</string> - <string name="quick_settings_connected" msgid="3873605509184830379">"Կապակցված է"</string> + <string name="quick_settings_connected" msgid="3873605509184830379">"Միացված է"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Միացված է, մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Միանում է..."</string> <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Մոդեմի ռեժիմ"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Մաքրել բոլորը"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Կառավարել"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Պատմություն"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Անձայն ծանուցումներ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Նախազգուշացնող ծանուցումներ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Խոսակցություններ"</string> @@ -965,7 +969,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Ֆոնային ռեժիմում աշխատող հավելվածներ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Հպեք՝ մարտկոցի և թրաֆիկի մանրամասները տեսնելու համար"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Անջատե՞լ բջջային ինտերնետը"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> օպերատորի բջջային ինտերնետը հասանելի չի լինի: Համացանցից կարող եք օգտվել միայն Wi-Fi-ի միջոցով:"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"<xliff:g id="CARRIER">%s</xliff:g> օպերատորի բջջային ինտերնետը հասանելի չի լինի: Համացանցից կկարողանաք օգտվել միայն Wi-Fi-ի միջոցով:"</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"Ձեր"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Քանի որ ներածումն արգելափակված է ինչ-որ հավելվածի կողմից, Կարգավորումները չեն կարող հաստատել ձեր պատասխանը:"</string> <string name="slice_permission_title" msgid="3262615140094151017">"Թույլատրե՞լ <xliff:g id="APP_0">%1$s</xliff:g> հավելվածին ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Անանուն"</string> <string name="restart_button_description" msgid="6916116576177456480">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ի ամպիկների կարգավորումներ"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Կառավարել"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>՝ <xliff:g id="APP_NAME">%2$s</xliff:g>-ից"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>` <xliff:g id="APP_NAME">%2$s</xliff:g>-ից ու ևս <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ամպիկ"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Չհաջողվեց բեռնել բոլոր կառավարների ցանկը։"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Այլ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Ավելացրեք սարքերի կառավարման տարրերում"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Ավելացնել ընտրանիում"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> հավելվածն առաջարկում է ավելացնել այս կառավարը ձեր ընտրանիում։"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Ավելացնել"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Առաջարկվել է <xliff:g id="APP">%s</xliff:g> հավելվածի կողմից"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Կառավարման տարրերը թարմացվեցին"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN կոդը տառեր և նշաններ է պարունակում"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Ստուգել <xliff:g id="DEVICE">%s</xliff:g> սարքը"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 8f506952ed70..f3ac8d1f0192 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Menutup screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratinjau screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perekam Layar"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifikasi yang sedang berjalan untuk sesi rekaman layar"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Mulai Merekam?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Saat merekam, Sistem Android dapat ikut merekam informasi sensitif yang terlihat di layar atau diputar di perangkat Anda. Informasi ini mencakup sandi, info pembayaran, foto, pesan, dan audio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hapus semua"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Kelola"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Histori"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifikasi senyap"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifikasi aktif"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Percakapan"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Tanpa judul"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setelan untuk balon <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Kelola"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lainnya"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Daftar semua kontrol tidak dapat dimuat."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lainnya"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan ke kontrol perangkat"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Tambahkan ke favorit"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> menyarankan kontrol ini ditambahkan ke favorit."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Tambahkan"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Disarankan oleh <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrol diperbarui"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN berisi huruf atau simbol"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifikasi <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index c3e33fcb75d1..d133ed04e221 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Loka skjámynd"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forskoðun skjámyndar"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjáupptaka"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Áframhaldandi tilkynning fyrir skjáupptökulotu"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Hefja upptöku?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Á meðan tekið er upp getur Android kerfið fangað viðkvæmar upplýsingar sem sjást á skjánum eða spilast í tækinu. Þar á meðal eru upplýsingar á borð við aðgangsorð, greiðsluupplýsingar, myndir, skilaboð og hljóð."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hreinsa allt"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Stjórna"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Ferill"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Þöglar tilkynningar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Viðvörunartilkynningar"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtöl"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Enginn titill"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Stillingar fyrir blöðrur frá <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Stjórna"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> frá <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ frá <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> í viðbót"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Ekki tókst að hlaða lista yfir allar stýringar."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annað"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Bæta við tækjastjórnun"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Bæta við uppáhald"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> stakk upp á að bæta þessari stýringu við uppáhald."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Bæta við"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Tillaga frá <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Stýringar uppfærðar"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN inniheldur bókstafi eða tákn"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Staðfesta <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index db33a9a2639c..2ca52dff8bee 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignora screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Anteprima screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Registrazione dello schermo"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notifica costante per una sessione di registrazione dello schermo"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Avviare la registrazione?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante la registrazione, il sistema Android può acquisire dati sensibili visibili sullo schermo o riprodotti sul tuo dispositivo, tra cui password, dati di pagamento, foto, messaggi e audio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Cancella tutto"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestisci"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Cronologia"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notifiche silenziose"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notifiche di avviso"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversazioni"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tocca per riavviare l\'app e passare a schermo intero."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Impostazioni per bolle <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestisci"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g> e altre <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Impossibile caricare l\'elenco di tutti i controlli."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Aggiungi al controllo dei dispositivi"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Aggiungi ai preferiti"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ha suggerito di aggiungere questo controllo ai preferiti."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Aggiungi"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Suggerito da <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controlli aggiornati"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Il PIN contiene lettere o simboli"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifica <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f814e6b94121..9dfadfb2c7dd 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"סגירת צילום מסך"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"תצוגה מקדימה של צילום מסך"</string> <string name="screenrecord_name" msgid="2596401223859996572">"מקליט המסך"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"התראה מתמשכת לסשן הקלטת מסך"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"להתחיל את ההקלטה?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"בזמן ההקלטה, מערכת Android יכולה לתעד מידע רגיש שגלוי במסך או מופעל במכשיר שלך. מידע זה כולל סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ניקוי הכל"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ניהול"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"היסטוריה"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"התראות שקטות"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"התראות עם צלילים או רטט"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ללא שם"</string> <string name="restart_button_description" msgid="6916116576177456480">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"הגדרות בשביל בועות של <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ניהול"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מהאפליקציה <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> מ-<xliff:g id="APP_NAME">%2$s</xliff:g> ועוד <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"לא ניתן היה לטעון את הרשימה של כל הפקדים."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"אחר"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"הוספה לפקדי המכשירים"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"הוספה למועדפים"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"בקרה זו הוצעה על ידי <xliff:g id="APP">%s</xliff:g> להוספה למועדפים."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"הוספה"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"הוצע על-ידי <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"הפקדים עודכנו"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"קוד האימות מכיל אותיות או סמלים"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"אימות <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 4b5394f3cb9d..15508ac75eee 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"スクリーンショットを閉じます"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"スクリーンショットのプレビュー"</string> <string name="screenrecord_name" msgid="2596401223859996572">"スクリーン レコーダー"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"画面の録画セッション中の通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"録画を開始しますか?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"録画中に機密情報が画面に表示されたりデバイスで再生されたりした場合、Android システムでキャプチャされることがあります。これには、パスワード、お支払い情報、写真、メッセージ、音声などが含まれます。"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"すべて消去"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"履歴"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"サイレント通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"バイブレーションまたは音を伴う通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"会話"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"タイトルなし"</string> <string name="restart_button_description" msgid="6916116576177456480">"タップしてこのアプリを再起動すると、全画面表示になります。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> のバブルの設定"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)、他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 件"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"全コントロールの一覧を読み込めませんでした。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"その他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"デバイス コントロールに追加"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"お気に入りに追加"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>が、お気に入りに追加のためにこのコントロールを提案しました。"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"追加"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> によるおすすめ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"コントロールを更新しました"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN に英字や記号を含める"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>の確認"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 242ee8d76a07..36580b7e3fee 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ეკრანის ანაბეჭდის დახურვა"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ეკრანის ანაბეჭდის გადახედვა"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ეკრანის ჩამწერი"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ეკრანის ჩანაწერი მუშავდება"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"უწყვეტი შეტყობინება ეკრანის ჩაწერის სესიისთვის"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"დაიწყოს ჩაწერა?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ჩაწერის განმავლობაში Android სისტემას შეუძლია აღბეჭდოს ნებისმიერი სენსიტიური ინფორმაცია, რომელიც თქვენს ეკრანზე გამოჩნდება ან თქვენს მოწყობილობაზე დაიკვრება. აღნიშნული მოიცავს პაროლებს, გადახდის დეტალებს, ფოტოებს, შეტყობინებებსა და აუდიოს."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ყველას გასუფთავება"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"მართვა"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ისტორია"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"შემომავალი"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ჩუმი შეტყობინებები"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"გამაფრთხილებელი შეტყობინებები"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"საუბრები"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"უსათაურო"</string> <string name="restart_button_description" msgid="6916116576177456480">"შეეხეთ ამ აპის გადასატვირთად და გადადით სრულ ეკრანზე."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"პარამეტრები <xliff:g id="APP_NAME">%1$s</xliff:g> ბუშტებისთვის"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"გადავსება"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ისევ დამატება დასტაზე"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"მართვა"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-ისგან"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g>-დან და კიდევ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"მართვის ყველა საშუალების სია ვერ ჩაიტვირთა."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"სხვა"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"მოწყობილ. მართვის საშუალებებში დამატება"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"რჩეულებში დამატება"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> გთავაზობთ, მართვის ეს საშუალება თქვენს რჩეულებში დაამატოთ."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"დამატება"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"შემოთავაზებულია <xliff:g id="APP">%s</xliff:g>-ის მიერ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"მართვის საშუალებები განახლდა"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-კოდი შეიცავს ასოებს ან სიმბოლოებს"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"დაადასტურეთ <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 598b28186653..4f248284b85d 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотты жабу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотты алдын ала қарау"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Экран жазғыш"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды бейнеге жазудың ағымдағы хабарландыруы"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Жазу басталсын ба?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Жазу кезінде Android жүйесі экранда көрсетілетін немесе құрылғыда ойнатылатын құпия ақпаратты пайдалана алады. Ол ақпаратқа құпия сөздер, төлеу ақпараты, фотосуреттер, хабарлар және аудио жатады."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Барлығын тазалау"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Басқару"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Тарих"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Дыбыссыз хабарландырулар"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Ескертуші хабарландлырулар"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Әңгімелер"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Атауы жоқ"</string> <string name="restart_button_description" msgid="6916116576177456480">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> қалқыма хабарларының параметрлері"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Басқару"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> жіберген хабарландыру: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> қолданбасы жіберген <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> және тағы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Барлық басқару элементі тізімі жүктелмеді."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Басқа"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Құрылғы басқару виджеттеріне қосу"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Таңдаулыларға қосу"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> қолданбасы бұл басқару элементін таңдаулыларға қосып қоюды ұсынды."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Енгізу"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ұсынған"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Басқару элементтері жаңартылды"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN коды әріптерден не таңбалардан құралады."</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> растау"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index fc139319a3b6..11b7514c9129 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ច្រានចោលរូបថតអេក្រង់"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ការមើលរូបថតអេក្រង់សាកល្បង"</string> <string name="screenrecord_name" msgid="2596401223859996572">"មុខងារថតអេក្រង់"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ការជូនដំណឹងដែលកំពុងដំណើរការសម្រាប់រយៈពេលប្រើការថតសកម្មភាពអេក្រង់"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ចាប់ផ្តើមថតឬ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"នៅពេលកំពុងថត ប្រព័ន្ធ Android អាចថតព័ត៌មានរសើបដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលបានចាក់នៅលើឧបករណ៍របស់អ្នក។ ព័ត៌មាននេះរួមមានពាក្យសម្ងាត់ ព័ត៌មានអំពីការបង់ប្រាក់ រូបថត សារ និងសំឡេង។"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"សម្អាតទាំងអស់"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"គ្រប់គ្រង"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ប្រវត្តិ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ការជូនដំណឹងស្ងាត់"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ការជូនដំណឹងញ័រ ឬរោទ៍"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ការសន្ទនា"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"គ្មានចំណងជើង"</string> <string name="restart_button_description" msgid="6916116576177456480">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"ការកំណត់សម្រាប់ពពុះ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"គ្រប់គ្រង"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g> និង <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ទៀត"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"មិនអាចផ្ទុកបញ្ជីនៃការគ្រប់គ្រងទាំងអស់បានទេ។"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ផ្សេងៗ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"បញ្ចូលទៅក្នុងផ្ទាំងគ្រប់គ្រងឧបករណ៍"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"បញ្ចូលទៅក្នុងសំណព្វ"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> បានណែនាំឱ្យបញ្ចូលការគ្រប់គ្រងនេះទៅក្នុងសំណព្វរបស់អ្នក។"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"បញ្ចូល"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"បានណែនាំដោយ <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"បានធ្វើបច្ចុប្បន្នភាពការគ្រប់គ្រង"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"កូដ PIN មានអក្សរ ឬនិមិត្តសញ្ញា"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"ផ្ទៀងផ្ទាត់ <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 4dd6814d9122..fc0844a6cc0c 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -33,7 +33,7 @@ <string name="invalid_charger_title" msgid="938685362320735167">"USB ಮೂಲಕ ಚಾರ್ಜ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ನೀಡಲಾಗಿರುವ ಚಾರ್ಜರ್ ಬಳಸಿ"</string> <string name="battery_low_why" msgid="2056750982959359863">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಮಾಡುವುದೇ?"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಮಾಡಬೇಕೇ?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಕುರಿತು"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"ಆನ್ ಮಾಡಿ"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಮಾಡಿ"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ಅನ್ನು ವಜಾಗೊಳಿಸಿ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ಸ್ಕ್ರೀನ್ಶಾಟ್ನ ಪೂರ್ವವೀಕ್ಷಣೆ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡರ್"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಸೆಶನ್ಗಾಗಿ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಅಧಿಸೂಚನೆ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ರೆಕಾರ್ಡಿಂಗ್ ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ರೆಕಾರ್ಡಿಂಗ್ ಸಮಯದಲ್ಲಿ, ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಗೋಚರಿಸುವ ಅಥವಾ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲಾದ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು Android ಸಿಸ್ಟಂ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಬಹುದು. ಇದು ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ಮಾಹಿತಿ, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೋವನ್ನು ಒಳಗೊಂಡಿದೆ."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ಅಧಿಸೂಚನೆ ವಜಾಗೊಂಡಿದೆ."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ಬಬಲ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ಅಧಿಸೂಚನೆಯ ಛಾಯೆ."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ಲಾಕ್ ಪರದೆ."</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ನಿರ್ವಹಿಸಿ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ಇತಿಹಾಸ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ನಿಶ್ಶಬ್ಧ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ಎಚ್ಚರಿಸುವ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ಸಂಭಾಷಣೆಗಳು"</string> @@ -961,7 +964,7 @@ <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"(<xliff:g id="ID_1">%s</xliff:g>) ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ಸ್ವಯಂಚಾಲಿತ ನಿಯಮ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ."</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> ತನಕ"</string> - <string name="qs_dnd_keep" msgid="3829697305432866434">"ಇರಿಸಿ"</string> + <string name="qs_dnd_keep" msgid="3829697305432866434">"Keep"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"ಬದಲಿಸಿ"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಿನ್ನೆಲೆಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿವೆ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ಬ್ಯಾಟರಿ,ಡೇಟಾ ಬಳಕೆಯ ವಿವರಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ಯಾವುದೇ ಶೀರ್ಷಿಕೆಯಿಲ್ಲ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಬಬಲ್ಸ್ಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ನಿರ್ವಹಿಸಿ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಆ್ಯಪ್ನ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ಮತ್ತು <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ಹೆಚ್ಚಿನವುಗಳ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1028,13 +1035,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ಪವರ್ ಮೆನುವಿನಿಂದ ಪ್ರವೇಶಿಸಲು ನಿಯಂತ್ರಣಗಳನ್ನು ಆರಿಸಿ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ನಿಯಂತ್ರಣಗಳನ್ನು ಮರುಹೊಂದಿಸಲು ಹೋಲ್ಡ್ ಮಾಡಿ ಮತ್ತು ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲಾಗಿಲ್ಲ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ಎಲ್ಲಾ ನಿಯಂತ್ರಣಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಆಗಲಿಲ್ಲ."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ಇತರ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ಸಾಧನ ನಿಯಂತ್ರಣಗಳಿಗೆ ಸೇರಿಸಿ"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸಿ"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"ಈ ನಿಯಂತ್ರಣವನ್ನು ನಿಮ್ಮ ಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸಲು <xliff:g id="APP">%s</xliff:g> ಸೂಚಿಸಿದೆ."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ಸೇರಿಸಿ"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ ಸೂಚಿಸಿದೆ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ನಿಯಂತ್ರಣಗಳನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ಪಿನ್ ಅಕ್ಷರಗಳು ಅಥವಾ ಸಂಕೇತಗಳನ್ನು ಒಳಗೊಂಡಿದೆ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ಅನ್ನು ಪರಿಶೀಲಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index a56bf4a1683a..cca8adbc440b 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"스크린샷 닫기"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"스크린샷 미리보기"</string> <string name="screenrecord_name" msgid="2596401223859996572">"화면 녹화"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"화면 녹화 세션에 관한 지속적인 알림"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"녹화를 시작하시겠습니까?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Android 시스템이 녹화 중에 화면에 표시되거나 기기에서 재생되는 민감한 정보를 캡처할 수 있습니다. 여기에는 비밀번호, 결제 정보, 사진, 메시지 및 오디오가 포함됩니다."</string> @@ -509,8 +511,10 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"모두 지우기"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"관리"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"기록"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"무음 알림"</string> - <string name="notification_section_header_alerting" msgid="3168140660646863240">"주의를 끄는 알림"</string> + <string name="notification_section_header_alerting" msgid="3168140660646863240">"소리 알림"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"대화"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"무음 알림 모두 삭제"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"방해 금지 모드로 일시중지된 알림"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"제목 없음"</string> <string name="restart_button_description" msgid="6916116576177456480">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> 대화창 설정"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"관리"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> 외 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>개의 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"전체 컨트롤 목록을 로드할 수 없습니다."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"기타"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"기기 제어에 추가"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"즐겨찾기에 추가"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>에서 이 제어 기능을 즐겨찾기에 추가할 것을 제안합니다."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"추가"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g>에서 제안"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"컨트롤 업데이트됨"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN에 문자나 기호가 포함됨"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> 확인"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index fda3a051ded2..15e53cd5d8c3 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -62,8 +62,8 @@ <string name="usb_debugging_always" msgid="4003121804294739548">"Бул компүтерден дайыма уруксат берилсин"</string> <string name="usb_debugging_allow" msgid="1722643858015321328">"Уруксат берүү"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string> - <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"Бул тармакта мүчүлүштүктөрдү Wi-Fi аркылуу оңдоого уруксат берилсинби?"</string> + <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү аныктоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"Ушул тармакта мүчүлүштүктөрдү Wi-Fi аркылуу аныктоого уруксат бересизби?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Тармактын аталышы (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi дареги (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Бул тармакта ар дайым уруксат берилсин"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Уруксат берүү"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Скриншотту четке кагуу"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Скриншотту алдын ала көрүү"</string> <string name="screenrecord_name" msgid="2596401223859996572">"экрандан видео жаздырып алуу"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Экранды жаздыруу сеансы боюнча учурдагы билдирме"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Жаздырып баштайсызбы?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Жаздыруу учурунда Android тутуму экраныңызда көрүнүп турган жана түзмөктө ойноп жаткан бардык купуя маалыматты жаздырып алат. Буга сырсөздөр, төлөм маалыматы, сүрөттөр, билдирүүлөр жана аудио файлдар кирет."</string> @@ -153,21 +155,21 @@ <string name="biometric_dialog_wrong_pin" msgid="1878539073972762803">"PIN код туура эмес"</string> <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"Графикалык ачкыч туура эмес"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"Сырсөз туура эмес"</string> - <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Өтө көп жолу туура эмес аракет кылынды.\n<xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайра кайталаңыз."</string> + <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"Өтө көп жолу жаңылдыңыз.\n<xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайра кайталаңыз."</string> <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"Кайра кайталаңыз. <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> аракеттен <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> аракет калды."</string> - <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"Дайын-даректериңиз өчүрүлөт"</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"Акыркы аракет калды"</string> <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"Эгер графикалык ачкычты кийинки жолу туура эмес киргизсеңиз, бул түзмөктүн маалыматы өчүрүлөт."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"Эгер PIN кодду кийинки жолу туура эмес киргизсеңиз, бул түзмөктүн маалыматы өчүрүлөт."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"Эгер сырсөздү кийинки жолу туура эмес киргизсеңиз, бул түзмөктүн маалыматы өчүрүлөт."</string> <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"Эгер графикалык кийинки жолу туура эмес киргизсеңиз, бул колдонуучу өчүрүлөт."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"Эгер PIN кодду кийинки жолу туура эмес киргизсеңиз, бул колдонуучу өчүрүлөт."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"Эгер сырсөздү кийинки жолу туура эмес киргизсеңиз, бул колдонуучу өчүрүлөт."</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Эгер графикалык ачкычты кийинки жолу туура эмес киргизсеңиз, жумуш профилиңиз жана анын маалыматы өчүрүлөт."</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Эгер PIN кодду кийинки жолу туура эмес киргизсеңиз, жумуш профилиңиз жана анын маалыматы өчүрүлөт."</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Эгер сырсөздү кийинки жолу туура эмес киргизсеңиз, жумуш профилиңиз жана анын маалыматы өчүрүлөт."</string> - <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Өтө көп жолу туура эмес аракет кылынды. Бул түзмөктүн маалыматы өчүрүлөт."</string> - <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Өтө көп жолу туура эмес аракет кылынды. Бул колдонуучу өчүрүлөт."</string> - <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Өтө көп жолу туура эмес аракет кылынды. Бул жумуш профили жана андагы маалымат өчүрүлөт."</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Эгер графикалык ачкычты дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Эгер PIN кодду дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Эгер сырсөздү дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Өтө көп жолу жаңылдыңыз. Бул түзмөктөгү дайын-даректер өчүрүлөт."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Өтө көп жолу жаңылдыңыз. Бул колдонуучу өчүрүлөт."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Өтө көп жолу жаңылдыңыз. Бул жумуш профили жана андагы маалымат өчүрүлөт."</string> <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Жабуу"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Манжа изинин сенсорун басыңыз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Манжа изинин сүрөтчөсү"</string> @@ -374,7 +376,7 @@ <string name="quick_settings_user_title" msgid="8673045967216204537">"Колдонуучу"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Жаңы колдонуучу"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> - <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Туташкан жок"</string> + <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Байланышкан жок"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Желе жок"</string> <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi өчүк"</string> <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi күйүк"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Баарын тазалап салуу"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Башкаруу"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Таржымал"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Үнсүз билдирмелер"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Эскертүүлөр"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Жазышуулар"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Аталышы жок"</string> <string name="restart_button_description" msgid="6916116576177456480">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн, таптап коюңуз."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> калкып чыкма билдирмелер жөндөөлөрү"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Башкаруу"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> колдонмосунан <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> жана дагы <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> колдонмодон <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бардык көзөмөлдөрдүн тизмеси жүктөлгөн жок."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Башка"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Түзмөктү башкаруу элементтерине кошуу"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Сүйүктүүлөргө кошуу"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> бул көзөмөлдү сүйүктүүлөргө кошууну сунуштады."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Кошуу"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> сунуштайт"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Башкаруу элементтери жаңырды"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN код тамгаларды же символдорду камтыйт"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> түзмөгүн ырастаңыз"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 1ff99d586a47..0c403db2e845 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ປິດຮູບໜ້າຈໍ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ຕົວຢ່າງຮູບໜ້າຈໍ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ໂປຣແກຣມບັນທຶກໜ້າຈໍ"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"ກຳລັງປະມວນຜົນການບັນທຶກໜ້າຈໍ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ການແຈ້ງເຕືອນສຳລັບເຊດຊັນການບັນທຶກໜ້າຈໍໃດໜຶ່ງ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ເລີ່ມການບັນທຶກບໍ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ໃນລະຫວ່າງການບັນທຶກ, ລະບົບ Android ຈະສາມາດບັນທຶກຂໍ້ມູນທີ່ລະອຽດອ່ອນໃດກໍຕາມທີ່ສະແດງຢູ່ໜ້າຈໍຂອງທ່ານ ຫຼື ຫຼິ້ນຢູ່ອຸປະກອນທ່ານ. ນີ້ຮວມເຖິງລະຫັດຜ່ານ, ຂໍ້ມູນການຈ່າຍເງິນ, ຮູບ, ຂໍ້ຄວາມ ແລະ ສຽງນຳ."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ລຶບລ້າງທັງໝົດ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ຈັດການ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ປະຫວັດ"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"ຂາເຂົ້າ"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ການແຈ້ງເຕືອນແບບງຽບ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ການແຈ້ງເຕືອນການເຕືອນ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ການສົນທະນາ"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ບໍ່ມີຊື່"</string> <string name="restart_button_description" msgid="6916116576177456480">"ແຕະເພື່ອຣີສະຕາດແອັບນີ້ ແລະ ໃຊ້ແບບເຕັມຈໍ."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"ການຕັ້ງຄ່າສຳລັບຟອງ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"ລົ້ນ"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"ເພີ່ມກັບໄປຫາການວາງຊ້ອນກັນ"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"ຈັດການ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g> ແລະ ອີກ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"ບໍ່ສາມາດໂຫຼດລາຍຊື່ການຄວບຄຸມທັງໝົດໄດ້."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ອື່ນໆ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ເພີ່ມໃສ່ການຄວບຄຸມອຸປະກອນ"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ເພີ່ມໃສ່ລາຍການທີ່ມັກ"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ແນະນຳການຄວບຄຸມນີ້ເພື່ອເພີ່ມໃສ່ລາຍການທີ່ທ່ານມັກ."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ເພີ່ມ"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"ແນະນຳໂດຍ <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ອັບເດດການຄວບຄຸມແລ້ວ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN ປະກອບມີຕົວອັກສອນ ຫຼື ສັນຍາລັກ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"ຢັ້ງຢືນ <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index fd75874c18d3..95570bc157b2 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Praleisti ekrano kopiją"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrano kopijos peržiūra"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrano vaizdo įrašytuvas"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Šiuo metu rodomas ekrano įrašymo sesijos pranešimas"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Pradėti įrašymą?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Įrašant „Android“ sistema gali fiksuoti bet kokią neskelbtiną informaciją, rodomą ekrane ar leidžiamą įrenginyje. Tai apima slaptažodžius, išsamią mokėjimo informaciją, nuotraukas, pranešimus ir garso įrašus."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Viską išvalyti"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Tvarkyti"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istorija"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tylieji pranešimai"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Įspėjamieji pranešimai"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Pokalbiai"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nėra pavadinimo"</string> <string name="restart_button_description" msgid="6916116576177456480">"Palieskite, kad paleistumėte iš naujo šią programą arba įjungtumėte viso ekrano režimą."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ burbulų nustatymai"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Tvarkyti"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“ ir dar <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nepavyko įkelti visų valdiklių sąrašo."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Kita"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pridėjimas prie įrenginio valdiklių"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Pridėjimas prie mėgstamiausių"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"„<xliff:g id="APP">%s</xliff:g>“ pasiūlė pridėti šį valdiklį prie mėgstamiausių."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Pridėti"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Siūlo „<xliff:g id="APP">%s</xliff:g>“"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Valdikliai atnaujinti"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN kodą sudaro raidės arba simboliai"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> patvirtinimas"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index d708e5b983a4..3a01e0ea74aa 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Nerādīt ekrānuzņēmumu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekrānuzņēmuma priekšskatījums"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrāna ierakstītājs"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Aktīvs paziņojums par ekrāna ierakstīšanas sesiju"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vai sākt ierakstīšanu?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Ierakstīšanas laikā Android sistēmā var tikt tverta jebkura sensitīvā informācija, kas ir redzama jūsu ekrānā vai tiek atskaņota jūsu ierīcē. Šī informācija ir paroles, maksājumu informācija, fotoattēli, ziņojumi un audio."</string> @@ -512,6 +514,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Dzēst visu"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Pārvaldīt"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Vēsture"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Klusie paziņojumi"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Paziņojumi ar skaņu vai vibrāciju"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Sarunas"</string> @@ -992,6 +996,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nav nosaukuma"</string> <string name="restart_button_description" msgid="6916116576177456480">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> burbuļu iestatījumi"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Pārvaldīt"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no lietotnes “<xliff:g id="APP_NAME">%2$s</xliff:g>” un vēl <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1037,8 +1045,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nevarēja ielādēt sarakstu ar visām vadīklām."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Cita"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pievienošana ierīču vadīklām"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Pievienot izlasei"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ieteica pievienot šo vadīklu izlasei."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Pievienot"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Ieteica: <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Vadīklas atjauninātas"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN ietver burtus vai simbolus."</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifikācija: <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 9012b414fb6a..7aab7f6d979e 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Отфрлете ја сликата од екранот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед на слика од екранот"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач на екран"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Да се започне со снимање?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"При снимањето, системот Android може да ги сними сите чувствителни податоци што се видливи на вашиот екран или пуштени на уредот. Ова вклучува лозинки, податоци за плаќање, фотографии, пораки и аудио."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Избриши сѐ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управувајте"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Историја"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Тивки известувања"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Известувања за предупредување"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговори"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслов"</string> <string name="restart_button_description" msgid="6916116576177456480">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Поставки за балончињата за <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управување"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> од <xliff:g id="APP_NAME">%2$s</xliff:g> и уште <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не можеше да се вчита списокот со сите контроли."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друга"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Додајте во контроли за уредите"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Додај во омилени"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> предложи да ја додадете контролава во вашите омилени."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Додај"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Предложено од <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Контролите се ажурирани"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-кодот содржи букви или симболи"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Потврдете го <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 8581a658dae9..466d6d4466e8 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"സ്ക്രീൻഷോട്ട് ഡിസ്മിസ് ചെയ്യുക"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"സ്ക്രീൻഷോട്ട് പ്രിവ്യു"</string> <string name="screenrecord_name" msgid="2596401223859996572">"സ്ക്രീൻ റെക്കോർഡർ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ഒരു സ്ക്രീൻ റെക്കോർഡിംഗ് സെഷനായി നിലവിലുള്ള അറിയിപ്പ്"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"റെക്കോർഡിംഗ് ആരംഭിക്കണോ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"റെക്കോർഡ് ചെയ്യുമ്പോൾ, നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ഉപകരണത്തിൽ പ്ലേ ചെയ്യുന്നതോ ആയ ഏത് തന്ത്രപ്രധാന വിവരങ്ങളും Android സിസ്റ്റത്തിന് പകർത്താനാവും. പാസ്വേഡുകൾ, പേയ്മെന്റ് വിവരം, ഫോട്ടോകൾ, സന്ദേശങ്ങൾ, ഓഡിയോ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"അറിയിപ്പ് നിരസിച്ചു."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ബബ്ൾ ഡിസ്മിസ് ചെയ്തു."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"അറിയിപ്പ് ഷെയ്ഡ്."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ദ്രുത ക്രമീകരണങ്ങൾ."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ലോക്ക് സ്ക്രീൻ."</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"എല്ലാം മായ്ക്കുക"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"മാനേജ് ചെയ്യുക"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ചരിത്രം"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"നിശബ്ദ അറിയിപ്പുകൾ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"മുന്നറിയിപ്പ് നൽകുന്ന അറിയിപ്പുകൾ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"സംഭാഷണങ്ങൾ"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"പേരില്ല"</string> <string name="restart_button_description" msgid="6916116576177456480">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്യാനും പൂർണ്ണ സ്ക്രീനാവാനും ടാപ്പ് ചെയ്യുക."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ബബിളുകളുടെ ക്രമീകരണം"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"മാനേജ് ചെയ്യുക"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-ൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> കൂടുതലും"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"പവർ മെനുവിൽ നിന്ന് ആക്സസ് ചെയ്യേണ്ട നിയന്ത്രണങ്ങൾ തിരഞ്ഞെടുക്കുക"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ പിടിച്ച് വലിച്ചിടുക"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"മാറ്റങ്ങൾ സംരക്ഷിച്ചിട്ടില്ല"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"എല്ലാ നിയന്ത്രണങ്ങളുടെയും ലിസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"മറ്റുള്ളവ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ഉപകരണ നിയന്ത്രണങ്ങളിലേക്ക് ചേർക്കുക"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"പ്രിയപ്പെട്ടവയിലേക്ക് ചേർക്കുക"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"ഈ നിയന്ത്രണത്തെ നിങ്ങളുടെ പ്രിയപ്പെട്ടവയിലേക്ക് ചേർക്കാൻ <xliff:g id="APP">%s</xliff:g> ശുപാർശ ചെയ്തു."</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"നിയന്ത്രണങ്ങൾ അപ്ഡേറ്റ് ചെയ്തു"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"പിന്നിൽ അക്ഷരങ്ങളോ ചിഹ്നങ്ങളോ അടങ്ങിയിരിക്കുന്നു"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> പരിശോധിച്ചുറപ്പിക്കുക"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 4a3a5cd0c3c4..dcff60062647 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Дэлгэцийн агшныг хаах"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Дэлгэцийн агшныг урьдчилан үзэх"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Дэлгэцийн үйлдэл бичигч"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Дэлгэц бичих горимын үргэлжилж буй мэдэгдэл"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Бичлэгийг эхлүүлэх үү?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Бичих үед Андройд систем нь таны дэлгэц дээр харагдах эсвэл төхөөрөмж дээрээ тоглуулсан аливаа эмзэг мэдээллийг авах боломжтой. Үүнд нууц үг, төлбөрийн мэдээлэл, зураг, зурвас болон аудио багтана."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Бүгдийг арилгах"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Удирдах"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Түүх"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Чимээгүй мэдэгдэл"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Сэрэмжлүүлэх мэдэгдэл"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Харилцан яриа"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Гарчиггүй"</string> <string name="restart_button_description" msgid="6916116576177456480">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н бөмбөлгүүдийн тохиргоо"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Удирдах"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>-н <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> болон бусад <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Бүх хяналтын жагсаалтыг ачаалж чадсангүй."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Бусад"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Төхөөрөмжийн хяналт руу нэмэх"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Дуртайд нэмэх"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> нь энэ хяналтыг дуртайдаа нэмэхийг санал болгосон."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Нэмэх"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g>-н санал болгосон"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Хяналтуудыг шинэчиллээ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ПИН нь үсэг эсвэл дүрс тэмдэгт агуулдаг"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>-г бататгах"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 530dbfb69b9d..5497d70ca5b8 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रीनशॉट डिसमिस करा"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रीनशॉटचे पूर्वावलोकन"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रीन रेकॉर्डर"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"स्क्रीन रेकॉर्ड सत्रासाठी सुरू असलेली सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकॉर्डिंग सुरू करायचे आहे का?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रेकॉर्डिंग करताना, Android सिस्टम तुमच्या स्क्रीनवर दिसणारी किंवा तुमच्या डिव्हाइसवर प्ले केलेली कोणतीही संवेदनशील माहिती कॅप्चर करू शकते. यात पासवर्ड, पेमेंट माहिती, फोटो, मेसेज आणि ऑडिओचा समावेश आहे."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना डिसमिस केल्या."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"बबल डिसमिस केला."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना शेड."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"द्रुत सेटिंग्ज."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"लॉक स्क्रीन."</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सर्व साफ करा"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थापित करा"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"सायलंट सूचना"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"लक्ष वेधून घेणाऱ्या सूचना"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"संभाषणे"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक नाही"</string> <string name="restart_button_description" msgid="6916116576177456480">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबलसाठी सेटिंग्ज"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापित करा"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> आणि आणखी <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> कडून <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पॉवर मेनूमधून अॅक्सेस करण्यासाठी नियंत्रणे निवडा"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"नियंत्रणांची पुनर्रचना करण्यासाठी धरून ठेवा आणि ड्रॅग करा"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"सर्व नियंत्रणे काढून टाकली आहेत"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"बदल सेव्ह केले गेले नाहीत"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"सर्व नियंत्रणांची सूची लोड करता आली नाही."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"इतर"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"डिव्हाइस नियंत्रणांमध्ये जोडा"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"आवडीचे यामध्ये जोडा"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ने तुमच्या आवडीचे मध्ये जोडण्यासाठी या नियंत्रणाची शिफारस केली आहे."</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियंत्रणे अपडेट केली आहेत"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"पिनमध्ये अक्षरांचा किंवा चिन्हांचा समावेश असतो"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ची पडताळणी करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 482d60894cc5..e39448067aa5 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ketepikan tangkapan skrin"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pratonton tangkapan skrin"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Perakam Skrin"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Pemberitahuan breterusan untuk sesi rakaman skrin"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Mula Merakam?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Semasa merakam, Sistem Android dapat menangkap mana-mana maklumat sensitif yang kelihatan pada skrin anda atau yang dimainkan pada peranti anda. Ini termasuklah kata laluan, maklumat pembayaran, foto, mesej dan audio."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Kosongkan semua"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Urus"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Sejarah"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Pemberitahuan senyap"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Pemberitahuan memaklumi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Perbualan"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string> <string name="restart_button_description" msgid="6916116576177456480">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tetapan untuk gelembung <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Urus"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g> dan <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> lagi"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Senarai semua kawalan tidak dapat dimuatkan."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Lain-lain"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Tambahkan pada kawalan peranti"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Tambahkan pada kegemaran"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> mencadangkan kawalan ini untuk ditambahkan pada kegemaran anda."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Tambah"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Dicadangkan oleh <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kawalan dikemas kini"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN mengandungi huruf atau simbol"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Sahkan <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 6366acbd8d34..8a0a615e862a 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ဖန်သားပြင်ဓာတ်ပုံ ပယ်ရန်"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ဖန်သားပြင်ဓာတ်ပုံ အစမ်းကြည့်ရှုခြင်း"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ဖန်သားပြင် ရိုက်ကူးမှု"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"စတင် ရိုက်ကူးမလား။"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ရိုက်ကူးနေစဉ်အတွင်း Android စနစ်သည် သင့်မျက်နှာပြင်ပေါ်တွင် မြင်နိုင်သော သို့မဟုတ် သင့်စက်ပစ္စည်းတွင် ဖွင့်ထားသော အရေးကြီးသည့် အချက်အလက်မှန်သမျှကို ရိုက်ကူးနိုင်သည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှု အချက်အလက်၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် အသံများ ပါဝင်သည်။"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"အားလုံး ဖယ်ရှားရန်"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"စီမံရန်"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"မှတ်တမ်း"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"အကြောင်းကြားချက်များကို သတိပေးခြင်း"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"စကားဝိုင်းများ"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ခေါင်းစဉ် မရှိပါ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ဤအက်ပ်ကို ပြန်စတင်ပြီး မျက်နှာပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပူဖောင်းကွက်အတွက် ဆက်တင်များ"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"စီမံရန်"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> မှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> နှင့် နောက်ထပ် <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ခုမှ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"ထိန်းချုပ်မှုအားလုံး၏ စာရင်းကို ဖွင့်၍မရပါ။"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"အခြား"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"စက်ထိန်းစနစ်သို့ ထည့်ရန်"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"အကြိုက်ဆုံးများသို့ ထည့်ရန်"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> သည် ဤခလုတ်ကို သင့်အကြိုက်ဆုံးများသို့ ထည့်ရန် အကြံပြုထားသည်။"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ထည့်ရန်"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> က အကြံပြုထားသည်"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ထိန်းချုပ်မှု အပ်ဒိတ်လုပ်ပြီးပြီ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ပင်နံပါတ်တွင် စာလုံး သို့မဟုတ် သင်္ကေတများပါဝင်သည်"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ကို အတည်ပြုခြင်း"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3fd742e15c5e..2c57ed2ce0be 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Avvis skjermdumpen"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Forhåndsvisning av skjermdump"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skjermopptaker"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Vedvarende varsel for et skjermopptak"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vil du starte opptaket?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Under opptak kan Android-systemet registrere all sensitiv informasjon som er synlig på skjermen eller spilles av på enheten. Dette inkluderer passord, betalingsinformasjon, bilder, meldinger og lyd."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Fjern alt"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrer"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Logg"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Lydløse varsler"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Varsler med varsling"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Samtaler"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen tittel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Innstillinger for <xliff:g id="APP_NAME">%1$s</xliff:g>-bobler"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Administrer"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g> og <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> flere"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listen over alle kontroller kunne ikke lastes inn."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Annet"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Legg til i enhetsstyring"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Legg til som favoritt"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> har foreslått at du legger denne kontrollen til i favorittene dine."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Legg til"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Foreslått av <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrollene er oppdatert"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-koden inneholder bokstaver eller symboler"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Bekreft <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 6a9fb2aadeda..8d0adc0b4f2d 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -28,7 +28,7 @@ <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी"</string> <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> बाँकी, तपाईंको प्रयोगका आधारमा करिब <xliff:g id="TIME">%2$s</xliff:g> बाँकी छ"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> बाँकी, करिब <xliff:g id="TIME">%2$s</xliff:g> बाँकी छ"</string> - <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी। ब्याट्री सेभर सक्रिय छ।"</string> + <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> बाँकी। ब्याट्री सेभर अन छ ।"</string> <string name="invalid_charger" msgid="4370074072117767416">"USB मार्फत चार्ज गर्न सकिँदैन। तपाईंको यन्त्रसँगै आएको चार्जर प्रयोग गर्नुहोस्।"</string> <string name="invalid_charger_title" msgid="938685362320735167">"USB मार्फत चार्ज गर्न सकिँदैन"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"तपाईंको यन्त्रसँगै आएको चार्जर प्रयोग गर्नुहोस्"</string> @@ -47,10 +47,10 @@ <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"इनपुट विधिहरू सेटअप गर्नुहोस्"</string> <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"वास्तविक किबोर्ड"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> माथि पहुँच राख्ने अनुमति दिने हो?"</string> - <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> माथि पहुँच राख्न अनुमति दिने हो?\nयो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> + <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> माथि पहुँच राख्न अनुमति दिने हो?\nयो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> माथि पहुँच राख्ने अनुमति दिने हो?"</string> <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> को व्यवस्थापन गर्न <xliff:g id="APPLICATION">%1$s</xliff:g> खोल्ने हो?"</string> - <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> सञ्चालन गर्न खोल्ने हो?\nयो अनुप्रयोगलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> + <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> सञ्चालन गर्न खोल्ने हो?\nयो एपलाई रेकर्ड गर्ने अनुमति प्रदान गरिएको छैन तर यसले USB यन्त्रमार्फत अडियो क्याप्चर गर्न सक्छ।"</string> <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> को व्यवस्थापन गर्न <xliff:g id="APPLICATION">%1$s</xliff:g> खोल्ने हो?"</string> <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"यस USB उपकरणसँग स्थापित एप काम गर्दैन। यस उपकरणको बारेमा <xliff:g id="URL">%1$s</xliff:g> मा धेरै जान्नुहोस्"</string> <string name="title_usb_accessory" msgid="1236358027511638648">"USB सहयोगी"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"स्क्रिनसट हटाउनुहोस्"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"स्क्रिनसटको पूर्वावलोकन"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"रेकर्ड गर्न थाल्ने हो?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"रेकर्ड गर्दा, Android प्रणालीले तपाईंको स्क्रिनमा देखिने वा तपाईंको यन्त्रमा प्ले गरिने सबै संवेदनशील जानकारी रेकर्ड गर्न सक्छ। यो जानकारीमा पासवर्ड, भुक्तानीसम्बन्धी जानकारी, फोटो, सन्देश र अडियो समावेश हुन्छ।"</string> @@ -194,7 +196,7 @@ <string name="accessibility_data_signal_full" msgid="283507058258113551">"डेटा संकेत पूर्ण।"</string> <string name="accessibility_wifi_name" msgid="4863440268606851734">"<xliff:g id="WIFI">%s</xliff:g> मा जडित।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> मा जडित।"</string> - <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> मा जडान गरियो।"</string> + <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> मा कनेक्ट गरियो।"</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"वाइम्यास छैन।"</string> <string name="accessibility_wimax_one_bar" msgid="2996915709342221412">"WiMAX एउटा पट्टि।"</string> <string name="accessibility_wimax_two_bars" msgid="7335485192390018939">"वाइम्याक्स दुईवटा बारहरू।"</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"सूचना खारेज।"</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"बबल हटाइयो।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"सूचना कक्ष।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"द्रुत सेटिङहरू"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"स्क्रीन बन्द गर्नुहोस्।"</string> @@ -499,9 +500,9 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"प्रयोगकर्ता हटाउन चाहनुहुन्छ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"यस प्रयोगकर्ताको सबै एपहरू तथा डेटा हटाइने छ।"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"हटाउनुहोस्"</string> - <string name="battery_saver_notification_title" msgid="8419266546034372562">"ब्याट्री सेभर सक्रिय छ"</string> + <string name="battery_saver_notification_title" msgid="8419266546034372562">"ब्याट्री सेभर अन छ"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string> - <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ब्याट्री सेभर निष्क्रिय पार्नुहोस्"</string> + <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ब्याट्री सेभर अफ गर्नुहोस्"</string> <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, तस्बिर, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"यो कार्य प्रदान गर्ने सेवाले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, तस्बिर, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रेकर्ड गर्न वा cast गर्न थाल्ने हो?"</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"सबै हटाउनुहोस्"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थित गर्नुहोस्"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"मौन सूचनाहरू"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"कम्पन वा आवाजसहितका सूचनाहरू"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string> @@ -581,7 +584,7 @@ <string name="hidden_notifications_cancel" msgid="4805370226181001278">"धन्यवाद पर्दैन"</string> <string name="hidden_notifications_setup" msgid="2064795578526982467">"सेटअप गर्नुहोस्"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> - <string name="volume_zen_end_now" msgid="5901885672973736563">"अहिले नै निष्क्रिय पार्नुहोस्"</string> + <string name="volume_zen_end_now" msgid="5901885672973736563">"अहिले नै अफ गर्नुहोस्"</string> <string name="accessibility_volume_settings" msgid="1458961116951564784">"ध्वनिसम्बन्धी सेटिङहरू"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"विस्तार गर्नुहोस्"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"संक्षिप्त पार्नुहोस्"</string> @@ -682,7 +685,7 @@ <string name="do_not_silence" msgid="4982217934250511227">"मौन नगर्नुहोस्"</string> <string name="do_not_silence_block" msgid="4361847809775811849">"मौन नगर्नुहोस् वा नरोक्नुहोस्"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"सशक्त सूचना नियन्त्रण"</string> - <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"सक्रिय"</string> + <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"अन छ"</string> <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"निष्क्रिय"</string> <string name="power_notification_controls_description" msgid="1334963837572708952">"सशक्त सूचना नियन्त्रणहरू मार्फत तपाईं अनुप्रयाेगका सूचनाहरूका लागि ० देखि ५ सम्मको महत्व सम्बन्धी स्तर सेट गर्न सक्नुहुन्छ। \n\n"<b>"स्तर ५"</b>" \n- सूचनाको सूचीको माथिल्लो भागमा देखाउने \n- पूर्ण स्क्रिनमा अवरोधका लागि अनुमति दिने \n- सधैँ चियाउने \n\n"<b>"स्तर ४"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- सधैँ चियाउने \n\n"<b>"स्तर ३"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- कहिल्यै नचियाउने \n\n"<b>"स्तर २"</b>" \n- पूर्ण स्क्रिनमा अवरोधलाई रोक्ने \n- कहिल्यै नचियाउने \n- कहिल्यै पनि आवाज ननिकाल्ने र कम्पन नगर्ने \n\n"<b>"स्तर १"</b>" \n- पूर्ण स्क्रिनमा अवरोध रोक्ने \n- कहिल्यै नचियाउने \n- कहिल्यै पनि आवाज ननिकाल्ने वा कम्पन नगर्ने \n- लक स्क्रिन र वस्तुस्थिति पट्टीबाट लुकाउने \n- सूचनाको सूचीको तल्लो भागमा देखाउने \n\n"<b>"स्तर ०"</b>" \n- अनुप्रयोगका सबै सूचनाहरूलाई रोक्ने"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"सूचनाहरू"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"शीर्षक छैन"</string> <string name="restart_button_description" msgid="6916116576177456480">"यो एप पुनः सुरु गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> का बबलसम्बन्धी सेटिङहरू"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"व्यवस्थापन गर्नुहोस्"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> को <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> का <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> र थप <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"पावर मेनुबाट प्रयोग गर्न चाहेका नियन्त्रण सुविधाहरू छान्नुहोस्"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"नियन्त्रणहरूको क्रम मिलाउन तिनलाई थिचेर ड्र्याग गर्नुहोस्"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"सबै नियन्त्रणहरू हटाइए"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"परिवर्तनहरू सुरक्षित गरिएका छैनन्"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"सबै नियन्त्रणहरूको सूची लोड गर्न सकिएन।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"अन्य"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"यन्त्र नियन्त्रण गर्ने विजेटहरूको सूचीमा थप्नुहोस्"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"मन पर्ने कुराहरूमा थप्नुहोस्"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ले यो नियन्त्रण तपाईंका मन पर्ने कुराहरूमा थप्न सुझाव सिफारिस गरेको छ।"</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"नियन्त्रण सुविधाहरू अद्यावधिक गरिए"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN मा अक्षर वा चिन्हहरू समाविष्ट हुन्छन्"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> पुष्टि गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-night/colors.xml b/packages/SystemUI/res/values-night/colors.xml index 2d5101104237..196357c4794e 100644 --- a/packages/SystemUI/res/values-night/colors.xml +++ b/packages/SystemUI/res/values-night/colors.xml @@ -79,6 +79,7 @@ <color name="global_screenshot_button_icon">@color/GM2_blue_300</color> <color name="global_screenshot_dismiss_background">@color/GM2_grey_800</color> <color name="global_screenshot_dismiss_foreground">#FFFFFF</color> + <color name="global_screenshot_background_protection_start">#80000000</color> <!-- 50% black --> <!-- Biometric dialog colors --> diff --git a/packages/SystemUI/res/values-night/dimens.xml b/packages/SystemUI/res/values-night/dimens.xml index 481483991de9..23e323112845 100644 --- a/packages/SystemUI/res/values-night/dimens.xml +++ b/packages/SystemUI/res/values-night/dimens.xml @@ -18,4 +18,8 @@ <resources> <!-- The height of the divider between the individual notifications. --> <dimen name="notification_divider_height">1dp</dimen> + + <!-- Height of the background gradient behind the screenshot UI (taller in dark mode) --> + <dimen name="screenshot_bg_protection_height">375dp</dimen> + </resources>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 25965136f5fe..419fa3eae472 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Screenshot sluiten"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Voorbeeld van screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Schermopname"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Schermopname verwerken"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Doorlopende melding voor een schermopname-sessie"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Opname starten?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Tijdens de opname kan het Android-systeem gevoelige informatie opnemen die zichtbaar is op je scherm of wordt afgespeeld op je apparaat. Dit omvat wachtwoorden, betalingsgegevens, foto\'s, berichten en audio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Alles wissen"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Beheren"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Geschiedenis"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Inkomend"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Stille meldingen"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Meldingen met waarschuwing"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Gesprekken"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Geen titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tik om deze app opnieuw te starten en te openen op het volledige scherm."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Instellingen voor <xliff:g id="APP_NAME">%1$s</xliff:g>-bubbels"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Overloop"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Weer toevoegen aan stack"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Beheren"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g> en nog <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Kan lijst met alle bedieningselementen niet laden."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Overig"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Toevoegen aan apparaatbediening"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Toevoegen aan favorieten"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> heeft voorgesteld dit bedieningselement toe te voegen aan je favorieten."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Toevoegen"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Voorgesteld door <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Bedieningselementen geüpdated"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Pincode bevat letters of symbolen"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> verifiëren"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index f5e7f120213d..13798af1ad8f 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ସ୍କ୍ରିନସଟ୍ ଖାରଜ କରନ୍ତୁ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ସ୍କ୍ରିନସଟର ପ୍ରିଭ୍ୟୁ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ସ୍କ୍ରିନ୍ ରେକର୍ଡର୍"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ଏକ ସ୍କ୍ରିନ୍ ରେକର୍ଡ୍ ସେସନ୍ ପାଇଁ ଚାଲୁଥିବା ବିଜ୍ଞପ୍ତି"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ରେକର୍ଡିଂ ଆରମ୍ଭ କରିବେ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ରେକର୍ଡିଂ ସମୟରେ, Android ସିଷ୍ଟମ୍ ଆପଣଙ୍କ ସ୍କ୍ରିନରେ ଦେଖାଯାଉଥିବା ବା ଆପଣଙ୍କ ଡିଭାଇସରେ ଚାଲୁଥିବା ଯେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନାକୁ କ୍ୟାପଚର୍ କରିପାରିବ। ଏଥିରେ ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ସୂଚନା, ଫଟୋ, ମେସେଜ ଏବଂ ଅଡିଓ ଅନ୍ତର୍ଭୁକ୍ତ।"</string> @@ -210,7 +212,7 @@ <string name="accessibility_three_bars" msgid="819417766606501295">"ତିନୋଟି ବାର୍ ଅଛି।"</string> <string name="accessibility_signal_full" msgid="5920148525598637311">"ସିଗ୍ନାଲ୍ ଫୁଲ୍ ଅଛି।"</string> <string name="accessibility_desc_on" msgid="2899626845061427845">"ଚାଲୁ।"</string> - <string name="accessibility_desc_off" msgid="8055389500285421408">"ଅଫ୍।"</string> + <string name="accessibility_desc_off" msgid="8055389500285421408">"ବନ୍ଦ।"</string> <string name="accessibility_desc_connected" msgid="3082590384032624233">"ସଂଯୁକ୍ତ।"</string> <string name="accessibility_desc_connecting" msgid="8011433412112903614">"ସଂଯୋଗ କରୁଛି।"</string> <string name="data_connection_gprs" msgid="2752584037409568435">"GPRS"</string> @@ -231,7 +233,7 @@ <string name="accessibility_cell_data_on" msgid="691666434519443162">"ମୋବାଇଲ୍ ଡାଟା ଅନ୍"</string> <string name="cell_data_off_content_description" msgid="9165555931499878044">"ମୋବାଇଲ୍ ଡାଟା ବନ୍ଦ ଅଛି"</string> <string name="not_default_data_content_description" msgid="6757881730711522517">"ବ୍ୟବହୃତ ଡାଟା ପାଇଁ ସେଟ୍ ହୋଇନାହିଁ"</string> - <string name="cell_data_off" msgid="4886198950247099526">"ଅଫ୍ ଅଛି"</string> + <string name="cell_data_off" msgid="4886198950247099526">"ବନ୍ଦ"</string> <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"ବ୍ଲୁଟୁଥ ଟିଥରିଂ।"</string> <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string> <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ଅନ୍।"</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"ବବଲ୍ ଖାରଜ କରାଯାଇଛି।"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ଦ୍ରୁତ ସେଟିଂସ୍।"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> @@ -499,7 +500,7 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"ୟୁଜରଙ୍କୁ ବାହାର କରିବେ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"ଏହି ୟୁଜରଙ୍କ ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହେବ।"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"ବାହାର କରନ୍ତୁ"</string> - <string name="battery_saver_notification_title" msgid="8419266546034372562">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅନ୍ ଅଛି"</string> + <string name="battery_saver_notification_title" msgid="8419266546034372562">"ବ୍ୟାଟେରୀ ସେଭର୍ ଚାଲୁ ଅଛି"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ବ୍ୟାଟେରୀ ସେଭର୍ ଅଫ୍ କରନ୍ତୁ"</string> <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ରେ ସମସ୍ତ ସୂଚନାକୁ ଆକ୍ସେସ୍ ରହିବ ଯାହା ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ରେ ଦେଖାଯିବ ବା ରେକର୍ଡିଂ ବା କାଷ୍ଟିଂ ବେଳେ ଆପଣଙ୍କର ଡିଭାଇସ୍ ଠାରୁ ଚାଲିବ। ପାସ୍ୱାର୍ଡ, ପେମେଣ୍ଟ ବିବରଣୀ, ଫଟୋ, ମେସେଜ୍ ଏବଂ ଆପଣ ଚଲାଉଥିବା ଅଡିଓ ପରି ସୂଚନା ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।"</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ଇତିହାସ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ନୀରବ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ଆଲର୍ଟ କରିବା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> @@ -581,7 +584,7 @@ <string name="hidden_notifications_cancel" msgid="4805370226181001278">"ନାହିଁ, ଥାଉ"</string> <string name="hidden_notifications_setup" msgid="2064795578526982467">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> - <string name="volume_zen_end_now" msgid="5901885672973736563">"ବର୍ତ୍ତମାନ ଅଫ୍ କରନ୍ତୁ"</string> + <string name="volume_zen_end_now" msgid="5901885672973736563">"ବର୍ତ୍ତମାନ ବନ୍ଦ କରନ୍ତୁ"</string> <string name="accessibility_volume_settings" msgid="1458961116951564784">"ସାଉଣ୍ଡ ସେଟିଂସ୍"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"ବଢ଼ାନ୍ତୁ"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"ଛୋଟ କରନ୍ତୁ"</string> @@ -683,7 +686,7 @@ <string name="do_not_silence_block" msgid="4361847809775811849">"ନିରବ କିମ୍ବା ବ୍ଲକ୍ କରନ୍ତୁ ନାହିଁ"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍"</string> <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"ଚାଲୁ"</string> - <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"ଅଫ୍"</string> + <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"ବନ୍ଦ"</string> <string name="power_notification_controls_description" msgid="1334963837572708952">"ପାୱାର୍ ବିଜ୍ଞପ୍ତି କଣ୍ଟ୍ରୋଲ୍ରେ, ଆପଣ ଏକ ଆପ୍ ବିଜ୍ଞପ୍ତି ପାଇଁ 0 ରୁ 5 ଗୁରୁତ୍ୱ ସ୍ତର ସେଟ୍ କରିହେବେ। \n\n"<b>"ସ୍ତର 5"</b>" \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ଶୀର୍ଷରେ ଦେଖାନ୍ତୁ \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 4"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- ସର୍ବଦା ପିକ୍ କରନ୍ତୁ \n\n"<b>"ସ୍ତର 3"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 2"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n\n"<b>"ସ୍ତର 1"</b>" \n- ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନରେ ବାଧା ଦେବା ବ୍ଲକ୍ କରନ୍ତୁ \n- କଦାପି ପିକ୍ କରନ୍ତୁ ନାହିଁ \n- କଦାପି ସାଉଣ୍ଡ ଓ ଭାଇବ୍ରେଟ୍ କରନ୍ତୁ ନାହିଁ \n- ଲକ୍ ସ୍କ୍ରୀନ୍ ଓ ଷ୍ଟାଟସ୍ ବାର୍ରୁ ଲୁଚାନ୍ତୁ \n- ବିଜ୍ଞପ୍ତି ତାଲିକାର ନିମ୍ନରେ ଦେଖାନ୍ତୁ \n\n"<b>"ସ୍ତର 0"</b>" \n- ଆପରୁ ସମସ୍ତ ବିଜ୍ଞପ୍ତି ବ୍ଲକ୍ କରନ୍ତୁ"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"ବିଜ୍ଞପ୍ତି"</string> <string name="notification_channel_disabled" msgid="928065923928416337">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଆପଣ ଆଉ ଦେଖିବାକୁ ପାଇବେନାହିଁ।"</string> @@ -833,7 +836,7 @@ <item msgid="2681220472659720036">"କ୍ଲିପ୍ବୋର୍ଡ"</item> <item msgid="4795049793625565683">"କୀ\'କୋଡ୍"</item> <item msgid="80697951177515644">"ଘୁରାଇବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ, କୀ’ବୋର୍ଡର ଭାଷା ପରିବର୍ତ୍ତନ ସୁବିଧା"</item> - <item msgid="7626977989589303588">"କିଛିନୁହେଁ"</item> + <item msgid="7626977989589303588">"କିଛି ନାହିଁ"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="9156773083127904112">"ସାମାନ୍ୟ"</item> @@ -929,7 +932,7 @@ <string name="lockscreen_shortcut_right" msgid="4138414674531853719">"ଡାହାଣ ଶର୍ଟକଟ୍"</string> <string name="lockscreen_unlock_left" msgid="1417801334370269374">"ବାମ ଶର୍ଟକଟ୍ ମଧ୍ୟ ଅନଲକ୍ କରେ"</string> <string name="lockscreen_unlock_right" msgid="4658008735541075346">"ଡାହାଣ ଶର୍ଟକଟ୍ ମଧ୍ୟ ଅନଲକ୍ କରେ"</string> - <string name="lockscreen_none" msgid="4710862479308909198">"କିଛିନୁହେଁ"</string> + <string name="lockscreen_none" msgid="4710862479308909198">"କିଛି ନାହିଁ"</string> <string name="tuner_launch_app" msgid="3906265365971743305">"<xliff:g id="APP">%1$s</xliff:g> ଲଞ୍ଚ କରନ୍ତୁ"</string> <string name="tuner_other_apps" msgid="7767462881742291204">"ଅନ୍ୟ ଆପ୍ସ"</string> <string name="tuner_circle" msgid="5270591778160525693">"ବୃତ୍ତ"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"କୌଣସି ଶୀର୍ଷକ ନାହିଁ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ଏହି ଆପ୍କୁ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ ଏବଂ ଫୁଲ୍ସ୍କ୍ରିନ୍କୁ ଯାଆନ୍ତୁ।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବବଲ୍ଗୁଡ଼ିକ ପାଇଁ ସେଟିଂସ୍"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>ରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ଏବଂ ଅଧିକ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>ଟିରୁ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1028,13 +1035,14 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"ପାୱାର ମେନୁରୁ ଆକ୍ସେସ୍ କରିବାକୁ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକୁ ବାଛନ୍ତୁ"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ପୁଣି ସଜାଇବାକୁ ସେଗୁଡ଼ିକୁ ଧରି ଟାଣନ୍ତୁ"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"ସମସ୍ତ ନିୟନ୍ତ୍ରଣ କାଢ଼ି ଦିଆଯାଇଛି"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସେଭ୍ କରାଯାଇନାହିଁ"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"ସବୁ ନିୟନ୍ତ୍ରଣର ତାଲିକା ଲୋଡ୍ କରିପାରିଲା ନାହିଁ।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ଅନ୍ୟ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ଡିଭାଇସ୍ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ପସନ୍ଦଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"ଏହି ନିୟନ୍ତ୍ରଣକୁ ଆପଣଙ୍କ ପସନ୍ଦଗୁଡ଼ିକରେ ଯୋଗ କରିବାକୁ <xliff:g id="APP">%s</xliff:g> ପ୍ରସ୍ତାବ ଦେଇଛି।"</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଅପଡେଟ୍ କରାଯାଇଛି"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PINରେ ଅକ୍ଷର କିମ୍ୱା ସଙ୍କେତଗୁଡ଼ିକ ଥାଏ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ଯାଞ୍ଚ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 37cf38c28c90..0981f3c3bcd3 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਖਾਰਜ ਕਰੋ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਪੂਰਵ-ਝਲਕ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ਸਕ੍ਰੀਨ ਰਿਕਾਰਡਰ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ਕਿਸੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਸੈਸ਼ਨ ਲਈ ਚੱਲ ਰਹੀ ਸੂਚਨਾ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ਕੀ ਰਿਕਾਰਡਿੰਗ ਸ਼ੁਰੂ ਕਰਨੀ ਹੈ?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ਰਿਕਾਰਡਿੰਗ ਕਰਨ ਵੇਲੇ, Android ਸਿਸਟਮ ਕੋਈ ਵੀ ਅਜਿਹੀ ਸੰਵੇਦਨਸ਼ੀਲ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕਰ ਸਕਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਣਯੋਗ ਹੈ ਜਾਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ। ਇਸ ਵਿੱਚ ਪਾਸਵਰਡ, ਭੁਗਤਾਨ ਵੇਰਵੇ, ਫ਼ੋਟੋਆਂ, ਸੁਨੇਹੇ ਅਤੇ ਆਡੀਓ ਸ਼ਾਮਲ ਹਨ।"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ਇਤਿਹਾਸ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ਸ਼ਾਂਤ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ਸੁਚੇਤ ਕਰਨ ਵਾਲੀਆਂ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"ਗੱਲਾਂਬਾਤਾਂ"</string> @@ -960,7 +964,7 @@ <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"ਐਪ (<xliff:g id="ID_1">%s</xliff:g>) ਵੱਲੋਂ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"ਇੱਕ ਸਵੈਚਲਿਤ ਨਿਯਮ ਜਾਂ ਐਪ ਵੱਲੋਂ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> ਤੱਕ"</string> - <string name="qs_dnd_keep" msgid="3829697305432866434">"ਰੱਖੋ"</string> + <string name="qs_dnd_keep" msgid="3829697305432866434">"Keep"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"ਬਦਲੋ"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਹੀਆਂ ਐਪਾਂ"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"ਬੈਟਰੀ ਅਤੇ ਡਾਟਾ ਵਰਤੋਂ ਸਬੰਧੀ ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"</string> <string name="restart_button_description" msgid="6916116576177456480">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਲਈ ਸੈਟਿੰਗਾਂ"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ਅਤੇ <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ਹੋਰਾਂ ਤੋਂ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"ਸਾਰੇ ਕੰਟਰੋਲਾਂ ਦੀ ਸੂਚੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ਹੋਰ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"ਡੀਵਾਈਸ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ਨੇ ਇਸ ਕੰਟਰੋਲ ਨੂੰ ਤੁਹਾਡੇ ਮਨਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਸੁਝਾਅ ਦਿੱਤਾ ਹੈ।"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"ਸ਼ਾਮਲ ਕਰੋ"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ਵੱਲੋਂ ਸੁਝਾਇਆ ਗਿਆ"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"ਕੰਟਰੋਲ ਅੱਪਡੇਟ ਕੀਤੇ ਗਏ"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"ਪਿੰਨ ਵਿੱਚ ਅੱਖਰ ਜਾਂ ਚਿੰਨ੍ਹ ਸ਼ਾਮਲ ਹਨ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 087ab50ebc66..e510b0e792f0 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zamknij zrzut ekranu"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Podgląd zrzutu ekranu"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Nagrywanie ekranu"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Stałe powiadomienie o sesji rejestrowania zawartości ekranu"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Rozpocząć nagrywanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Podczas nagrywania system Android może rejestrować wszelkie informacje poufne wyświetlane na ekranie lub odtwarzane na urządzeniu. Dotyczy to m.in. haseł, szczegółów płatności, zdjęć, wiadomości i odtwarzanych dźwięków."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Usuń wszystkie"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Zarządzaj"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Ciche powiadomienia"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Alerty"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Rozmowy"</string> @@ -655,7 +659,7 @@ <string name="show_demo_mode" msgid="3677956462273059726">"Pokaż tryb demonstracyjny"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string> <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string> - <string name="status_bar_work" msgid="5238641949837091056">"Profil służbowy"</string> + <string name="status_bar_work" msgid="5238641949837091056">"Profil do pracy"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Tryb samolotowy"</string> <string name="add_tile" msgid="6239678623873086686">"Dodaj nazwę"</string> <string name="broadcast_tile" msgid="5224010633596487481">"Rozgłaszana nazwa"</string> @@ -665,7 +669,7 @@ <string name="alarm_template_far" msgid="3561752195856839456">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string> - <string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil służbowy"</string> + <string name="accessibility_managed_profile" msgid="4703836746209377356">"Profil do pracy"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"Dobra zabawa, ale nie dla każdego"</string> <string name="tuner_warning" msgid="1861736288458481650">"Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez tytułu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Ustawienia dymków aplikacji <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Zarządzaj"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g> i jeszcze <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Nie udało się wczytać listy elementów sterujących."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Inne"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodaj do sterowania urządzeniami"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodaj do ulubionych"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikacja <xliff:g id="APP">%s</xliff:g> zaproponowała dodanie tego elementu sterującego do ulubionych."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Dodaj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugestia: <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Zaktualizowano elementy sterujące"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Kod PIN zawiera litery lub symbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Sprawdź urządzenie <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index c22a27725f06..d63d62377bb6 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -33,7 +33,7 @@ <string name="invalid_charger_title" msgid="938685362320735167">"Não é possível carregar via USB"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Usar o carregador que acompanha o dispositivo"</string> <string name="battery_low_why" msgid="2056750982959359863">"Configurações"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Ativar Economia de bateria?"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Ativar \"Economia de bateria\"?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Sobre a Economia de bateria"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Ativar"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"Ativar a Economia de bateria"</string> @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dispensar captura de tela"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Iniciar gravação?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante a gravação, o sistema Android pode capturar informações confidenciais visíveis na tela ou tocadas no dispositivo. Isso inclui senhas, informações de pagamento, fotos, mensagens e áudio."</string> @@ -435,7 +436,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslize para cima para alternar entre os apps"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para alternar rapidamente entre os apps"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Carregada"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Carregado"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Carregando"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até concluir"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Não está carregando"</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gerenciar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Histórico"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Recebidas"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificações com alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> @@ -681,7 +683,7 @@ <string name="do_not_silence" msgid="4982217934250511227">"Não silenciar"</string> <string name="do_not_silence_block" msgid="4361847809775811849">"Não silenciar ou bloquear"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de ativação/desativação de notificações"</string> - <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"Ativado"</string> + <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"Ativada"</string> <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"Desativado"</string> <string name="power_notification_controls_description" msgid="1334963837572708952">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"Notificações"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar o app e usar tela cheia."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menu flutuante"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Devolver à pilha"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gerenciar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Adicionar aos favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> sugeriu a adição desse controle aos seus favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Adicionar"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles atualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"O PIN contém letras ou símbolos"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt-rPT-ldrtl/strings.xml b/packages/SystemUI/res/values-pt-rPT-ldrtl/strings.xml index 58923fb354c2..4af54b5162e6 100644 --- a/packages/SystemUI/res/values-pt-rPT-ldrtl/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT-ldrtl/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastar para a esquerda para mudar rapidamente de aplicação"</string> + <string name="recents_quick_scrub_onboarding" msgid="2452671841151577157">"Arrastar para a esquerda para mudar rapidamente de app"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cea04db2b9d9..2b34ac3c0860 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ignorar captura de ecrã"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pré-visualização da captura de ecrã"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de ecrã"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"A processar a gravação de ecrã"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação persistente de uma sessão de gravação de ecrã"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Pretende iniciar a gravação?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Enquanto estiver a gravar, o sistema Android pode capturar quaisquer informações confidenciais que estejam visíveis no ecrã ou que sejam reproduzidas no dispositivo. Isto inclui palavras-passe, informações de pagamento, fotos, mensagens e áudio."</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gerir"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Histórico"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"A receber"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificações de alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> @@ -944,7 +946,7 @@ <string name="notification_channel_general" msgid="4384774889645929705">"Mensagens gerais"</string> <string name="notification_channel_storage" msgid="2720725707628094977">"Armazenamento"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"Sugestões"</string> - <string name="instant_apps" msgid="8337185853050247304">"Aplicações instantâneas"</string> + <string name="instant_apps" msgid="8337185853050247304">"Apps instantâneas"</string> <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> <string name="instant_apps_message" msgid="6112428971833011754">"A app é aberta sem ser instalada."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"A app é aberta sem ser instalada. Toque para saber mais."</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar esta app e ficar em ecrã inteiro."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Definições dos balões da app <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menu adicional"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Adicionar novamente à pilha"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gerir"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> do <xliff:g id="APP_NAME">%2$s</xliff:g> e mais<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>."</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista dos controlos."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicione aos controlos de dispositivos"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Adicionar aos favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"A app <xliff:g id="APP">%s</xliff:g> sugeriu este controlo para adicionar aos seus favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Adicionar"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controlos atualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"O PIN contém letras ou símbolos."</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Valide <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index c22a27725f06..d63d62377bb6 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -33,7 +33,7 @@ <string name="invalid_charger_title" msgid="938685362320735167">"Não é possível carregar via USB"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Usar o carregador que acompanha o dispositivo"</string> <string name="battery_low_why" msgid="2056750982959359863">"Configurações"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Ativar Economia de bateria?"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"Ativar \"Economia de bateria\"?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"Sobre a Economia de bateria"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Ativar"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"Ativar a Economia de bateria"</string> @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Dispensar captura de tela"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Visualização de captura de tela"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Iniciar gravação?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Durante a gravação, o sistema Android pode capturar informações confidenciais visíveis na tela ou tocadas no dispositivo. Isso inclui senhas, informações de pagamento, fotos, mensagens e áudio."</string> @@ -435,7 +436,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Deslize para cima para alternar entre os apps"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Arraste para a direita para alternar rapidamente entre os apps"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Alternar Visão geral"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Carregada"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Carregado"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Carregando"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> até concluir"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Não está carregando"</string> @@ -509,6 +510,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Limpar tudo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gerenciar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Histórico"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Recebidas"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificações silenciosas"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificações com alerta"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversas"</string> @@ -681,7 +683,7 @@ <string name="do_not_silence" msgid="4982217934250511227">"Não silenciar"</string> <string name="do_not_silence_block" msgid="4361847809775811849">"Não silenciar ou bloquear"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"Controles de ativação/desativação de notificações"</string> - <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"Ativado"</string> + <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"Ativada"</string> <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"Desativado"</string> <string name="power_notification_controls_description" msgid="1334963837572708952">"Com controles de ativação de notificações, é possível definir o nível de importância de 0 a 5 para as notificações de um app. \n\n"<b>"Nível 5"</b>" \n- Exibir na parte superior da lista de notificações \n- Permitir interrupção em tela cheia \n- Sempre exibir \n\n"<b>"Nível 4"</b>" \n- Impedir interrupções em tela cheia \n- Sempre exibir \n\n"<b>"Nível 3"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n\n"<b>"Nível 2"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir interrupções em tela cheia \n- Nunca exibir \n- Nunca emitir som ou vibrar \n- Ocultar da tela de bloqueio e barra de status \n- Exibir na parte inferior da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações do app"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"Notificações"</string> @@ -987,6 +989,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Sem título"</string> <string name="restart_button_description" msgid="6916116576177456480">"Toque para reiniciar o app e usar tela cheia."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Configurações de balões do <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Menu flutuante"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Devolver à pilha"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gerenciar"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g> mais <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1035,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Não foi possível carregar a lista de controles."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Outro"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adicionar aos controles do dispositivo"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Adicionar aos favoritos"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> sugeriu a adição desse controle aos seus favoritos."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Adicionar"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerido por <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Controles atualizados"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"O PIN contém letras ou símbolos"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificar <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 519eddda8e07..8388b48cef25 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Închideți captura de ecran"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Previzualizare a capturii de ecran"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder pentru ecran"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificare în curs pentru o sesiune de înregistrare a ecranului"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Începeți înregistrarea?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"În timpul înregistrării, sistemul Android poate captura informațiile sensibile vizibile pe ecran sau redate pe dispozitiv. Aici sunt incluse parole, informații de plată, fotografii, mesaje și conținut audio."</string> @@ -512,6 +514,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Ștergeți toate notificările"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionați"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istoric"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Notificări silențioase"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Notificări de alertare"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Conversații"</string> @@ -992,6 +996,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Fără titlu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Setări pentru baloanele <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Gestionați"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g> și încă <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1037,8 +1045,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Lista cu toate comenzile nu a putut fi încărcată."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Altul"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Adăugați la comenzile dispozitivelor"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Adăugați la preferate"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> a sugerat adăugarea acestei comenzi la preferate."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Adăugați"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugerat de <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"S-au actualizat comenzile"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Codul PIN conține litere sau simboluri"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verificați <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index ad7f175b1ffb..2832d89f8ce5 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрыть скриншот"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Предварительный просмотр скриншота"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Создание скриншотов"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Текущее уведомление для записи видео с экрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Начать запись?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Во время записи система Android может получить доступ к конфиденциальной информации, которая видна на экране или воспроизводится на устройстве, в том числе к паролям, сведениям о платежах, фотографиям, сообщениям и аудиозаписям."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Очистить все"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Настроить"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"История"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучные уведомления"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Оповещения"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Разговоры"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без названия"</string> <string name="restart_button_description" msgid="6916116576177456480">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Настройки всплывающих чатов от приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"."</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Настроить"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\""</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> от приложения \"<xliff:g id="APP_NAME">%2$s</xliff:g>\" и ещё <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не удалось загрузить список элементов управления."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Другое"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Добавьте виджеты управления устройствами"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Добавить в избранное"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" предлагает добавить этот элемент управления в избранное."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Добавить"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Предложено приложением \"<xliff:g id="APP">%s</xliff:g>\""</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Элементы управления обновлены."</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-код содержит буквы или символы"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Подтвердите устройство \"<xliff:g id="DEVICE">%s</xliff:g>\""</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 2011bf0181ad..fb87a0b9ccae 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"තිර රුව ඉවත ලන්න"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"තිර රූ පෙර දසුන"</string> <string name="screenrecord_name" msgid="2596401223859996572">"තිර රෙකෝඩරය"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"තිර පටිගත කිරීමේ සැසියක් සඳහා කෙරෙන දැනුම් දීම"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"පටිගත කිරීම ආරම්භ කරන්නද?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"පටිගත කරන අතරතුර, Android පද්ධතියට ඔබේ තිරයේ පෙනෙන හෝ ඔබේ උපාංගයේ වාදනය කරන ඕනෑම සංවේදී තොරතුරක් ග්රහණය කර ගැනීමට හැකිය. මෙයට මුරපද, ගෙවීම් තොරතුරු, ඡායාරූප, පණිවිඩ සහ ඕඩියෝ ඇතුළත් වේ."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"සියල්ල හිස් කරන්න"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"කළමනාකරණය කරන්න"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ඉතිහාසය"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"නිහඬ දැනුම්දීම්"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"ඇඟවීමේ දැනුම් දීම්"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"සංවාද"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"මාතෘකාවක් නැත"</string> <string name="restart_button_description" msgid="6916116576177456480">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> බුබුළු සඳහා සැකසීම්"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"කළමනා කරන්න"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> වෙතින් <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> සහ තවත් <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ක්"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"සියලු පාලනවල ලැයිස්තුව පූරණය කළ නොහැකි විය."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"වෙනත්"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"උපාංග පාලන වෙත එක් කරන්න"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ප්රියතම වෙත එක් කරන්න"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ඔබේ ප්රියතම වෙත එක් කිරීමට මෙම පාලනය යෝජනා කරන ලදී."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"එක් කරන්න"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"යෝජනා කළේ <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"පාලන යාවත්කාලීනයි"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN හි අකුරු හෝ සංකේත අඩංගු වේ"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> සත්යාපනය කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 6fd6d8742879..c835809533d3 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Zavrieť snímku obrazovky"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukážka snímky obrazovky"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Rekordér obrazovky"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Zobrazuje sa upozornenie týkajúce sa relácie záznamu obrazovky"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Chcete spustiť nahrávanie?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Počas nahrávania zaznamená systém Android všetky citlivé údaje, ktoré sa zobrazia na obrazovke alebo prehrajú v zariadení. Zahrnuje to heslá, platobné údaje, fotky, správy a zvuky."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Vymazať všetko"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Spravovať"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"História"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tiché upozornenia"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Varovné upozornenia"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konverzácie"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Bez názvu"</string> <string name="restart_button_description" msgid="6916116576177456480">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavenia bublín aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Spravovať"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g> a ďalšie (<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Zoznam všetkých ovl. prvkov sa nepodarilo načítať."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iné"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Pridanie do ovládania zariadenia"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Pridať do obľúbených"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikácia <xliff:g id="APP">%s</xliff:g> vám odporučila pridať tento ovládací prvok do obľúbených."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Pridať"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Navrhuje <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Ovládanie bolo aktualizované"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Kód PIN obsahuje písmená alebo symboly"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Overiť <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index aade5c238128..038b3b663cb6 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -89,6 +89,7 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Opusti posnetek zaslona"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Predogled posnetka zaslona"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Snemalnik zaslona"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Obdelava videoposnetka zaslona"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Nenehno obveščanje o seji snemanja zaslona"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Želite začeti snemati?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Med snemanjem lahko sistem Android zajame morebitne občutljive podatke, ki so prikazani na zaslonu ali se predvajajo v napravi. To vključuje gesla, podatke za plačilo, fotografije, sporočila in zvok."</string> @@ -515,6 +516,7 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši vse"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljanje"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Zgodovina"</string> + <string name="notification_section_header_incoming" msgid="5295312809341711367">"Dohodno"</string> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Tiha obvestila"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Obvestila z opozorilom"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Pogovori"</string> @@ -675,7 +677,7 @@ <string name="remove_from_settings_prompt" msgid="551565437265615426">"Ali želite odstraniti Uglaševalnik uporabniškega vmesnika sistema iz nastavitev in prenehati uporabljati vse njegove funkcije?"</string> <string name="activity_not_found" msgid="8711661533828200293">"Aplikacija ni nameščena v napravi"</string> <string name="clock_seconds" msgid="8709189470828542071">"Prikaz sekund pri uri"</string> - <string name="clock_seconds_desc" msgid="2415312788902144817">"Prikaže sekunde pri uri v vrstici stanja. To lahko vpliva na čas delovanja pri akumulatorskem napajanju."</string> + <string name="clock_seconds_desc" msgid="2415312788902144817">"Prikaže sekunde pri uri v vrstici stanja. To lahko vpliva na čas delovanja pri baterijskem napajanju."</string> <string name="qs_rearrange" msgid="484816665478662911">"Preuredi hitre nastavitve"</string> <string name="show_brightness" msgid="6700267491672470007">"Prikaz svetlosti v hitrih nastavitvah"</string> <string name="experimental" msgid="3549865454812314826">"Poskusno"</string> @@ -987,8 +989,8 @@ <string name="auto_saver_title" msgid="6873691178754086596">"Dotaknite se za načrtovanje varčevanja z energijo baterije"</string> <string name="auto_saver_text" msgid="3214960308353838764">"Vklop, če je verjetno, da se bo baterija izpraznila"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"Ne, hvala"</string> - <string name="auto_saver_enabled_title" msgid="4294726198280286333">"Urnik varčevanja z energijo akumulatorja je vklopljen"</string> - <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Varčevanje z energijo akumulatorja se bo samodejno vklopilo, ko bo energija akumulatorja pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string> + <string name="auto_saver_enabled_title" msgid="4294726198280286333">"Urnik varčevanja z energijo baterije je vklopljen"</string> + <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Varčevanje z energijo baterije se bo samodejno vklopilo, ko bo energija baterije pod <xliff:g id="PERCENTAGE">%d</xliff:g> %%."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"Nastavitve"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"V redu"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"Izvoz kopice SysUI"</string> @@ -997,6 +999,8 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Brez naslova"</string> <string name="restart_button_description" msgid="6916116576177456480">"Dotaknite se za vnovični zagon te aplikacije in preklop v celozaslonski način."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Nastavitve za oblačke aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="bubble_overflow_button_content_description" msgid="5523744621434300510">"Prelivanje"</string> + <string name="bubble_accessibility_action_add_back" msgid="6217995665917123890">"Dodaj nazaj v sklad"</string> <string name="manage_bubbles_text" msgid="6856830436329494850">"Upravljanje"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> (<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g> in toliko drugih: <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1043,8 +1047,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Seznama vseh kontrolnikov ni bilo mogoče naložiti."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Drugo"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Dodajanje med kontrolnike naprave"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Dodaj med priljubljene"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Aplikacija <xliff:g id="APP">%s</xliff:g> je predlagala, da ta kontrolnik dodate med priljubljene."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Dodaj"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Predlagala aplikacija <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrolniki so posodobljeni"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Koda PIN vsebuje črke ali simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Preverjanje naprave <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 0d85f21d4fbc..f7e2bf24309d 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Hiq pamjen e ekranit"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Pamja paraprake e imazhit"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Regjistruesi i ekranit"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Njoftim i vazhdueshëm për një seancë regjistrimi të ekranit"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Të nis regjistrimi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Gjatë regjistrimit, sistemi Android mund të regjistrojë çdo informacion delikat që është i dukshëm në ekranin tënd ose që luhet në pajisje. Kjo përfshin fjalëkalimet, informacionin e pagesave, fotografitë, mesazhet dhe audion."</string> @@ -435,7 +437,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"Zvarrit djathtas për të ndërruar aplikacionet me shpejtësi"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"Kalo te përmbledhja"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"I ngarkuar"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"I karikuar"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Po karikohet"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> deri sa të mbushet"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Nuk po karikohet"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Pastroji të gjitha"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Menaxho"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historiku"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Njoftimet në heshtje"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Njoftimet sinjalizuese"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Bisedat"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Pa titull"</string> <string name="restart_button_description" msgid="6916116576177456480">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Cilësimet për flluskat e <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Menaxho"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> nga <xliff:g id="APP_NAME">%2$s</xliff:g> dhe <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> të tjera"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Lista e të gjitha kontrolleve nuk mund të ngarkohej."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Tjetër"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Shto te kontrollet e pajisjes"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Shto te të preferuarat"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> sugjeroi këtë kontroll për ta shtuar te të preferuarat e tua."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Shto"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Sugjeruar nga <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Kontrollet u përditësuan"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Kodi PIN përmban shkronja ose simbole"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifiko <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 7fd03715dd7f..d61b36c1e1eb 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Одбаците снимак екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Преглед снимка екрана"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Снимач екрана"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Обавештење о сесији снимања екрана је активно"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Желите да започнете снимање?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Током снимања Android систем може да сними осетљиве информације које су видљиве на екрану или које се пуштају на уређају. То обухвата лозинке, информације о плаћању, слике, поруке и звук."</string> @@ -396,7 +398,7 @@ <string name="quick_settings_connected" msgid="3873605509184830379">"Повезан"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Повезано, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Повезује се..."</string> - <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Повезивање"</string> + <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Привезивање"</string> <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Хотспот"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Укључује се..."</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Уштеда података је укључена"</string> @@ -512,6 +514,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Обриши све"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Управљајте"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Историја"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Нечујна обавештења"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Обавештења која привлаче пажњу"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Конверзације"</string> @@ -992,6 +996,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без наслова"</string> <string name="restart_button_description" msgid="6916116576177456480">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Подешавања за <xliff:g id="APP_NAME">%1$s</xliff:g> облачиће"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Управљајте"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> из апликације <xliff:g id="APP_NAME">%2$s</xliff:g> и још <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1037,8 +1045,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Учитавање листе свих контрола није успело."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Друго"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Додајте у контроле уређаја"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Додајте у омиљене"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> предлаже да додате ову контролу у омиљене."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Додај"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Предлаже <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Контроле су ажуриране"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN садржи слова или симболе"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Верификујте: <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index f915f6cba82e..a2ef8b673a34 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Stäng skärmdump"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Förhandsgranskning av skärmdump"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Skärminspelare"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Avisering om att skärminspelning pågår"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vill du starta inspelningen?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"När du spelar in kan Android-systemet registrera alla känsliga uppgifter som visas på skärmen eller spelas upp på enheten. Detta omfattar lösenord, betalningsuppgifter, foton, meddelanden och ljud."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Rensa alla"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Hantera"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historik"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Ljudlösa aviseringar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Aviseringar med vibration eller ljud"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Konversationer"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Ingen titel"</string> <string name="restart_button_description" msgid="6916116576177456480">"Tryck för att starta om appen i helskärmsläge."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Inställningar för <xliff:g id="APP_NAME">%1$s</xliff:g>-bubblor"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Hantera"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g> och <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> fler"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Listan med alla kontroller kunde inte läsas in."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Övrigt"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Lägg till i enhetsstyrning"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Lägg till i Favoriter"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> föreslår att du lägger till kontrollen i dina favoriter."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Lägg till"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Förslag från <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Snabbkontroller uppdaterade"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Pinkoden innehåller bokstäver eller symboler"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Verifiera <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 20e03253185e..cc9d9b288fa0 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ondoa picha ya skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Onyesho la kukagua picha ya skrini"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Kinasa Skrini"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Arifa inayoendelea ya kipindi cha kurekodi skrini"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Ungependa kuanza kurekodi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Inaporekodi, Mfumo wa Android unaweza kurekodi maelezo yoyote nyeti yanayoonekana kwenye skrini au yanayochezwa kwenye kifaa chako. Hii ni pamoja na manenosiri, maelezo ya malipo, picha, ujumbe na sauti."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Futa zote"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Dhibiti"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historia"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Arifa zisizo na sauti"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Arifa za ilani"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mazungumzo"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Wimbo hauna jina"</string> <string name="restart_button_description" msgid="6916116576177456480">"Gusa ili uzime na uwashe upya programu hii kisha nenda kwenye skrini nzima."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mipangilio ya viputo vya <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Dhibiti"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka kwa <xliff:g id="APP_NAME">%2$s</xliff:g> na nyingine<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Imeshindwa kupakia orodha ya vidhibiti vyote."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Nyingine"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Weka kwenye vidhibiti vya vifaa"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Ongeza kwenye vipendwa"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> imependekeza kidhibiti hiki ili ukiongeze kwenye vipendwa vyako."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Weka"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Kimependekezwa na <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Umesasisha vidhibiti"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN ina herufi au alama"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Thibitisha <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index e38fbaad0752..fc19d6e05940 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ஸ்கிரீன்ஷாட்டை நிராகரி"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ஸ்கிரீன்ஷாட்டின் மாதிரிக்காட்சி"</string> <string name="screenrecord_name" msgid="2596401223859996572">"ஸ்கிரீன் ரெக்கார்டர்"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"திரை ரெக்கார்டிங் அமர்விற்கான தொடர் அறிவிப்பு"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ரெக்கார்டிங்கைத் தொடங்கவா?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ரெக்கார்டு செய்யும்போது, உங்கள் திரையில் தோன்றக்கூடிய அல்லது சாதனத்தில் பிளே ஆகக்கூடிய ஏதேனும் அதிமுக்கியத் தகவலை Android சிஸ்டம் படமெடுக்க முடியும். கடவுச்சொற்கள், பேமெண்ட் தகவல், படங்கள், மெசேஜ்கள், ஆடியோ ஆகியவை இதில் அடங்கும்."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"அறிவிப்பு நிராகரிக்கப்பட்டது."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"குமிழ் நிராகரிக்கப்பட்டது."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"அறிவிப்பு விவரம்."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"உடனடி அமைப்பு."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"லாக் ஸ்கிரீன்."</string> @@ -432,8 +433,7 @@ <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"ஸ்கிரீன் ரெக்கார்டு"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"தொடங்கு"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"நிறுத்து"</string> - <!-- no translation found for media_seamless_remote_device (177033467332920464) --> - <skip /> + <string name="media_seamless_remote_device" msgid="177033467332920464">"சாதனம்"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"ஆப்ஸை வேகமாக மாற்ற, வலப்புறம் இழுக்கவும்"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"மேலோட்டப் பார்வையை நிலைமாற்று"</string> @@ -511,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"எல்லாவற்றையும் அழி"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"அறிவிப்புகளை நிர்வகி"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"வரலாறு"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"ஒலியில்லாத அறிவிப்புகள்"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"விழிப்பூட்டல் அறிவிப்புகள்"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"உரையாடல்கள்"</string> @@ -716,8 +718,7 @@ <string name="notification_channel_summary_priority" msgid="7415770044553264622">"உரையாடல் பிரிவின் மேற்பகுதியில் ஒரு குமிழாகக் காட்டப்படும்."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"அமைப்புகள்"</string> <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string> - <!-- no translation found for no_shortcut (7176375126961212514) --> - <skip /> + <string name="no_shortcut" msgid="7176375126961212514">"உரையாடல் சார்ந்த குறிப்பிட்ட அமைப்புகளை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"சமீபத்திய குமிழ்கள் இல்லை"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"சமீபத்திய குமிழ்களும் நிராகரிக்கப்பட்ட குமிழ்களும் இங்கே தோன்றும்"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string> @@ -990,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"தலைப்பு இல்லை"</string> <string name="restart_button_description" msgid="6916116576177456480">"தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> குமிழ்களுக்கான அமைப்புகள்"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"நிர்வகி"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> இலிருந்து <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> மற்றும் மேலும் <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ஆப்ஸிலிருந்து வந்துள்ள அறிவிப்பு: <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1030,13 +1035,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"பவர் மெனுவில் இருந்து அணுகுவதற்கான கட்டுப்பாடுகளைத் தேர்ந்தெடுக்கலாம்"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"கட்டுப்பாடுகளை மறுவரிசைப்படுத்த அவற்றைப் பிடித்து இழுக்கவும்"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"கட்டுப்பாடுகள் அனைத்தும் அகற்றப்பட்டன"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"மாற்றங்கள் சேமிக்கப்படவில்லை"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"எல்லா கட்டுப்பாடுகளின் பட்டியலை ஏற்ற முடியவில்லை."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"பிற"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"சாதனக் கட்டுப்பாடுகளில் சேர்த்தல்"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"விருப்பமானவையில் சேர்"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"இந்தக் கட்டுப்பாட்டை உங்களுக்கு விருப்பமானவையில் சேர்க்கும்படி <xliff:g id="APP">%s</xliff:g> பரிந்துரைக்கிறார்."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"சேர்"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ஆப்ஸால் பரிந்துரைக்கப்பட்டது"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"கட்டுப்பாடுகள் மாற்றப்பட்டன"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"பின்னில் எழுத்துகள் அல்லது குறிகள் உள்ளன"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> ஐச் சரிபார்த்தல்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index ddeab71c414d..a2b3dec2dabd 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"స్క్రీన్షాట్ను మూసివేస్తుంది"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"స్క్రీన్షాట్ ప్రివ్యూ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"స్క్రీన్ రికార్డర్"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"స్క్రీన్ రికార్డ్ సెషన్ కోసం ఆన్గోయింగ్ నోటిఫికేషన్"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"రికార్డింగ్ను ప్రారంభించాలా?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"రికార్డ్ చేస్తున్నప్పుడు, Android సిస్టమ్ మీ స్క్రీన్పై ప్రదర్శించబడిన లేదా మీ పరికరం నుండి ప్లే చేయబడిన ఏ సున్నితమైన సమాచారాన్నైనా క్యాప్చర్ చేయగలదు. ఈ సమాచారంలో, పాస్వర్డ్లు, చెల్లింపు వివరాలు, ఫోటోలు, మెసేజ్లు, ఆడియో ఉంటాయి."</string> @@ -255,8 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"నోటిఫికేషన్ తీసివేయబడింది."</string> - <!-- no translation found for accessibility_bubble_dismissed (270358867566720729) --> - <skip /> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"బబుల్ విస్మరించబడింది."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"నోటిఫికేషన్ షేడ్."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"శీఘ్ర సెట్టింగ్లు."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"లాక్ స్క్రీన్."</string> @@ -510,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"అన్నీ క్లియర్ చేయండి"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"నిర్వహించండి"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"చరిత్ర"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"నిశ్శబ్ద నోటిఫికేషన్లు"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"అలర్ట్ చేసే నోటిఫికేషన్లు"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"సంభాషణలు"</string> @@ -961,7 +964,7 @@ <string name="qs_dnd_prompt_app" msgid="4027984447935396820">"యాప్ (<xliff:g id="ID_1">%s</xliff:g>) ద్వారా అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="1841469944118486580">"స్వయంచాలక నియమం లేదా యాప్ ద్వారా అంతరాయం కలిగించవద్దు ఆన్ చేయబడింది."</string> <string name="qs_dnd_until" msgid="7844269319043747955">"<xliff:g id="ID_1">%s</xliff:g> వరకు"</string> - <string name="qs_dnd_keep" msgid="3829697305432866434">"ఉంచు"</string> + <string name="qs_dnd_keep" msgid="3829697305432866434">"Keep"</string> <string name="qs_dnd_replace" msgid="7712119051407052689">"భర్తీ చేయి"</string> <string name="running_foreground_services_title" msgid="5137313173431186685">"నేపథ్యంలో అమలు అవుతున్న ఆప్లు"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"బ్యాటరీ మరియు డేటా వినియోగ వివరాల కోసం నొక్కండి"</string> @@ -988,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"శీర్షిక లేదు"</string> <string name="restart_button_description" msgid="6916116576177456480">"ఈ యాప్ను పునఃప్రారంభించేలా నొక్కి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> బబుల్స్ సెట్టింగ్లు"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"నిర్వహించండి"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> మరియు మరో <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1028,13 +1035,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"పవర్ మెనూ నుండి యాక్సెస్ చేయడానికి నియంత్రణలను ఎంచుకోండి"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"నియంత్రణల క్రమం మార్చడానికి పట్టుకుని&amp, లాగండి"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"అన్ని నియంత్రణలు తీసివేయబడ్డాయి"</string> - <!-- no translation found for controls_favorite_toast_no_changes (7094494210840877931) --> - <skip /> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"మార్పులు సేవ్ చేయబడలేదు"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"అన్ని నియంత్రణలు గల జాబితాను లోడ్ చేయలేకపోయాము."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"ఇతరం"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"పరికరం నియంత్రణలకు జోడించడం"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"ఇష్టమైనవాటికి జోడించు"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"మీ ఇష్టమైనవాటికి జోడించడానికి <xliff:g id="APP">%s</xliff:g> ఈ కంట్రోల్ను సూచించింది."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"జోడించండి"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> ద్వారా సూచించబడింది"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"నియంత్రణలు అప్డేట్ అయ్యాయి"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"పిన్ అక్షరాలను లేదా చిహ్నాలను కలిగి ఉంది"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>ను వెరిఫై చేయండి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 332155f47301..8d9d1518c1cf 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"ปิดภาพหน้าจอ"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"ตัวอย่างภาพหน้าจอ"</string> <string name="screenrecord_name" msgid="2596401223859996572">"โปรแกรมอัดหน้าจอ"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"เริ่มบันทึกเลยไหม"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ขณะบันทึก ระบบ Android จะบันทึกข้อมูลที่ละเอียดอ่อนที่ปรากฏบนหน้าจอหรือเล่นในอุปกรณ์ได้ ซึ่งรวมถึงรหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ ข้อความ และเสียง"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"ล้างทั้งหมด"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"จัดการ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ประวัติ"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"การแจ้งเตือนแบบไม่มีเสียง"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"มีการแจ้งเตือน"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"ไม่มีชื่อ"</string> <string name="restart_button_description" msgid="6916116576177456480">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"การตั้งค่าบับเบิล <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"จัดการ"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g> และอีก <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> รายการ"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"โหลดรายการตัวควบคุมทั้งหมดไม่ได้"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"อื่นๆ"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"เพิ่มไปยังระบบควบคุมอุปกรณ์"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"เพิ่มในรายการโปรด"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> แนะนำให้เพิ่มการควบคุมนี้ในรายการโปรด"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"เพิ่ม"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"แนะนำโดย <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"อัปเดตตัวควบคุมแล้ว"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN ประกอบด้วยตัวอักษรหรือสัญลักษณ์"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"ยืนยัน <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index d344a1e39268..cfb8d54e4efe 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"I-dismiss ang screenshot"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Preview ng screenshot"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Recorder ng Screen"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Kasalukuyang notification para sa session ng pag-record ng screen"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Simulang Mag-record?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Habang nagre-record, puwedeng ma-capture ng Android System ang anumang sensitibong impormasyong nakikita sa iyong screen o nagpe-play sa device mo. Kasama dito ang mga password, impormasyon sa pagbabayad, mga larawan, mensahe, at audio."</string> @@ -435,7 +437,7 @@ <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Mag-swipe pataas upang lumipat ng app"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"I-drag pakanan para mabilisang magpalipat-lipat ng app"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"I-toggle ang Overview"</string> - <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Nasingil na"</string> + <string name="expanded_header_battery_charged" msgid="5307907517976548448">"Tapos nang mag-charge"</string> <string name="expanded_header_battery_charging" msgid="1717522253171025549">"Nagcha-charge"</string> <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> hanggang mapuno"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"Hindi nagcha-charge"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"I-clear lahat"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Pamahalaan"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"History"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Mga silent na notification"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Mga nag-aalertong notification"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Mga Pag-uusap"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Walang pamagat"</string> <string name="restart_button_description" msgid="6916116576177456480">"I-tap para i-restart ang app na ito at mag-full screen."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Mga setting para sa mga bubble ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Pamahalaan"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g> at <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> pa"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Hindi ma-load ang listahan ng lahat ng control."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Iba pa"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Idagdag sa mga kontrol ng device"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Idagdag sa mga paborito"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"Iminungkahi ng <xliff:g id="APP">%s</xliff:g> ang kontrol na ito na idagdag sa iyong mga paborito."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Idagdag"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Iminungkahi ng <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Na-update na ang mga kontrol"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"May mga titik o simbolo ang PIN"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"I-verify ang <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 7e9280def2ed..3b6ad40168d7 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Ekran görüntüsünü kapat"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran görüntüsü önizlemesi"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekran Kaydedicisi"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekran kaydı oturumu için devam eden bildirim"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Kayıt Başlatılsın mı?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Kayıt sırasında Android Sistemi, ekranınızda görünen veya cihazınızda oynatılan hassas bilgileri yakalayabilir. Buna şifreler, ödeme bilgileri, fotoğraflar, mesajlar ve sesler dahildir."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Tümünü temizle"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Yönet"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Geçmiş"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Sessiz bildirimler"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Uyaran bildirimler"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Görüşmeler"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Başlıksız"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> baloncukları için ayarlar"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Yönet"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ve diğer <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Tüm kontrollerin listesi yüklenemedi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Diğer"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Cihaz denetimlerine ekle"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Favorilere ekle"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>, bu kontrolü favorilerinize eklemenizi önerdi."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Ekle"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> tarafından önerildi"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Denetimler güncellendi"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN, harf veya simge içerir"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> cihazını doğrulayın"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 5bb59eb715bc..11aba0bec73b 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Закрити знімок екрана"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Перегляд знімка екрана"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Створення знімків екрана"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Сповіщення про сеанс запису екрана"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Почати запис?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Під час запису система Android може фіксувати будь-яку конфіденційну інформацію, яка з\'являється на екрані або відтворюється на пристрої, зокрема паролі, платіжну інформацію, фотографії, повідомлення та звуки."</string> @@ -515,6 +517,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Очистити все"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Керувати"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Історія"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Беззвучні сповіщення"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Сповіщення зі звуком чи вібрацією"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Розмови"</string> @@ -997,6 +1001,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Без назви"</string> <string name="restart_button_description" msgid="6916116576177456480">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Налаштування спливаючих чатів від додатка <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Налаштувати"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"Cповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"Сповіщення \"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" від додатка <xliff:g id="APP_NAME">%2$s</xliff:g> (і ще <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g>)"</string> @@ -1043,8 +1051,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Не вдалося завантажити список усіх елементів керування."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Інше"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Додати до елементів керування пристроями"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Додати у вибране"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> пропонує додати цей елемент керування у вибране."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Додати"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Запропоновано додатком <xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Елементи керування оновлено"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN-код містить літери чи символи"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g>: підтвердити"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 6129f2a0a4b9..cacfb3e16fbf 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"اسکرین شاٹ برخاست کریں"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"اسکرین شاٹ کا پیش منظر"</string> <string name="screenrecord_name" msgid="2596401223859996572">"سکرین ریکارڈر"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"اسکرین ریکارڈ سیشن کیلئے جاری اطلاع"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"ریکارڈنگ شروع کریں؟"</string> <string name="screenrecord_description" msgid="1123231719680353736">"ریکارڈ کرنے کے دوران، Android سسٹم آپ کی اسکرین پر نظر آنے والی یا آپ کے آلہ پر چلنے والی کسی بھی حساس معلومات کو کیپچر کر سکتا ہے۔ اس میں پاس ورڈز، ادائیگی کی معلومات، تصاویر، پیغامات اور آڈیو شامل ہیں۔"</string> @@ -255,7 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"اطلاع مسترد ہوگئی۔"</string> - <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"بلبلہ مسترد کر دیا گیا۔"</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"بلبلہ برخاست کر دیا گیا۔"</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"اطلاعاتی شیڈ۔"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"فوری ترتیبات۔"</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"مقفل اسکرین۔"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"سبھی کو صاف کریں"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"نظم کریں"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"سرگزشت"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"اطلاعات خاموش کریں"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"متنبہ کرنے کی اطلاعات"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"گفتگوئیں"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"کوئی عنوان نہیں ہے"</string> <string name="restart_button_description" msgid="6916116576177456480">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> بلبلوں کے لیے ترتیبات"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"نظم کریں"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g> کی جانب سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> اور <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> مزید سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,10 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"تمام کنٹرولز کی فہرست لوڈ نہیں کی جا سکی۔"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"دیگر"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"آلہ کے کنٹرولز میں شامل کریں"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"پسندیدگیوں میں شامل کریں"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> نے آپ کی پسندیدگیوں میں شامل کرنے کے ليے یہ کنٹرول تجویز کیا۔"</string> + <!-- no translation found for controls_dialog_ok (2770230012857881822) --> + <skip /> + <!-- no translation found for controls_dialog_message (342066938390663844) --> + <skip /> <string name="controls_dialog_confirmation" msgid="586517302736263447">"کنٹرولز اپ ڈیٹ کیے گئے"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN میں حروف یا علامات شامل ہیں"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"<xliff:g id="DEVICE">%s</xliff:g> کی تصدیق کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index e9b0083bb8a1..9ec17d710cbc 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -63,7 +63,7 @@ <string name="usb_debugging_allow" msgid="1722643858015321328">"Ruxsat berish"</string> <string name="usb_debugging_secondary_user_title" msgid="7843050591380107998">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string> <string name="usb_debugging_secondary_user_message" msgid="3740347841470403244">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni aniqlash funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string> - <string name="wifi_debugging_title" msgid="7300007687492186076">"Bu tarmoqda Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string> + <string name="wifi_debugging_title" msgid="7300007687492186076">"Wi-Fi orqali debagging uchun ruxsat berilsinmi?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Tarmoq nomi (SSID):\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nWi‑Fi Manzil (BSSID):\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Bu tarmoqda doim ruxsat etilsin"</string> <string name="wifi_debugging_allow" msgid="4573224609684957886">"Ruxsat"</string> @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Skrinshotni yopish"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Skrinshotga razm solish"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Ekrandan yozib olish"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekrandan yozib olish seansi uchun joriy bildirishnoma"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Yozib olish boshlansinmi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Yozib olishda Android tizimi ekraningizda koʻringan yoki qurilmangizda ijro etilgan maxfiy axborotni ham yozib olishi mumkin. Bunga parollar, toʻlovga oid axborot, suratlar, xabarlar va audio kiradi."</string> @@ -167,7 +169,7 @@ <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Agar parolni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_failed_attempts_now_wiping_device" msgid="6585503524026243042">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu qurilmadagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_failed_attempts_now_wiping_user" msgid="7015008539146949115">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu foydalanuvchi oʻchirib tashlanadi."</string> - <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu ishchi profil va undagi maʼlumotlar oʻchirib tashlanadi."</string> + <string name="biometric_dialog_failed_attempts_now_wiping_profile" msgid="5239378521440749682">"Juda koʻp marta muvaffaqiyatsiz urindingiz. Bu ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_now_wiping_dialog_dismiss" msgid="7189432882125106154">"Yopish"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmoq izi skaneriga tegining"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="4465698996175640549">"Barmoq izi belgisi"</string> @@ -255,7 +257,7 @@ <!-- no translation found for accessibility_work_mode (1280025758672376313) --> <skip /> <string name="accessibility_notification_dismissed" msgid="4411652015138892952">"Xabarnoma e‘tiborsiz qoldirildi."</string> - <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bulutchali xabar yopildi."</string> + <string name="accessibility_bubble_dismissed" msgid="270358867566720729">"Bulutcha yopildi."</string> <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"Xabarnoma soyasi."</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"Tezkor sozlamalar."</string> <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"Qulflash ekrani."</string> @@ -413,7 +415,7 @@ <string name="quick_settings_cellular_detail_data_used" msgid="6798849610647988987">"<xliff:g id="DATA_USED">%s</xliff:g> sarflandi"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="1791389609409211628">"Cheklov: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Ogohlantirish: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Ishchi profil"</string> + <string name="quick_settings_work_mode_label" msgid="2754212289804324685">"Ish profili"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Tungi rejim"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Kunbotarda yoqish"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Quyosh chiqqunicha"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Hammasini tozalash"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Boshqarish"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Tarix"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Sokin bildirishnomalar"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Bildirishnomalarning yuborilishi"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Suhbatlar"</string> @@ -649,7 +653,7 @@ <string name="show_demo_mode" msgid="3677956462273059726">"Demo rejimni ko‘rsatish"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string> <string name="status_bar_alarm" msgid="87160847643623352">"Signal"</string> - <string name="status_bar_work" msgid="5238641949837091056">"Ishchi profil"</string> + <string name="status_bar_work" msgid="5238641949837091056">"Ish profili"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Parvoz rejimi"</string> <string name="add_tile" msgid="6239678623873086686">"Tezkor sozlamalar tugmasini qo‘shish"</string> <string name="broadcast_tile" msgid="5224010633596487481">"Translatsiya tugmasi"</string> @@ -659,7 +663,7 @@ <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="544463655956179791">"Tezkor sozlamalar, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Hotspot"</string> - <string name="accessibility_managed_profile" msgid="4703836746209377356">"Ishchi profil"</string> + <string name="accessibility_managed_profile" msgid="4703836746209377356">"Ish profili"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"Diqqat!"</string> <string name="tuner_warning" msgid="1861736288458481650">"System UI Tuner yordamida siz Android foydalanuvchi interfeysini tuzatish va o‘zingizga moslashtirishingiz mumkin. Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"Ushbu tajribaviy funksiyalar o‘zgarishi, buzilishi yoki keyingi versiyalarda olib tashlanishi mumkin. Ehtiyot bo‘lib davom eting."</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Nomsiz"</string> <string name="restart_button_description" msgid="6916116576177456480">"Bu ilovani qaytadan ishga tushirish va butun ekranga ochish uchun bosing."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g> bulutchalari uchun sozlamalar"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Boshqarish"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g> ilovasidan <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> va yana <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ta bildirishnoma"</string> @@ -1027,12 +1035,12 @@ <string name="controls_favorite_subtitle" msgid="6604402232298443956">"Quvvat tugmasi menyusida chiqadigan boshqaruv elementlarini tanlang"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Boshqaruv elementlarini qayta tartiblash uchun ushlab torting"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Barcha boshqaruv elementlari olib tashlandi"</string> - <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Oʻzgartirishlar saqlanmadi"</string> + <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Oʻzgarishlar saqlanmadi"</string> <string name="controls_favorite_load_error" msgid="2533215155804455348">"Boshqaruv elementlarining barchasi yuklanmadi."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Boshqa"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Qurilma boshqaruv elementlariga kiritish"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Saralanganlarga kiritish"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> ilovasi bu sozlamani saralanganlarga kiritishni taklif qildi."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Kiritish"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"<xliff:g id="APP">%s</xliff:g> tomonidan taklif etilgan"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Boshqaruv elementlari yangilandi"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN kod harflar va belgilardan iborat boʻladi"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Tekshirish: <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 3b5e8b1de7d5..73101b2dfaa0 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Đóng ảnh chụp màn hình"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Xem trước ảnh chụp màn hình"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Trình ghi màn hình"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Thông báo đang diễn ra về phiên ghi màn hình"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Bắt đầu ghi?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Trong khi ghi, Hệ thống Android có thể ghi lại mọi thông tin nhạy cảm hiển thị trên màn hình hoặc phát trên thiết bị của bạn. Những thông tin này bao gồm mật khẩu, thông tin thanh toán, ảnh, thông báo và âm thanh."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Xóa tất cả"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Quản lý"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Lịch sử"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Thông báo im lặng"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Thông báo cảnh báo"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Cuộc trò chuyện"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Không có tiêu đề"</string> <string name="restart_button_description" msgid="6916116576177456480">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Tùy chọn cài đặt cho bong bóng trò chuyện <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Quản lý"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> của <xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g> và <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> bong bóng khác"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Không thể tải danh sách tất cả tùy chọn điều khiển."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Khác"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Thêm vào mục điều khiển thiết bị"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Thêm vào mục yêu thích"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g> đã đề xuất thêm tùy chọn điều khiển này vào mục yêu thích của bạn."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Thêm"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Do <xliff:g id="APP">%s</xliff:g> đề xuất"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Đã cập nhật các tùy chọn điều khiển"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Mã PIN chứa các ký tự hoặc ký hiệu"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Xác minh <xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index f54728001b85..8ea00aef86e5 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"关闭屏幕截图"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"屏幕截图预览"</string> <string name="screenrecord_name" msgid="2596401223859996572">"屏幕录制器"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持续显示屏幕录制会话通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要开始录制吗?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"在录制内容时,Android 系统可以捕捉到您屏幕上显示或设备中播放的敏感信息,其中包括密码、付款信息、照片、消息和音频。"</string> @@ -192,7 +194,7 @@ <string name="accessibility_data_two_bars" msgid="4576231688545173059">"数据信号强度为两格。"</string> <string name="accessibility_data_three_bars" msgid="3036562180893930325">"数据信号强度为三格。"</string> <string name="accessibility_data_signal_full" msgid="283507058258113551">"数据信号满格。"</string> - <string name="accessibility_wifi_name" msgid="4863440268606851734">"已连接到<xliff:g id="WIFI">%s</xliff:g>。"</string> + <string name="accessibility_wifi_name" msgid="4863440268606851734">"已连接到“<xliff:g id="WIFI">%s</xliff:g>”。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"已连接到<xliff:g id="BLUETOOTH">%s</xliff:g>。"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"已连接到 <xliff:g id="CAST">%s</xliff:g>。"</string> <string name="accessibility_no_wimax" msgid="2014864207473859228">"无 WiMAX 信号。"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"历史记录"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"无声通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"提醒通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"对话"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"无标题"</string> <string name="restart_button_description" msgid="6916116576177456480">"点按即可重启此应用并进入全屏模式。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"<xliff:g id="APP_NAME">%1$s</xliff:g>对话泡的设置"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"<xliff:g id="APP_NAME">%2$s</xliff:g>和另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 个应用:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"无法加载所有控件的列表。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"添加到设备控制器"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"添加到收藏夹"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"<xliff:g id="APP">%s</xliff:g>建议将此控件添加到您的收藏夹。"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"添加"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"来自<xliff:g id="APP">%s</xliff:g>的建议"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"控件已更新"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN 码由字母或符号组成"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"验证<xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 5f5b4cba37f6..751767ac5a91 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕畫面錄影工具"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示錄影畫面工作階段通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄影嗎?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"錄影時,Android 系統可擷取螢幕上顯示或裝置播放的任何敏感資料,包括密碼、付款資料、相片、訊息和音訊。"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"記錄"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"提醒通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="restart_button_description" msgid="6916116576177456480">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」小視窗設定"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」的 <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"來自「<xliff:g id="APP_NAME">%2$s</xliff:g>」及另外 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式的<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整控制項清單。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"加到裝置控制"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"加入至常用項目"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"「<xliff:g id="APP">%s</xliff:g>」建議將此控制項加入至常用項目。"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"新增"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"由「<xliff:g id="APP">%s</xliff:g>」提供的建議"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"已更新控制項"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN 含有字母或符號"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"驗證<xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index ba30f14e172a..6f825dea4ee5 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"關閉螢幕截圖"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"螢幕截圖預覽"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕錄影器"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"要開始錄製嗎?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"錄製螢幕畫面時,Android 系統可擷取螢幕上顯示或裝置播放的任何機密資訊,包括密碼、付款資訊、相片、訊息和音訊。"</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"記錄"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"靜音通知"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"快訊通知"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"對話"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> <string name="restart_button_description" msgid="6916116576177456480">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」對話框的設定"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"管理"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"<xliff:g id="APP_NAME">%2$s</xliff:g>:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"「<xliff:g id="APP_NAME">%2$s</xliff:g>」和其他 <xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> 個應用程式:<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"無法載入完整的控制項清單。"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"其他"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"新增至裝置控制"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"新增至常用控制項"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"「<xliff:g id="APP">%s</xliff:g>」建議你將這個控制項新增至常用控制項。"</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"新增"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"來自「<xliff:g id="APP">%s</xliff:g>」的建議"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"已更新控制項"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN 碼含有字母或符號"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"驗證「<xliff:g id="DEVICE">%s</xliff:g>」"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2f8dad987511..a02cfa22949f 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -89,6 +89,8 @@ <string name="screenshot_dismiss_ui_description" msgid="934736855340147968">"Cashisa isithombe-skrini"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ukubuka kuqala isithombe-skrini"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Irekhoda yesikrini"</string> + <!-- no translation found for screenrecord_background_processing_label (7244617554884238898) --> + <skip /> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Isaziso esiqhubekayo seseshini yokurekhoda isikrini"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Qala ukurekhoda?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"Ngenkathi irekhoda, Isistimu ye-Android ingathatha noma iluphi ulwazi olubucayi olubonakal kusikrini sakho noma oludlalwa kudivayisi yakho. Lokhu kufaka phakathi amaphasiwedi, ulwazi lokukhokha, izithombe, imilayezo, nomsindo."</string> @@ -509,6 +511,8 @@ <string name="clear_all_notifications_text" msgid="348312370303046130">"Sula konke"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Phatha"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Umlando"</string> + <!-- no translation found for notification_section_header_incoming (5295312809341711367) --> + <skip /> <string name="notification_section_header_gentle" msgid="3044910806569985386">"Thulisa izaziso"</string> <string name="notification_section_header_alerting" msgid="3168140660646863240">"Izaziso zokuxwayisa"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"Izingxoxo"</string> @@ -987,6 +991,10 @@ <string name="music_controls_no_title" msgid="4166497066552290938">"Asikho isihloko"</string> <string name="restart_button_description" msgid="6916116576177456480">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string> <string name="bubbles_settings_button_description" msgid="7324245408859877545">"Izilungiselelo zamabhamuza e-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <!-- no translation found for bubble_overflow_button_content_description (5523744621434300510) --> + <skip /> + <!-- no translation found for bubble_accessibility_action_add_back (6217995665917123890) --> + <skip /> <string name="manage_bubbles_text" msgid="6856830436329494850">"Phatha"</string> <string name="bubble_content_description_single" msgid="5175160674436546329">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string> <string name="bubble_content_description_stack" msgid="7907610717462651870">"I-<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusukela ku-<xliff:g id="APP_NAME">%2$s</xliff:g> nokungu-<xliff:g id="BUBBLE_COUNT">%3$d</xliff:g> ngaphezulu"</string> @@ -1031,8 +1039,8 @@ <string name="controls_favorite_load_error" msgid="2533215155804455348">"Uhlu lwazo zonke izilawuli alilayishekanga."</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Okunye"</string> <string name="controls_dialog_title" msgid="2343565267424406202">"Engeza kuzilawuli zezinsiza"</string> - <string name="controls_dialog_ok" msgid="7011816381344485651">"Engeza kuzintandokazi"</string> - <string name="controls_dialog_message" msgid="6292099631702047540">"I-<xliff:g id="APP">%s</xliff:g> iphakamise lokhu kulawula ukwengeza kuzintandokazi zakho."</string> + <string name="controls_dialog_ok" msgid="2770230012857881822">"Engeza"</string> + <string name="controls_dialog_message" msgid="342066938390663844">"Kuphakanyiswe ngu-<xliff:g id="APP">%s</xliff:g>"</string> <string name="controls_dialog_confirmation" msgid="586517302736263447">"Izilawuli zibuyekeziwe"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"Iphinikhodi iqukethe amaletha namasimbui"</string> <string name="controls_pin_verify" msgid="3452778292918877662">"Qinisekisa i-<xliff:g id="DEVICE">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index d3256ef34bd7..c4195940d11a 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -154,5 +154,12 @@ <declare-styleable name="CaptionsToggleImageButton"> <attr name="optedOut" format="boolean" /> </declare-styleable> + + <declare-styleable name="IlluminationDrawable"> + <attr name="highlight" format="integer" /> + <attr name="cornerRadius" format="dimension" /> + <attr name="rippleMinSize" format="dimension" /> + <attr name="rippleMaxSize" format="dimension" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 82eda311da6a..b6776005d83e 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -200,6 +200,7 @@ <color name="global_screenshot_button_icon">@color/GM2_blue_500</color> <color name="global_screenshot_dismiss_background">#FFFFFF</color> <color name="global_screenshot_dismiss_foreground">@color/GM2_grey_500</color> + <color name="global_screenshot_background_protection_start">#40000000</color> <!-- 25% black --> <!-- GM2 colors --> <color name="GM2_grey_50">#F8F9FA</color> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index d2f64f930465..14075743ce34 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -530,6 +530,10 @@ <!-- ID for the camera that needs extra protection --> <string translatable="false" name="config_protectedCameraId"></string> + <!-- Comma-separated list of packages to exclude from camera protection e.g. + "com.android.systemui,com.android.xyz" --> + <string translatable="false" name="config_cameraProtectionExcludedPackages"></string> + <!-- Flag to turn on the rendering of the above path or not --> <bool name="config_enableDisplayCutoutProtection">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 2cbb49801aa8..99e347eb1a69 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -306,6 +306,7 @@ <dimen name="global_screenshot_bg_padding">20dp</dimen> <dimen name="global_screenshot_bg_protection_height">400dp</dimen> <dimen name="global_screenshot_x_scale">80dp</dimen> + <dimen name="screenshot_bg_protection_height">242dp</dimen> <dimen name="screenshot_preview_elevation">6dp</dimen> <dimen name="screenshot_offset_y">48dp</dimen> <dimen name="screenshot_offset_x">16dp</dimen> @@ -1168,7 +1169,7 @@ <!-- Default (and minimum) height of the expanded view shown when the bubble is expanded --> <dimen name="bubble_expanded_default_height">180dp</dimen> <!-- Default height of bubble overflow --> - <dimen name="bubble_overflow_height">460dp</dimen> + <dimen name="bubble_overflow_height">480dp</dimen> <!-- Bubble overflow padding when there are no bubbles --> <dimen name="bubble_overflow_empty_state_padding">16dp</dimen> <!-- Padding of container for overflow bubbles --> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 04640f418e97..8156e8dc9bf1 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -144,5 +144,10 @@ <!-- NotificationPanelView --> <item type="id" name="notification_panel" /> + + <!-- Screen Recording --> + <item type="id" name="screen_recording_options" /> + <item type="id" name="screen_recording_dialog_source_text" /> + <item type="id" name="screen_recording_dialog_source_description" /> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 96843f187f72..ec29622c9ba2 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -240,6 +240,8 @@ <!-- Notification title displayed for screen recording [CHAR LIMIT=50]--> <string name="screenrecord_name">Screen Recorder</string> + <!-- Processing screen recoding video in the background [CHAR LIMIT=30]--> + <string name="screenrecord_background_processing_label">Processing screen recording</string> <!-- Description of the screen recording notification channel [CHAR LIMIT=NONE]--> <string name="screenrecord_channel_description">Ongoing notification for a screen record session</string> <!-- Title for the screen prompting the user to begin recording their screen [CHAR LIMIT=NONE]--> @@ -1253,6 +1255,9 @@ <!-- The text for the notification history link. [CHAR LIMIT=40] --> <string name="manage_notifications_history_text">History</string> + <!-- Section title for notifications that have recently appeared. [CHAR LIMIT=40] --> + <string name="notification_section_header_incoming">Incoming</string> + <!-- Section title for notifications that do not vibrate or make noise. [CHAR LIMIT=40] --> <string name="notification_section_header_gentle">Silent notifications</string> @@ -2608,6 +2613,10 @@ <!-- Text used for content description of settings button in the header of expanded bubble view. [CHAR_LIMIT=NONE] --> <string name="bubbles_settings_button_description">Settings for <xliff:g id="app_name" example="YouTube">%1$s</xliff:g> bubbles</string> + <!-- Content description for button that shows bubble overflow on click [CHAR LIMIT=NONE] --> + <string name="bubble_overflow_button_content_description">Overflow</string> + <!-- Action to add overflow bubble back to stack. [CHAR LIMIT=NONE] --> + <string name="bubble_accessibility_action_add_back">Add back to stack</string> <!-- The text for the manage bubbles link. [CHAR LIMIT=NONE] --> <string name="manage_bubbles_text">Manage</string> <!-- Content description when a bubble is focused. [CHAR LIMIT=NONE] --> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index b5e7f4bc061e..f0edd6388ae7 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -620,6 +620,10 @@ <item name="rotateButtonScaleX">-1</item> </style> + <style name="MediaPlayer.Button" parent="@android:style/Widget.Material.Button.Borderless.Small"> + <item name="android:background">@null</item> + </style> + <!-- Used to style charging animation AVD animation --> <style name="ChargingAnim" /> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index a96ef91850df..b37400f691ae 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1664,6 +1664,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); mBroadcastDispatcher.registerReceiverWithHandler(mBroadcastReceiver, filter, mHandler); + // Since ACTION_SERVICE_STATE is being moved to a non-sticky broadcast, trigger the + // listener now with the service state from the default sub. + mBackgroundExecutor.execute(() -> { + int subId = SubscriptionManager.getDefaultSubscriptionId(); + ServiceState serviceState = mContext.getSystemService(TelephonyManager.class) + .getServiceStateForSubscriber(subId); + mHandler.sendMessage( + mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + }); mHandler.post(this::registerRingerTracker); diff --git a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt index 284074e76ae2..3015710e8a98 100644 --- a/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt +++ b/packages/SystemUI/src/com/android/systemui/CameraAvailabilityListener.kt @@ -37,20 +37,22 @@ class CameraAvailabilityListener( private val cameraManager: CameraManager, private val cutoutProtectionPath: Path, private val targetCameraId: String, + excludedPackages: String, private val executor: Executor ) { private var cutoutBounds = Rect() + private val excludedPackageIds: Set<String> private val listeners = mutableListOf<CameraTransitionCallback>() private val availabilityCallback: CameraManager.AvailabilityCallback = object : CameraManager.AvailabilityCallback() { - override fun onCameraAvailable(cameraId: String) { + override fun onCameraClosed(cameraId: String) { if (targetCameraId == cameraId) { notifyCameraInactive() } } - override fun onCameraUnavailable(cameraId: String) { - if (targetCameraId == cameraId) { + override fun onCameraOpened(cameraId: String, packageId: String) { + if (targetCameraId == cameraId && !isExcluded(packageId)) { notifyCameraActive() } } @@ -64,6 +66,7 @@ class CameraAvailabilityListener( computed.top.roundToInt(), computed.right.roundToInt(), computed.bottom.roundToInt()) + excludedPackageIds = excludedPackages.split(",").toSet() } /** @@ -87,6 +90,10 @@ class CameraAvailabilityListener( listeners.remove(callback) } + private fun isExcluded(packageId: String): Boolean { + return excludedPackageIds.contains(packageId) + } + private fun registerCameraListener() { cameraManager.registerAvailabilityCallback(executor, availabilityCallback) } @@ -118,9 +125,10 @@ class CameraAvailabilityListener( val res = context.resources val pathString = res.getString(R.string.config_frontBuiltInDisplayCutoutProtection) val cameraId = res.getString(R.string.config_protectedCameraId) + val excluded = res.getString(R.string.config_cameraProtectionExcludedPackages) return CameraAvailabilityListener( - manager, pathFromString(pathString), cameraId, executor) + manager, pathFromString(pathString), cameraId, excluded, executor) } private fun pathFromString(pathString: String): Path { @@ -135,4 +143,4 @@ class CameraAvailabilityListener( return p } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index 7dea7f83f0c6..7c25d2811793 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -432,7 +432,7 @@ public abstract class AuthBiometricView extends LinearLayout { Utils.notifyAccessibilityContentChanged(mAccessibilityManager, this); } - public void updateState(@BiometricState int newState) { + void updateState(@BiometricState int newState) { Log.v(TAG, "newState: " + newState); switch (newState) { @@ -453,8 +453,10 @@ public abstract class AuthBiometricView extends LinearLayout { } announceForAccessibility(getResources() .getString(R.string.biometric_dialog_authenticated)); - mHandler.postDelayed(() -> mCallback.onAction(Callback.ACTION_AUTHENTICATED), - getDelayAfterAuthenticatedDurationMs()); + mHandler.postDelayed(() -> { + Log.d(TAG, "Sending ACTION_AUTHENTICATED"); + mCallback.onAction(Callback.ACTION_AUTHENTICATED); + }, getDelayAfterAuthenticatedDurationMs()); break; case STATE_PENDING_CONFIRMATION: diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index b736b4df8abf..86087668604e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -113,6 +113,7 @@ public class AuthContainerView extends LinearLayout int mModalityMask; boolean mSkipIntro; long mOperationId; + int mSysUiSessionId; } public static class Builder { @@ -158,6 +159,11 @@ public class AuthContainerView extends LinearLayout return this; } + public Builder setSysUiSessionId(int sysUiSessionId) { + mConfig.mSysUiSessionId = sysUiSessionId; + return this; + } + public AuthContainerView build(int modalityMask) { mConfig.mModalityMask = modalityMask; return new AuthContainerView(mConfig, new Injector()); @@ -203,6 +209,9 @@ public class AuthContainerView extends LinearLayout final class BiometricCallback implements AuthBiometricView.Callback { @Override public void onAction(int action) { + Log.d(TAG, "onAction: " + action + + ", sysUiSessionId: " + mConfig.mSysUiSessionId + + ", state: " + mContainerState); switch (action) { case AuthBiometricView.Callback.ACTION_AUTHENTICATED: animateAway(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED); @@ -461,13 +470,13 @@ public class AuthContainerView extends LinearLayout if (animate) { animateAway(false /* sendReason */, 0 /* reason */); } else { - removeWindowIfAttached(); + removeWindowIfAttached(false /* sendReason */); } } @Override public void dismissFromSystemServer() { - removeWindowIfAttached(); + removeWindowIfAttached(true /* sendReason */); } @Override @@ -540,7 +549,7 @@ public class AuthContainerView extends LinearLayout final Runnable endActionRunnable = () -> { setVisibility(View.INVISIBLE); - removeWindowIfAttached(); + removeWindowIfAttached(true /* sendReason */); }; postOnAnimation(() -> { @@ -575,19 +584,24 @@ public class AuthContainerView extends LinearLayout } private void sendPendingCallbackIfNotNull() { - Log.d(TAG, "pendingCallback: " + mPendingCallbackReason); + Log.d(TAG, "pendingCallback: " + mPendingCallbackReason + + " sysUISessionId: " + mConfig.mSysUiSessionId); if (mPendingCallbackReason != null) { mConfig.mCallback.onDismissed(mPendingCallbackReason, mCredentialAttestation); mPendingCallbackReason = null; } } - private void removeWindowIfAttached() { - sendPendingCallbackIfNotNull(); + private void removeWindowIfAttached(boolean sendReason) { + if (sendReason) { + sendPendingCallbackIfNotNull(); + } if (mContainerState == STATE_GONE) { + Log.w(TAG, "Container already STATE_GONE, mSysUiSessionId: " + mConfig.mSysUiSessionId); return; } + Log.d(TAG, "Removing container, mSysUiSessionId: " + mConfig.mSysUiSessionId); mContainerState = STATE_GONE; mWindowManager.removeView(this); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 0c6794c2ab85..9f0ea3ee46ff 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -276,14 +276,15 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @Override public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId) { + long operationId, int sysUiSessionId) { final int authenticators = Utils.getAuthenticators(bundle); if (DEBUG) { Log.d(TAG, "showAuthenticationDialog, authenticators: " + authenticators + ", biometricModality: " + biometricModality + ", requireConfirmation: " + requireConfirmation - + ", operationId: " + operationId); + + ", operationId: " + operationId + + ", sysUiSessionId: " + sysUiSessionId); } SomeArgs args = SomeArgs.obtain(); args.arg1 = bundle; @@ -293,6 +294,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, args.argi2 = userId; args.arg4 = opPackageName; args.arg5 = operationId; + args.argi3 = sysUiSessionId; boolean skipAnimation = false; if (mCurrentDialog != null) { @@ -382,6 +384,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, final int userId = args.argi2; final String opPackageName = (String) args.arg4; final long operationId = (long) args.arg5; + final int sysUiSessionId = args.argi3; // Create a new dialog but do not replace the current one yet. final AuthDialog newDialog = buildDialog( @@ -391,7 +394,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, type, opPackageName, skipAnimation, - operationId); + operationId, + sysUiSessionId); if (newDialog == null) { Log.e(TAG, "Unsupported type: " + type); @@ -403,7 +407,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, + " savedState: " + savedState + " mCurrentDialog: " + mCurrentDialog + " newDialog: " + newDialog - + " type: " + type); + + " type: " + type + + " sysUiSessionId: " + sysUiSessionId); } if (mCurrentDialog != null) { @@ -458,7 +463,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } protected AuthDialog buildDialog(Bundle biometricPromptBundle, boolean requireConfirmation, - int userId, int type, String opPackageName, boolean skipIntro, long operationId) { + int userId, int type, String opPackageName, boolean skipIntro, long operationId, + int sysUiSessionId) { return new AuthContainerView.Builder(mContext) .setCallback(this) .setBiometricPromptBundle(biometricPromptBundle) @@ -467,6 +473,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, .setOpPackageName(opPackageName) .setSkipIntro(skipIntro) .setOperationId(operationId) + .setSysUiSessionId(sysUiSessionId) .build(type); } } diff --git a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt index 4e84f06f51a7..3272fb7545e2 100644 --- a/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt +++ b/packages/SystemUI/src/com/android/systemui/broadcast/UserBroadcastDispatcher.kt @@ -32,6 +32,8 @@ import com.android.internal.util.Preconditions import com.android.systemui.Dumpable import java.io.FileDescriptor import java.io.PrintWriter +import java.lang.IllegalArgumentException +import java.lang.IllegalStateException import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger @@ -211,7 +213,12 @@ class UserBroadcastDispatcher( */ override fun run() { if (registered.get()) { - context.unregisterReceiver(this@UserBroadcastDispatcher) + try { + context.unregisterReceiver(this@UserBroadcastDispatcher) + } catch (e: IllegalArgumentException) { + Log.e(TAG, "Trying to unregister unregistered receiver for user $userId", + IllegalStateException(e)) + } registered.set(false) } // Short interval without receiver, this can be problematic diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt index 63dd801be7ca..b9825e1d21e5 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleDataRepository.kt @@ -16,6 +16,7 @@ package com.android.systemui.bubbles import android.annotation.UserIdInt +import android.util.Log import com.android.systemui.bubbles.storage.BubblePersistentRepository import com.android.systemui.bubbles.storage.BubbleVolatileRepository import com.android.systemui.bubbles.storage.BubbleXmlEntity @@ -35,36 +36,39 @@ internal class BubbleDataRepository @Inject constructor( ) { private val ioScope = CoroutineScope(Dispatchers.IO) + private val uiScope = CoroutineScope(Dispatchers.Main) private var job: Job? = null /** * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk * asynchronously. */ - fun addBubble(@UserIdInt userId: Int, bubble: Bubble) { - volatileRepository.addBubble( - BubbleXmlEntity(userId, bubble.packageName, bubble.shortcutInfo?.id ?: return)) - persistToDisk() - } + fun addBubble(@UserIdInt userId: Int, bubble: Bubble) = addBubbles(userId, listOf(bubble)) /** * Adds the bubble in memory, then persists the snapshot after adding the bubble to disk * asynchronously. */ fun addBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) { - volatileRepository.addBubbles(bubbles.mapNotNull { - val shortcutId = it.shortcutInfo?.id ?: return@mapNotNull null - BubbleXmlEntity(userId, it.packageName, shortcutId) - }) - persistToDisk() + if (DEBUG) Log.d(TAG, "adding ${bubbles.size} bubbles") + val entities = transform(userId, bubbles).also(volatileRepository::addBubbles) + if (entities.isNotEmpty()) persistToDisk() } + /** + * Removes the bubbles from memory, then persists the snapshot to disk asynchronously. + */ fun removeBubbles(@UserIdInt userId: Int, bubbles: List<Bubble>) { - volatileRepository.removeBubbles(bubbles.mapNotNull { - val shortcutId = it.shortcutInfo?.id ?: return@mapNotNull null - BubbleXmlEntity(userId, it.packageName, shortcutId) - }) - persistToDisk() + if (DEBUG) Log.d(TAG, "removing ${bubbles.size} bubbles") + val entities = transform(userId, bubbles).also(volatileRepository::removeBubbles) + if (entities.isNotEmpty()) persistToDisk() + } + + private fun transform(userId: Int, bubbles: List<Bubble>): List<BubbleXmlEntity> { + return bubbles.mapNotNull { b -> + val shortcutId = b.shortcutInfo?.id ?: return@mapNotNull null + BubbleXmlEntity(userId, b.packageName, shortcutId) + } } /** @@ -92,4 +96,19 @@ internal class BubbleDataRepository @Inject constructor( persistentRepository.persistsToDisk(volatileRepository.bubbles) } } + + /** + * Load bubbles from disk. + */ + fun loadBubbles(cb: (List<Bubble>) -> Unit) = ioScope.launch { + val bubbleXmlEntities = persistentRepository.readFromDisk() + volatileRepository.addBubbles(bubbleXmlEntities) + uiScope.launch { + // TODO: transform bubbleXmlEntities into bubbles + // cb(bubbles) + } + } } + +private const val TAG = "BubbleDataRepository" +private const val DEBUG = false diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index b3c2c6d60708..baf92dc7abe7 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -57,6 +57,7 @@ import android.view.Gravity; import android.view.View; import android.view.WindowInsets; import android.view.WindowManager; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.LinearLayout; import com.android.internal.policy.ScreenDecorationsUtils; @@ -456,6 +457,19 @@ public class BubbleExpandedView extends LinearLayout { mSettingsIcon.setContentDescription(getResources().getString( R.string.bubbles_settings_button_description, bubble.getAppName())); + mSettingsIcon.setAccessibilityDelegate( + new AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, + AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + // On focus, have TalkBack say + // "Actions available. Use swipe up then right to view." + // in addition to the default "double tap to activate". + mStackView.setupLocalMenu(info); + } + }); + if (isNew) { mPendingIntent = mBubble.getBubbleIntent(); if (mPendingIntent != null || mBubble.getShortcutInfo() != null) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflow.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflow.java index 13669a68defa..e96bef36ba18 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflow.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflow.java @@ -73,12 +73,13 @@ public class BubbleOverflow implements BubbleViewProvider { updateIcon(mContext, parentViewGroup); } - // TODO(b/149146374) Propagate theme change to bubbles in overflow. void updateIcon(Context context, ViewGroup parentViewGroup) { mInflater = LayoutInflater.from(context); mOverflowBtn = (BadgedImageView) mInflater.inflate(R.layout.bubble_overflow_button, parentViewGroup /* root */, false /* attachToRoot */); + mOverflowBtn.setContentDescription(mContext.getResources().getString( + R.string.bubble_overflow_button_content_description)); TypedArray ta = mContext.obtainStyledAttributes( new int[]{android.R.attr.colorBackgroundFloating}); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java index de54c353fc85..c2ca9fad6d43 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleOverflowActivity.java @@ -21,6 +21,7 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import android.app.Activity; +import android.app.Notification; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -32,6 +33,7 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -103,7 +105,7 @@ public class BubbleOverflowActivity extends Activity { - res.getDimensionPixelSize(R.dimen.bubble_overflow_padding); final int viewHeight = recyclerViewHeight / rows; - mAdapter = new BubbleOverflowAdapter(mOverflowBubbles, + mAdapter = new BubbleOverflowAdapter(getApplicationContext(), mOverflowBubbles, mBubbleController::promoteBubbleFromOverflow, viewWidth, viewHeight); mRecyclerView.setAdapter(mAdapter); @@ -221,13 +223,15 @@ public class BubbleOverflowActivity extends Activity { } class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.ViewHolder> { + private Context mContext; private Consumer<Bubble> mPromoteBubbleFromOverflow; private List<Bubble> mBubbles; private int mWidth; private int mHeight; - public BubbleOverflowAdapter(List<Bubble> list, Consumer<Bubble> promoteBubble, int width, - int height) { + public BubbleOverflowAdapter(Context context, List<Bubble> list, Consumer<Bubble> promoteBubble, + int width, int height) { + mContext = context; mBubbles = list; mPromoteBubbleFromOverflow = promoteBubble; mWidth = width; @@ -260,6 +264,32 @@ class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.V mPromoteBubbleFromOverflow.accept(b); }); + final CharSequence titleCharSeq = + b.getEntry().getSbn().getNotification().extras.getCharSequence( + Notification.EXTRA_TITLE); + String titleStr = mContext.getResources().getString(R.string.notification_bubble_title); + if (titleCharSeq != null) { + titleStr = titleCharSeq.toString(); + } + vh.iconView.setContentDescription(mContext.getResources().getString( + R.string.bubble_content_description_single, titleStr, b.getAppName())); + + vh.iconView.setAccessibilityDelegate( + new View.AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, + AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + // Talkback prompts "Double tap to add back to stack" + // instead of the default "Double tap to activate" + info.addAction( + new AccessibilityNodeInfo.AccessibilityAction( + AccessibilityNodeInfo.ACTION_CLICK, + mContext.getResources().getString( + R.string.bubble_accessibility_action_add_back))); + } + }); + Bubble.FlyoutMessage message = b.getFlyoutMessage(); if (message != null && message.senderName != null) { vh.textView.setText(message.senderName); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 35ac78df29ab..2cb097f6075e 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -454,7 +454,6 @@ public class BubbleStackView extends FrameLayout // that means overflow was previously expanded. Set the selected bubble // internally without going through BubbleData (which would ignore it since it's // already selected). - mBubbleData.setShowingOverflow(true); setSelectedBubble(clickedBubble); } } else { @@ -1076,26 +1075,27 @@ public class BubbleStackView extends FrameLayout @Override public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfoInternal(info); + setupLocalMenu(info); + } + + void setupLocalMenu(AccessibilityNodeInfo info) { + Resources res = mContext.getResources(); - // Custom actions. + // Custom local actions. AccessibilityAction moveTopLeft = new AccessibilityAction(R.id.action_move_top_left, - getContext().getResources() - .getString(R.string.bubble_accessibility_action_move_top_left)); + res.getString(R.string.bubble_accessibility_action_move_top_left)); info.addAction(moveTopLeft); AccessibilityAction moveTopRight = new AccessibilityAction(R.id.action_move_top_right, - getContext().getResources() - .getString(R.string.bubble_accessibility_action_move_top_right)); + res.getString(R.string.bubble_accessibility_action_move_top_right)); info.addAction(moveTopRight); AccessibilityAction moveBottomLeft = new AccessibilityAction(R.id.action_move_bottom_left, - getContext().getResources() - .getString(R.string.bubble_accessibility_action_move_bottom_left)); + res.getString(R.string.bubble_accessibility_action_move_bottom_left)); info.addAction(moveBottomLeft); AccessibilityAction moveBottomRight = new AccessibilityAction(R.id.action_move_bottom_right, - getContext().getResources() - .getString(R.string.bubble_accessibility_action_move_bottom_right)); + res.getString(R.string.bubble_accessibility_action_move_bottom_right)); info.addAction(moveBottomRight); // Default actions. @@ -1343,7 +1343,10 @@ public class BubbleStackView extends FrameLayout } if (bubbleToSelect == null || bubbleToSelect.getKey() != BubbleOverflow.KEY) { mBubbleData.setShowingOverflow(false); + } else { + mBubbleData.setShowingOverflow(true); } + final BubbleViewProvider previouslySelected = mExpandedBubble; mExpandedBubble = bubbleToSelect; updatePointerPosition(); diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt index b2495c658948..149e2c4c4022 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubblePersistentRepository.kt @@ -33,6 +33,7 @@ class BubblePersistentRepository @Inject constructor( "overflow_bubbles.xml"), "overflow-bubbles") fun persistsToDisk(bubbles: List<BubbleXmlEntity>): Boolean { + if (DEBUG) Log.d(TAG, "persisting ${bubbles.size} bubbles") synchronized(bubbleFile) { val stream: FileOutputStream = try { bubbleFile.startWrite() } catch (e: IOException) { Log.e(TAG, "Failed to save bubble file", e) @@ -41,6 +42,7 @@ class BubblePersistentRepository @Inject constructor( try { writeXml(stream, bubbles) bubbleFile.finishWrite(stream) + if (DEBUG) Log.d(TAG, "persisted ${bubbles.size} bubbles") return true } catch (e: Exception) { Log.e(TAG, "Failed to save bubble file, restoring backup", e) @@ -49,6 +51,16 @@ class BubblePersistentRepository @Inject constructor( } return false } + + fun readFromDisk(): List<BubbleXmlEntity> { + synchronized(bubbleFile) { + try { return bubbleFile.openRead().use(::readXml) } catch (e: Throwable) { + Log.e(TAG, "Failed to open bubble file", e) + } + return emptyList() + } + } } private const val TAG = "BubblePersistentRepository" +private const val DEBUG = false diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt index 3dba26807485..e1f675b83583 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleVolatileRepository.kt @@ -39,12 +39,6 @@ class BubbleVolatileRepository @Inject constructor() { get() = entities.toList() /** - * Add the bubble to memory and perform a de-duplication. In case the bubble already exists, - * the bubble will be moved to the last. - */ - fun addBubble(bubble: BubbleXmlEntity) = addBubbles(listOf(bubble)) - - /** * Add the bubbles to memory and perform a de-duplication. In case a bubble already exists, * it will be moved to the last. */ @@ -55,7 +49,7 @@ class BubbleVolatileRepository @Inject constructor() { if (entities.size + bubbles.size >= CAPACITY) { entities.drop(entities.size + bubbles.size - CAPACITY) } - entities.addAll(bubbles.reversed()) + entities.addAll(bubbles) } @Synchronized diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt index 3192f34b69fd..1e91653c6db7 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/bubbles/storage/BubbleXmlHelper.kt @@ -18,6 +18,10 @@ package com.android.systemui.bubbles.storage import com.android.internal.util.FastXmlSerializer import org.xmlpull.v1.XmlSerializer import java.io.IOException +import android.util.Xml +import com.android.internal.util.XmlUtils +import org.xmlpull.v1.XmlPullParser +import java.io.InputStream import java.io.OutputStream import java.nio.charset.StandardCharsets @@ -57,4 +61,35 @@ private fun writeXmlEntry(serializer: XmlSerializer, bubble: BubbleXmlEntity) { } catch (e: IOException) { throw RuntimeException(e) } +} + +/** + * Reads the bubbles from xml file. + */ +fun readXml(stream: InputStream): List<BubbleXmlEntity> { + val bubbles = mutableListOf<BubbleXmlEntity>() + val parser: XmlPullParser = Xml.newPullParser() + parser.setInput(stream, StandardCharsets.UTF_8.name()) + XmlUtils.beginDocument(parser, TAG_BUBBLES) + val outerDepth = parser.depth + while (XmlUtils.nextElementWithin(parser, outerDepth)) { + bubbles.add(readXmlEntry(parser) ?: continue) + } + return bubbles +} + +private fun readXmlEntry(parser: XmlPullParser): BubbleXmlEntity? { + while (parser.eventType != XmlPullParser.START_TAG) { parser.next() } + return BubbleXmlEntity( + parser.getAttributeWithName(ATTR_USER_ID)?.toInt() ?: return null, + parser.getAttributeWithName(ATTR_PACKAGE) ?: return null, + parser.getAttributeWithName(ATTR_SHORTCUT_ID) ?: return null + ) +} + +private fun XmlPullParser.getAttributeWithName(name: String): String? { + for (i in 0 until attributeCount) { + if (getAttributeName(i) == name) return getAttributeValue(i) + } + return null }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java index 8c572fe8f842..6d1bf72f4913 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java @@ -20,10 +20,15 @@ import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME; import android.content.Context; +import android.os.Handler; +import android.os.PowerManager; import androidx.annotation.Nullable; import com.android.keyguard.KeyguardViewController; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.plugins.qs.QSFactory; @@ -81,10 +86,17 @@ public abstract class SystemUIDefaultModule { abstract NotificationLockscreenUserManager bindNotificationLockscreenUserManager( NotificationLockscreenUserManagerImpl notificationLockscreenUserManager); - @Binds + @Provides @Singleton - public abstract BatteryController provideBatteryController( - BatteryControllerImpl controllerImpl); + static BatteryController provideBatteryController(Context context, + EnhancedEstimates enhancedEstimates, PowerManager powerManager, + BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, + @Background Handler bgHandler) { + BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager, + broadcastDispatcher, mainHandler, bgHandler); + bC.init(); + return bC; + } @Binds @Singleton diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/LongRunning.java b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/LongRunning.java new file mode 100644 index 000000000000..e90781b48f23 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/LongRunning.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.dagger.qualifiers; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Qualifier; + +@Qualifier +@Documented +@Retention(RUNTIME) +public @interface LongRunning { +} diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 10776c91df84..e1081cd5ef82 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -41,6 +41,9 @@ import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.UiEvent; +import com.android.internal.logging.UiEventLogger; +import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.logging.nano.MetricsProto; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.statusbar.phone.DozeParameters; @@ -56,8 +59,8 @@ import java.util.function.Consumer; public class DozeSensors { private static final boolean DEBUG = DozeService.DEBUG; - private static final String TAG = "DozeSensors"; + private static final UiEventLogger UI_EVENT_LOGGER = new UiEventLoggerImpl(); private final Context mContext; private final AlarmManager mAlarmManager; @@ -79,6 +82,23 @@ public class DozeSensors { private boolean mListening; private boolean mPaused; + @VisibleForTesting + public enum DozeSensorsUiEvent implements UiEventLogger.UiEventEnum { + @UiEvent(doc = "User performs pickup gesture that activates the ambient display") + ACTION_AMBIENT_GESTURE_PICKUP(459); + + private final int mId; + + DozeSensorsUiEvent(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + } + public DozeSensors(Context context, AlarmManager alarmManager, AsyncSensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, Callback callback, Consumer<Boolean> proxCallback, DozeLog dozeLog) { @@ -416,6 +436,7 @@ public class DozeSensors { MetricsLogger.action( mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE, subType); + UI_EVENT_LOGGER.log(DozeSensorsUiEvent.ACTION_AMBIENT_GESTURE_PICKUP); } mRegistered = false; diff --git a/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt new file mode 100644 index 000000000000..937472735bb0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt @@ -0,0 +1,264 @@ +package com.android.systemui.media + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ValueAnimator +import android.content.res.ColorStateList +import android.content.res.Resources +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.ColorFilter +import android.graphics.Paint +import android.graphics.PixelFormat +import android.graphics.RadialGradient +import android.graphics.Rect +import android.graphics.Shader +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.util.MathUtils +import android.util.MathUtils.lerp +import android.view.MotionEvent +import android.view.View +import androidx.annotation.Keep +import com.android.internal.graphics.ColorUtils +import com.android.internal.graphics.ColorUtils.blendARGB +import com.android.systemui.Interpolators +import com.android.systemui.R +import org.xmlpull.v1.XmlPullParser + +private const val BACKGROUND_ANIM_DURATION = 370L +private const val RIPPLE_ANIM_DURATION = 800L +private const val RIPPLE_DOWN_PROGRESS = 0.05f +private const val RIPPLE_CANCEL_DURATION = 200L +private val GRADIENT_STOPS = floatArrayOf(0.2f, 1f) + +private data class RippleData( + var x: Float, + var y: Float, + var alpha: Float, + var progress: Float, + var minSize: Float, + var maxSize: Float, + var highlight: Float +) + +/** + * Drawable that can draw an animated gradient when tapped. + */ +@Keep +class IlluminationDrawable : Drawable() { + + private var cornerRadius = 0f + private var highlightColor = Color.TRANSPARENT + private val rippleData = RippleData(0f, 0f, 0f, 0f, 0f, 0f, 0f) + private var tmpHsl = floatArrayOf(0f, 0f, 0f) + private var paint = Paint() + + private var backgroundColor = Color.TRANSPARENT + set(value) { + if (value == field) { + return + } + field = value + animateBackground() + } + + /** + * Draw a small highlight under the finger before expanding (or cancelling) it. + */ + private var pressed: Boolean = false + set(value) { + if (value == field) { + return + } + field = value + + if (value) { + rippleAnimation?.cancel() + rippleData.alpha = 1f + rippleData.progress = RIPPLE_DOWN_PROGRESS + } else { + rippleAnimation?.cancel() + rippleAnimation = ValueAnimator.ofFloat(rippleData.alpha, 0f).apply { + duration = RIPPLE_CANCEL_DURATION + interpolator = Interpolators.LINEAR_OUT_SLOW_IN + addUpdateListener { + rippleData.alpha = it.animatedValue as Float + invalidateSelf() + } + addListener(object : AnimatorListenerAdapter() { + var cancelled = false + override fun onAnimationCancel(animation: Animator?) { + cancelled = true; + } + + override fun onAnimationEnd(animation: Animator?) { + if (cancelled) { + return + } + rippleData.progress = 0f + rippleData.alpha = 0f + rippleAnimation = null + invalidateSelf() + } + }) + start() + } + } + invalidateSelf() + } + + private var rippleAnimation: Animator? = null + private var backgroundAnimation: ValueAnimator? = null + + /** + * Draw background and gradient. + */ + override fun draw(canvas: Canvas) { + paint.shader = if (rippleData.progress > 0) { + val radius = lerp(rippleData.minSize, rippleData.maxSize, rippleData.progress) + val centerColor = blendARGB(paint.color, highlightColor, rippleData.alpha) + RadialGradient(rippleData.x, rippleData.y, radius, intArrayOf(centerColor, paint.color), + GRADIENT_STOPS, Shader.TileMode.CLAMP) + } else { + null + } + canvas.drawRoundRect(0f, 0f, bounds.width().toFloat(), bounds.height().toFloat(), + cornerRadius, cornerRadius, paint) + } + + override fun getOpacity(): Int { + return PixelFormat.TRANSPARENT + } + + override fun inflate( + r: Resources, + parser: XmlPullParser, + attrs: AttributeSet, + theme: Resources.Theme? + ) { + val a = obtainAttributes(r, theme, attrs, R.styleable.IlluminationDrawable) + cornerRadius = a.getDimension(R.styleable.IlluminationDrawable_cornerRadius, cornerRadius) + rippleData.minSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMinSize, 0f) + rippleData.maxSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMaxSize, 0f) + rippleData.highlight = a.getInteger(R.styleable.IlluminationDrawable_highlight, 0) / 100f + a.recycle() + } + + override fun setColorFilter(p0: ColorFilter?) { + throw UnsupportedOperationException("Color filters are not supported") + } + + override fun setAlpha(value: Int) { + throw UnsupportedOperationException("Alpha is not supported") + } + + /** + * Cross fade background. + * @see setTintList + * @see backgroundColor + */ + private fun animateBackground() { + ColorUtils.colorToHSL(backgroundColor, tmpHsl) + val L = tmpHsl[2] + tmpHsl[2] = MathUtils.constrain(if (L < 1f - rippleData.highlight) { + L + rippleData.highlight + } else { + L - rippleData.highlight + }, 0f, 1f) + + val initialBackground = paint.color + val initialHighlight = highlightColor + val finalHighlight = ColorUtils.HSLToColor(tmpHsl) + + backgroundAnimation?.cancel() + backgroundAnimation = ValueAnimator.ofFloat(0f, 1f).apply { + duration = BACKGROUND_ANIM_DURATION + interpolator = Interpolators.FAST_OUT_LINEAR_IN + addUpdateListener { + val progress = it.animatedValue as Float + paint.color = blendARGB(initialBackground, backgroundColor, progress) + highlightColor = blendARGB(initialHighlight, finalHighlight, progress) + invalidateSelf() + } + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + backgroundAnimation = null + } + }) + start() + } + } + + override fun setTintList(tint: ColorStateList?) { + super.setTintList(tint) + backgroundColor = tint!!.defaultColor + } + + /** + * Draws an animated ripple that expands fading away. + */ + private fun illuminate() { + rippleData.alpha = 1f + invalidateSelf() + + rippleAnimation?.cancel() + rippleAnimation = AnimatorSet().apply { + playTogether(ValueAnimator.ofFloat(1f, 0f).apply { + startDelay = 133 + duration = RIPPLE_ANIM_DURATION - startDelay + interpolator = Interpolators.LINEAR_OUT_SLOW_IN + addUpdateListener { + rippleData.alpha = it.animatedValue as Float + invalidateSelf() + } + }, ValueAnimator.ofFloat(rippleData.progress, 1f).apply { + duration = RIPPLE_ANIM_DURATION + interpolator = Interpolators.LINEAR_OUT_SLOW_IN + addUpdateListener { + rippleData.progress = it.animatedValue as Float + invalidateSelf() + } + }) + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + rippleData.progress = 0f + rippleAnimation = null + invalidateSelf() + } + }) + start() + } + } + + /** + * Setup touch events on a view such as tapping it would trigger effects on this drawable. + * @param target View receiving touched. + * @param container View that holds this drawable. + */ + fun setupTouch(target: View, container: View) { + val containerRect = Rect() + target.setOnTouchListener { view: View, event: MotionEvent -> + container.getGlobalVisibleRect(containerRect) + rippleData.x = event.rawX - containerRect.left + rippleData.y = event.rawY - containerRect.top + + when (event.action) { + MotionEvent.ACTION_DOWN -> { + pressed = true + } + MotionEvent.ACTION_MOVE -> { + invalidateSelf() + } + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { + pressed = false + if (event.action == MotionEvent.ACTION_UP) { + illuminate() + } + } + } + false + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java index f322489b8dc2..f72de11a01ed 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java @@ -376,7 +376,8 @@ public class PipAnimationController { // NOTE: intentionally does not apply the transaction here. // this end transaction should get executed synchronously with the final // WindowContainerTransaction in task organizer - getSurfaceTransactionHelper().resetScale(tx, leash, getDestinationBounds()); + getSurfaceTransactionHelper().resetScale(tx, leash, getDestinationBounds()) + .crop(tx, leash, getDestinationBounds()); } }; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java index ec15dd16f46e..1982227032cf 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java @@ -27,7 +27,7 @@ import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_ALL import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_CONTROLLER_MESSENGER; import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_DISMISS_FRACTION; import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_MENU_STATE; -import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_MOVEMENT_BOUNDS; +import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_SHOW_MENU_WITH_DELAY; import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_STACK_BOUNDS; import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_WILL_RESIZE_MENU; import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE; @@ -138,9 +138,9 @@ public class PipMenuActivity extends Activity { final Bundle data = (Bundle) msg.obj; showMenu(data.getInt(EXTRA_MENU_STATE), data.getParcelable(EXTRA_STACK_BOUNDS), - data.getParcelable(EXTRA_MOVEMENT_BOUNDS), data.getBoolean(EXTRA_ALLOW_TIMEOUT), - data.getBoolean(EXTRA_WILL_RESIZE_MENU)); + data.getBoolean(EXTRA_WILL_RESIZE_MENU), + data.getBoolean(EXTRA_SHOW_MENU_WITH_DELAY)); break; } case MESSAGE_POKE_MENU: @@ -177,12 +177,7 @@ public class PipMenuActivity extends Activity { private Messenger mToControllerMessenger; private Messenger mMessenger = new Messenger(mHandler); - private final Runnable mFinishRunnable = new Runnable() { - @Override - public void run() { - hideMenu(); - } - }; + private final Runnable mFinishRunnable = this::hideMenu; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -321,8 +316,8 @@ public class PipMenuActivity extends Activity { // Do nothing } - private void showMenu(int menuState, Rect stackBounds, Rect movementBounds, - boolean allowMenuTimeout, boolean resizeMenuOnShow) { + private void showMenu(int menuState, Rect stackBounds, boolean allowMenuTimeout, + boolean resizeMenuOnShow, boolean withDelay) { mAllowMenuTimeout = allowMenuTimeout; if (mMenuState != menuState) { // Disallow touches if the menu needs to resize while showing, and we are transitioning @@ -335,7 +330,6 @@ public class PipMenuActivity extends Activity { if (mMenuContainerAnimator != null) { mMenuContainerAnimator.cancel(); } - notifyMenuStateChange(menuState, resizeMenuOnShow); mMenuContainerAnimator = new AnimatorSet(); ObjectAnimator menuAnim = ObjectAnimator.ofFloat(mMenuContainer, View.ALPHA, mMenuContainer.getAlpha(), 1f); @@ -359,7 +353,13 @@ public class PipMenuActivity extends Activity { } }); } - mMenuContainerAnimator.start(); + if (withDelay) { + // starts the menu container animation after window expansion is completed + notifyMenuStateChange(menuState, resizeMenuOnShow, mMenuContainerAnimator::start); + } else { + notifyMenuStateChange(menuState, resizeMenuOnShow, null /* callback */); + mMenuContainerAnimator.start(); + } } else { // If we are already visible, then just start the delayed dismiss and unregister any // existing input consumers from the previous drag @@ -382,7 +382,7 @@ public class PipMenuActivity extends Activity { if (mMenuState != MENU_STATE_NONE) { cancelDelayedFinish(); if (notifyMenuVisibility) { - notifyMenuStateChange(MENU_STATE_NONE, mResize); + notifyMenuStateChange(MENU_STATE_NONE, mResize, null /* callback */); } mMenuContainerAnimator = new AnimatorSet(); ObjectAnimator menuAnim = ObjectAnimator.ofFloat(mMenuContainer, View.ALPHA, @@ -434,10 +434,10 @@ public class PipMenuActivity extends Activity { final int menuState = intent.getIntExtra(EXTRA_MENU_STATE, MENU_STATE_NONE); if (menuState != MENU_STATE_NONE) { Rect stackBounds = intent.getParcelableExtra(EXTRA_STACK_BOUNDS); - Rect movementBounds = intent.getParcelableExtra(EXTRA_MOVEMENT_BOUNDS); boolean allowMenuTimeout = intent.getBooleanExtra(EXTRA_ALLOW_TIMEOUT, true); boolean willResizeMenu = intent.getBooleanExtra(EXTRA_WILL_RESIZE_MENU, false); - showMenu(menuState, stackBounds, movementBounds, allowMenuTimeout, willResizeMenu); + boolean withDelay = intent.getBooleanExtra(EXTRA_SHOW_MENU_WITH_DELAY, false); + showMenu(menuState, stackBounds, allowMenuTimeout, willResizeMenu, withDelay); } } @@ -540,13 +540,14 @@ public class PipMenuActivity extends Activity { mBackgroundDrawable.setAlpha(alpha); } - private void notifyMenuStateChange(int menuState, boolean resize) { + private void notifyMenuStateChange(int menuState, boolean resize, Runnable callback) { mMenuState = menuState; mResize = resize; Message m = Message.obtain(); m.what = PipMenuActivityController.MESSAGE_MENU_STATE_CHANGED; m.arg1 = menuState; m.arg2 = resize ? 1 : 0; + m.obj = callback; sendMessage(m, "Could not notify controller of PIP menu visibility"); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java index 61ed40d5d782..1608f833c169 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java @@ -60,11 +60,11 @@ public class PipMenuActivityController { public static final String EXTRA_CONTROLLER_MESSENGER = "messenger"; public static final String EXTRA_ACTIONS = "actions"; public static final String EXTRA_STACK_BOUNDS = "stack_bounds"; - public static final String EXTRA_MOVEMENT_BOUNDS = "movement_bounds"; public static final String EXTRA_ALLOW_TIMEOUT = "allow_timeout"; public static final String EXTRA_WILL_RESIZE_MENU = "resize_menu_on_show"; public static final String EXTRA_DISMISS_FRACTION = "dismiss_fraction"; public static final String EXTRA_MENU_STATE = "menu_state"; + public static final String EXTRA_SHOW_MENU_WITH_DELAY = "show_menu_with_delay"; public static final int MESSAGE_MENU_STATE_CHANGED = 100; public static final int MESSAGE_EXPAND_PIP = 101; @@ -89,7 +89,7 @@ public class PipMenuActivityController { * @param menuState the current state of the menu * @param resize whether or not to resize the PiP with the state change */ - void onPipMenuStateChanged(int menuState, boolean resize); + void onPipMenuStateChanged(int menuState, boolean resize, Runnable callback); /** * Called when the PIP requested to be expanded. @@ -130,7 +130,7 @@ public class PipMenuActivityController { case MESSAGE_MENU_STATE_CHANGED: { int menuState = msg.arg1; boolean resize = msg.arg2 != 0; - onMenuStateChanged(menuState, resize); + onMenuStateChanged(menuState, resize, (Runnable) msg.obj); break; } case MESSAGE_EXPAND_PIP: { @@ -155,7 +155,7 @@ public class PipMenuActivityController { // Mark the menu as invisible once the activity finishes as well if (mToActivityMessenger == null) { final boolean resize = msg.arg1 != 0; - onMenuStateChanged(MENU_STATE_NONE, resize); + onMenuStateChanged(MENU_STATE_NONE, resize, null /* callback */); } break; } @@ -247,21 +247,38 @@ public class PipMenuActivityController { // If we haven't requested the start activity, or if it previously took too long to // start, then start it startMenuActivity(MENU_STATE_NONE, null /* stackBounds */, - null /* movementBounds */, false /* allowMenuTimeout */, - false /* resizeMenuOnShow */); + false /* allowMenuTimeout */, false /* resizeMenuOnShow */, + false /* withDelay */); } } /** - * Shows the menu activity. + * Similar to {@link #showMenu(int, Rect, boolean, boolean)} but only show the menu upon + * PiP window transition is finished. */ - public void showMenu(int menuState, Rect stackBounds, Rect movementBounds, - boolean allowMenuTimeout, boolean willResizeMenu) { + public void showMenuWithDelay(int menuState, Rect stackBounds, boolean allowMenuTimeout, + boolean willResizeMenu) { + showMenuInternal(menuState, stackBounds, allowMenuTimeout, willResizeMenu, + true /* withDelay */); + } + + /** + * Shows the menu activity immediately. + */ + public void showMenu(int menuState, Rect stackBounds, boolean allowMenuTimeout, + boolean willResizeMenu) { + showMenuInternal(menuState, stackBounds, allowMenuTimeout, willResizeMenu, + false /* withDelay */); + } + + private void showMenuInternal(int menuState, Rect stackBounds, boolean allowMenuTimeout, + boolean willResizeMenu, boolean withDelay) { if (DEBUG) { Log.d(TAG, "showMenu() state=" + menuState + " hasActivity=" + (mToActivityMessenger != null) + " allowMenuTimeout=" + allowMenuTimeout + " willResizeMenu=" + willResizeMenu + + " withDelay=" + withDelay + " callers=\n" + Debug.getCallers(5, " ")); } @@ -271,9 +288,9 @@ public class PipMenuActivityController { if (stackBounds != null) { data.putParcelable(EXTRA_STACK_BOUNDS, stackBounds); } - data.putParcelable(EXTRA_MOVEMENT_BOUNDS, movementBounds); data.putBoolean(EXTRA_ALLOW_TIMEOUT, allowMenuTimeout); data.putBoolean(EXTRA_WILL_RESIZE_MENU, willResizeMenu); + data.putBoolean(EXTRA_SHOW_MENU_WITH_DELAY, withDelay); Message m = Message.obtain(); m.what = PipMenuActivity.MESSAGE_SHOW_MENU; m.obj = data; @@ -285,8 +302,7 @@ public class PipMenuActivityController { } else if (!mStartActivityRequested || isStartActivityRequestedElapsed()) { // If we haven't requested the start activity, or if it previously took too long to // start, then start it - startMenuActivity(menuState, stackBounds, movementBounds, allowMenuTimeout, - willResizeMenu); + startMenuActivity(menuState, stackBounds, allowMenuTimeout, willResizeMenu, withDelay); } } @@ -364,7 +380,7 @@ public class PipMenuActivityController { * (ie. when manually expanding or dismissing). */ public void hideMenuWithoutResize() { - onMenuStateChanged(MENU_STATE_NONE, false /* resize */); + onMenuStateChanged(MENU_STATE_NONE, false /* resize */, null /* callback */); } /** @@ -388,8 +404,8 @@ public class PipMenuActivityController { /** * Starts the menu activity on the top task of the pinned stack. */ - private void startMenuActivity(int menuState, Rect stackBounds, Rect movementBounds, - boolean allowMenuTimeout, boolean willResizeMenu) { + private void startMenuActivity(int menuState, Rect stackBounds, boolean allowMenuTimeout, + boolean willResizeMenu, boolean withDelay) { try { StackInfo pinnedStackInfo = ActivityTaskManager.getService().getStackInfo( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED); @@ -402,12 +418,10 @@ public class PipMenuActivityController { if (stackBounds != null) { intent.putExtra(EXTRA_STACK_BOUNDS, stackBounds); } - if (movementBounds != null) { - intent.putExtra(EXTRA_MOVEMENT_BOUNDS, movementBounds); - } intent.putExtra(EXTRA_MENU_STATE, menuState); intent.putExtra(EXTRA_ALLOW_TIMEOUT, allowMenuTimeout); intent.putExtra(EXTRA_WILL_RESIZE_MENU, willResizeMenu); + intent.putExtra(EXTRA_SHOW_MENU_WITH_DELAY, withDelay); ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0); options.setLaunchTaskId( pinnedStackInfo.taskIds[pinnedStackInfo.taskIds.length - 1]); @@ -472,14 +486,14 @@ public class PipMenuActivityController { /** * Handles changes in menu visibility. */ - private void onMenuStateChanged(int menuState, boolean resize) { + private void onMenuStateChanged(int menuState, boolean resize, Runnable callback) { if (DEBUG) { Log.d(TAG, "onMenuStateChanged() mMenuState=" + mMenuState + " menuState=" + menuState + " resize=" + resize); } if (menuState != mMenuState) { - mListeners.forEach(l -> l.onPipMenuStateChanged(menuState, resize)); + mListeners.forEach(l -> l.onPipMenuStateChanged(menuState, resize, callback)); if (menuState == MENU_STATE_FULL) { // Once visible, start listening for media action changes. This call will trigger // the menu actions to be updated again. diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java index b1e4d6758545..162cdbca3351 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.IActivityTaskManager; +import android.content.ComponentName; import android.content.Context; import android.graphics.Rect; import android.os.Debug; @@ -123,6 +124,29 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, */ private boolean mSpringingToTouch = false; + /** + * Gets set in {@link #animateToExpandedState(Rect, Rect, Rect, Runnable)}, this callback is + * used to show menu activity when the expand animation is completed. + */ + private Runnable mPostPipTransitionCallback; + + private final PipTaskOrganizer.PipTransitionCallback mPipTransitionCallback = + new PipTaskOrganizer.PipTransitionCallback() { + @Override + public void onPipTransitionStarted(ComponentName activity, int direction) {} + + @Override + public void onPipTransitionFinished(ComponentName activity, int direction) { + if (mPostPipTransitionCallback != null) { + mPostPipTransitionCallback.run(); + mPostPipTransitionCallback = null; + } + } + + @Override + public void onPipTransitionCanceled(ComponentName activity, int direction) {} + }; + public PipMotionHelper(Context context, IActivityTaskManager activityTaskManager, PipTaskOrganizer pipTaskOrganizer, PipMenuActivityController menuController, PipSnapAlgorithm snapAlgorithm, FlingAnimationUtils flingAnimationUtils, @@ -135,6 +159,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, mFlingAnimationUtils = flingAnimationUtils; mFloatingContentCoordinator = floatingContentCoordinator; onConfigurationChanged(); + mPipTaskOrganizer.registerPipTransitionCallback(mPipTransitionCallback); } @NonNull @@ -375,9 +400,10 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, * Animates the PiP to the expanded state to show the menu. */ float animateToExpandedState(Rect expandedBounds, Rect movementBounds, - Rect expandedMovementBounds) { + Rect expandedMovementBounds, Runnable callback) { float savedSnapFraction = mSnapAlgorithm.getSnapFraction(new Rect(mBounds), movementBounds); mSnapAlgorithm.applySnapFraction(expandedBounds, expandedMovementBounds, savedSnapFraction); + mPostPipTransitionCallback = callback; resizeAndAnimatePipUnchecked(expandedBounds, EXPAND_STACK_TO_MENU_DURATION); return savedSnapFraction; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index f5c83c1fffd7..87f0a708b062 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -182,8 +182,8 @@ public class PipTouchHandler { */ private class PipMenuListener implements PipMenuActivityController.Listener { @Override - public void onPipMenuStateChanged(int menuState, boolean resize) { - setMenuState(menuState, resize); + public void onPipMenuStateChanged(int menuState, boolean resize, Runnable callback) { + setMenuState(menuState, resize, callback); } @Override @@ -204,7 +204,7 @@ public class PipTouchHandler { @Override public void onPipShowMenu() { mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()); + true /* allowMenuTimeout */, willResizeMenu()); } } @@ -234,8 +234,8 @@ public class PipTouchHandler { new PipResizeGestureHandler(context, pipBoundsHandler, mMotionHelper, deviceConfig, pipTaskOrganizer); mTouchState = new PipTouchState(ViewConfiguration.get(context), mHandler, - () -> mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, willResizeMenu())); + () -> mMenuController.showMenuWithDelay(MENU_STATE_FULL, mMotionHelper.getBounds(), + true /* allowMenuTimeout */, willResizeMenu())); Resources res = context.getResources(); mExpandedShortestEdgeSize = res.getDimensionPixelSize( @@ -322,7 +322,7 @@ public class PipTouchHandler { // Only show the menu if the user isn't currently interacting with the PiP if (!mTouchState.isUserInteracting()) { mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, false /* allowMenuTimeout */, willResizeMenu()); + false /* allowMenuTimeout */, willResizeMenu()); } } @@ -358,7 +358,7 @@ public class PipTouchHandler { if (mShowPipMenuOnAnimationEnd) { mMenuController.showMenu(MENU_STATE_CLOSE, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, false /* willResizeMenu */); + true /* allowMenuTimeout */, false /* willResizeMenu */); mShowPipMenuOnAnimationEnd = false; } } @@ -557,7 +557,7 @@ public class PipTouchHandler { private void onAccessibilityShowMenu() { mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()); + true /* allowMenuTimeout */, willResizeMenu()); } private boolean handleTouchEvent(InputEvent inputEvent) { @@ -628,8 +628,7 @@ public class PipTouchHandler { // Let's not enable menu show/hide for a11y services. if (!mAccessibilityManager.isTouchExplorationEnabled()) { mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, false /* allowMenuTimeout */, - false /* willResizeMenu */); + false /* allowMenuTimeout */, false /* willResizeMenu */); } case MotionEvent.ACTION_HOVER_MOVE: { if (!shouldDeliverToMenu && !mSendingHoverAccessibilityEvents) { @@ -713,7 +712,7 @@ public class PipTouchHandler { /** * Sets the menu visibility. */ - private void setMenuState(int menuState, boolean resize) { + private void setMenuState(int menuState, boolean resize, Runnable callback) { if (mMenuState == menuState && !resize) { return; } @@ -727,7 +726,7 @@ public class PipTouchHandler { mResizedBounds.set(mMotionHelper.getBounds()); Rect expandedBounds = new Rect(mExpandedBounds); mSavedSnapFraction = mMotionHelper.animateToExpandedState(expandedBounds, - mMovementBounds, mExpandedMovementBounds); + mMovementBounds, mExpandedMovementBounds, callback); } } else if (menuState == MENU_STATE_NONE && mMenuState == MENU_STATE_FULL) { // Try and restore the PiP to the closest edge, using the saved snap fraction @@ -893,7 +892,7 @@ public class PipTouchHandler { // If the menu is still visible, then just poke the menu so that // it will timeout after the user stops touching it mMenuController.showMenu(mMenuState, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()); + true /* allowMenuTimeout */, willResizeMenu()); } else { // If the menu is not visible, then we can still be showing the activity for the // dismiss overlay, so just finish it after the animation completes @@ -917,7 +916,7 @@ public class PipTouchHandler { // User has stalled long enough for this not to be a drag or a double tap, just // expand the menu mMenuController.showMenu(MENU_STATE_FULL, mMotionHelper.getBounds(), - mMovementBounds, true /* allowMenuTimeout */, willResizeMenu()); + true /* allowMenuTimeout */, willResizeMenu()); } else { // Next touch event _may_ be the second tap for the double-tap, schedule a // fallback runnable to trigger the menu if no touch event occurs before the diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java index e76cd5116818..174441bdf065 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSMediaPlayer.java @@ -22,6 +22,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.ColorStateList; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.media.MediaDescription; @@ -38,6 +39,7 @@ import android.widget.TextView; import com.android.settingslib.media.LocalMediaManager; import com.android.systemui.R; +import com.android.systemui.media.IlluminationDrawable; import com.android.systemui.media.MediaControlPanel; import com.android.systemui.media.SeekBarObserver; import com.android.systemui.media.SeekBarViewModel; @@ -173,7 +175,7 @@ public class QSMediaPlayer extends MediaControlPanel { LinearLayout parentActionsLayout = (LinearLayout) actionsContainer; int i = 0; for (; i < parentActionsLayout.getChildCount() && i < QS_ACTION_IDS.length; i++) { - ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]); + final ImageButton thisBtn = mMediaNotifView.findViewById(QS_ACTION_IDS[i]); ImageButton thatBtn = parentActionsLayout.findViewById(NOTIF_ACTION_IDS[i]); if (thatBtn == null || thatBtn.getDrawable() == null || thatBtn.getVisibility() != View.VISIBLE) { @@ -181,6 +183,11 @@ public class QSMediaPlayer extends MediaControlPanel { continue; } + if (mMediaNotifView.getBackground() instanceof IlluminationDrawable) { + ((IlluminationDrawable) mMediaNotifView.getBackground()) + .setupTouch(thisBtn, mMediaNotifView); + } + Drawable thatIcon = thatBtn.getDrawable(); thisBtn.setImageDrawable(thatIcon.mutate()); thisBtn.setVisibility(View.VISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java index f77ff8cd7949..5cb75e60e22a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSMediaPlayer.java @@ -28,6 +28,7 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import com.android.systemui.R; +import com.android.systemui.media.IlluminationDrawable; import com.android.systemui.media.MediaControlPanel; import com.android.systemui.plugins.ActivityStarter; @@ -104,6 +105,11 @@ public class QuickQSMediaPlayer extends MediaControlPanel { continue; } + if (mMediaNotifView.getBackground() instanceof IlluminationDrawable) { + ((IlluminationDrawable) mMediaNotifView.getBackground()) + .setupTouch(thisBtn, mMediaNotifView); + } + Drawable thatIcon = thatBtn.getDrawable(); thisBtn.setImageDrawable(thatIcon.mutate()); thisBtn.setVisibility(View.VISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java index 8feee10c7e83..f821b1914658 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java @@ -18,8 +18,10 @@ import static com.android.systemui.qs.tileimpl.QSIconViewImpl.QS_ANIM_LENGTH; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; +import android.graphics.Paint; import android.graphics.Path; import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.Drawable; @@ -64,6 +66,8 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { private boolean mTileState; private boolean mCollapsedView; private boolean mShowRippleEffect = true; + private float mStrokeWidthActive; + private float mStrokeWidthInactive; private final ImageView mBg; private final TextView mDetailText; @@ -83,6 +87,10 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { // Default to Quick Tile padding, and QSTileView will specify its own padding. int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding); mIconFrame = new FrameLayout(context); + mStrokeWidthActive = context.getResources() + .getDimension(com.android.internal.R.dimen.config_qsTileStrokeWidthActive); + mStrokeWidthInactive = context.getResources() + .getDimension(com.android.internal.R.dimen.config_qsTileStrokeWidthInactive); int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size); addView(mIconFrame, new LayoutParams(size, size)); mBg = new ImageView(getContext()); @@ -206,7 +214,31 @@ public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget(); } + private void updateStrokeShapeWidth(QSTile.State state) { + Resources resources = getContext().getResources(); + if (!(mBg.getDrawable() instanceof ShapeDrawable)) { + return; + } + ShapeDrawable d = (ShapeDrawable) mBg.getDrawable(); + d.getPaint().setStyle(Paint.Style.FILL); + switch (state.state) { + case Tile.STATE_INACTIVE: + if (mStrokeWidthInactive >= 0) { + d.getPaint().setStyle(Paint.Style.STROKE); + d.getPaint().setStrokeWidth(mStrokeWidthInactive); + } + break; + case Tile.STATE_ACTIVE: + if (mStrokeWidthActive >= 0) { + d.getPaint().setStyle(Paint.Style.STROKE); + d.getPaint().setStrokeWidth(mStrokeWidthActive); + } + break; + } + } + protected void handleStateChanged(QSTile.State state) { + updateStrokeShapeWidth(state); int circleColor = getCircleColor(state.state); boolean allowAnimations = animationsEnabled(); if (circleColor != mCircleColor) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java index ae0a1c4d9822..b253635e9bfa 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingController.java @@ -137,7 +137,7 @@ public class RecordingController * Check if the recording is ongoing * @return */ - public boolean isRecording() { + public synchronized boolean isRecording() { return mIsRecording; } @@ -157,7 +157,7 @@ public class RecordingController * Update the current status * @param isRecording */ - public void updateState(boolean isRecording) { + public synchronized void updateState(boolean isRecording) { mIsRecording = isRecording; for (RecordingStateChangeCallback cb : mListeners) { if (isRecording) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 390ac0969b21..cf098d52fa91 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -22,41 +22,27 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.ContentResolver; -import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Icon; -import android.hardware.display.DisplayManager; -import android.hardware.display.VirtualDisplay; import android.media.MediaRecorder; -import android.media.projection.IMediaProjection; -import android.media.projection.IMediaProjectionManager; -import android.media.projection.MediaProjection; -import android.media.projection.MediaProjectionManager; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; -import android.os.ServiceManager; -import android.provider.MediaStore; import android.provider.Settings; import android.util.DisplayMetrics; import android.util.Log; import android.util.Size; -import android.view.Surface; -import android.view.WindowManager; import android.widget.Toast; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.LongRunning; -import java.io.File; import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.Files; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -66,13 +52,15 @@ import javax.inject.Inject; public class RecordingService extends Service implements MediaRecorder.OnInfoListener { public static final int REQUEST_CODE = 2; - private static final int NOTIFICATION_ID = 1; + private static final int NOTIFICATION_RECORDING_ID = 4274; + private static final int NOTIFICATION_PROCESSING_ID = 4275; + private static final int NOTIFICATION_VIEW_ID = 4273; private static final String TAG = "RecordingService"; private static final String CHANNEL_ID = "screen_record"; private static final String EXTRA_RESULT_CODE = "extra_resultCode"; private static final String EXTRA_DATA = "extra_data"; private static final String EXTRA_PATH = "extra_path"; - private static final String EXTRA_USE_AUDIO = "extra_useAudio"; + private static final String EXTRA_AUDIO_SOURCE = "extra_useAudio"; private static final String EXTRA_SHOW_TAPS = "extra_showTaps"; private static final String ACTION_START = "com.android.systemui.screenrecord.START"; @@ -80,29 +68,19 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis private static final String ACTION_SHARE = "com.android.systemui.screenrecord.SHARE"; private static final String ACTION_DELETE = "com.android.systemui.screenrecord.DELETE"; - private static final int TOTAL_NUM_TRACKS = 1; - private static final int VIDEO_BIT_RATE = 10000000; - private static final int VIDEO_FRAME_RATE = 30; - private static final int AUDIO_BIT_RATE = 16; - private static final int AUDIO_SAMPLE_RATE = 44100; - private static final int MAX_DURATION_MS = 60 * 60 * 1000; - private static final long MAX_FILESIZE_BYTES = 5000000000L; - private final RecordingController mController; - private MediaProjection mMediaProjection; - private Surface mInputSurface; - private VirtualDisplay mVirtualDisplay; - private MediaRecorder mMediaRecorder; private Notification.Builder mRecordingNotificationBuilder; - private boolean mUseAudio; + private ScreenRecordingAudioSource mAudioSource; private boolean mShowTaps; private boolean mOriginalShowTaps; - private File mTempFile; + private ScreenMediaRecorder mRecorder; + private final Executor mLongExecutor; @Inject - public RecordingService(RecordingController controller) { + public RecordingService(RecordingController controller, @LongRunning Executor executor) { mController = controller; + mLongExecutor = executor; } /** @@ -113,16 +91,16 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis * android.content.Intent)} * @param data The data from {@link android.app.Activity#onActivityResult(int, int, * android.content.Intent)} - * @param useAudio True to enable microphone input while recording + * @param audioSource The ordinal value of the audio source + * {@link com.android.systemui.screenrecord.ScreenRecordingAudioSource} * @param showTaps True to make touches visible while recording */ - public static Intent getStartIntent(Context context, int resultCode, Intent data, - boolean useAudio, boolean showTaps) { + public static Intent getStartIntent(Context context, int resultCode, + int audioSource, boolean showTaps) { return new Intent(context, RecordingService.class) .setAction(ACTION_START) .putExtra(EXTRA_RESULT_CODE, resultCode) - .putExtra(EXTRA_DATA, data) - .putExtra(EXTRA_USE_AUDIO, useAudio) + .putExtra(EXTRA_AUDIO_SOURCE, audioSource) .putExtra(EXTRA_SHOW_TAPS, showTaps); } @@ -139,36 +117,31 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis switch (action) { case ACTION_START: - mUseAudio = intent.getBooleanExtra(EXTRA_USE_AUDIO, false); + mAudioSource = ScreenRecordingAudioSource + .values()[intent.getIntExtra(EXTRA_AUDIO_SOURCE, 0)]; + Log.d(TAG, "recording with audio source" + mAudioSource); mShowTaps = intent.getBooleanExtra(EXTRA_SHOW_TAPS, false); - try { - IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE); - IMediaProjectionManager mediaService = - IMediaProjectionManager.Stub.asInterface(b); - IMediaProjection proj = mediaService.createProjection(getUserId(), - getPackageName(), - MediaProjectionManager.TYPE_SCREEN_CAPTURE, false); - IBinder projection = proj.asBinder(); - if (projection == null) { - Log.e(TAG, "Projection was null"); - Toast.makeText(this, R.string.screenrecord_start_error, Toast.LENGTH_LONG) - .show(); - return Service.START_NOT_STICKY; - } - mMediaProjection = new MediaProjection(getApplicationContext(), - IMediaProjection.Stub.asInterface(projection)); - startRecording(); - } catch (RemoteException e) { - e.printStackTrace(); - Toast.makeText(this, R.string.screenrecord_start_error, Toast.LENGTH_LONG) - .show(); - return Service.START_NOT_STICKY; - } + + mOriginalShowTaps = Settings.System.getInt( + getApplicationContext().getContentResolver(), + Settings.System.SHOW_TOUCHES, 0) != 0; + + setTapsVisible(mShowTaps); + + mRecorder = new ScreenMediaRecorder( + getApplicationContext(), + getUserId(), + mAudioSource, + this + ); + startRecording(); break; case ACTION_STOP: stopRecording(); + notificationManager.cancel(NOTIFICATION_RECORDING_ID); saveRecording(notificationManager); + stopSelf(); break; case ACTION_SHARE: @@ -183,10 +156,10 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); // Remove notification - notificationManager.cancel(NOTIFICATION_ID); + notificationManager.cancel(NOTIFICATION_RECORDING_ID); startActivity(Intent.createChooser(shareIntent, shareLabel) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); break; case ACTION_DELETE: // Close quick shade @@ -202,7 +175,7 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis Toast.LENGTH_LONG).show(); // Remove notification - notificationManager.cancel(NOTIFICATION_ID); + notificationManager.cancel(NOTIFICATION_RECORDING_ID); Log.d(TAG, "Deleted recording " + uri); break; } @@ -224,70 +197,15 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis */ private void startRecording() { try { - File cacheDir = getCacheDir(); - cacheDir.mkdirs(); - mTempFile = File.createTempFile("temp", ".mp4", cacheDir); - Log.d(TAG, "Writing video output to: " + mTempFile.getAbsolutePath()); - - mOriginalShowTaps = 1 == Settings.System.getInt( - getApplicationContext().getContentResolver(), - Settings.System.SHOW_TOUCHES, 0); - setTapsVisible(mShowTaps); - - // Set up media recorder - mMediaRecorder = new MediaRecorder(); - if (mUseAudio) { - mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - } - mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); - mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); - - // Set up video - DisplayMetrics metrics = new DisplayMetrics(); - WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); - wm.getDefaultDisplay().getRealMetrics(metrics); - int screenWidth = metrics.widthPixels; - int screenHeight = metrics.heightPixels; - mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); - mMediaRecorder.setVideoSize(screenWidth, screenHeight); - mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); - mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE); - mMediaRecorder.setMaxDuration(MAX_DURATION_MS); - mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); - - // Set up audio - if (mUseAudio) { - mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); - mMediaRecorder.setAudioChannels(TOTAL_NUM_TRACKS); - mMediaRecorder.setAudioEncodingBitRate(AUDIO_BIT_RATE); - mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLE_RATE); - } - - mMediaRecorder.setOutputFile(mTempFile); - mMediaRecorder.prepare(); - - // Create surface - mInputSurface = mMediaRecorder.getSurface(); - mVirtualDisplay = mMediaProjection.createVirtualDisplay( - "Recording Display", - screenWidth, - screenHeight, - metrics.densityDpi, - DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, - mInputSurface, - null, - null); - - mMediaRecorder.setOnInfoListener(this); - mMediaRecorder.start(); + mRecorder.start(); mController.updateState(true); - } catch (IOException e) { - Log.e(TAG, "Error starting screen recording: " + e.getMessage()); + createRecordingNotification(); + } catch (IOException | RemoteException e) { + Toast.makeText(this, + R.string.screenrecord_start_error, Toast.LENGTH_LONG) + .show(); e.printStackTrace(); - throw new RuntimeException(e); } - - createRecordingNotification(); } private void createRecordingNotification() { @@ -306,7 +224,7 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis extras.putString(Notification.EXTRA_SUBSTITUTE_APP_NAME, res.getString(R.string.screenrecord_name)); - String notificationTitle = mUseAudio + String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE ? res.getString(R.string.screenrecord_ongoing_screen_and_audio) : res.getString(R.string.screenrecord_ongoing_screen_only); @@ -323,9 +241,10 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis this, REQUEST_CODE, getStopIntent(this), PendingIntent.FLAG_UPDATE_CURRENT)) .addExtras(extras); - notificationManager.notify(NOTIFICATION_ID, mRecordingNotificationBuilder.build()); + notificationManager.notify(NOTIFICATION_RECORDING_ID, + mRecordingNotificationBuilder.build()); Notification notification = mRecordingNotificationBuilder.build(); - startForeground(NOTIFICATION_ID, notification); + startForeground(NOTIFICATION_RECORDING_ID, notification); } private Notification createSaveNotification(Uri uri) { @@ -392,47 +311,38 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis private void stopRecording() { setTapsVisible(mOriginalShowTaps); - mMediaRecorder.stop(); - mMediaRecorder.release(); - mMediaRecorder = null; - mMediaProjection.stop(); - mMediaProjection = null; - mInputSurface.release(); - mVirtualDisplay.release(); - stopSelf(); + mRecorder.end(); mController.updateState(false); } private void saveRecording(NotificationManager notificationManager) { - String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'") - .format(new Date()); - - ContentValues values = new ContentValues(); - values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName); - values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); - values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis()); - values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis()); - - ContentResolver resolver = getContentResolver(); - Uri collectionUri = MediaStore.Video.Media.getContentUri( - MediaStore.VOLUME_EXTERNAL_PRIMARY); - Uri itemUri = resolver.insert(collectionUri, values); - - try { - // Add to the mediastore - OutputStream os = resolver.openOutputStream(itemUri, "w"); - Files.copy(mTempFile.toPath(), os); - os.close(); - - Notification notification = createSaveNotification(itemUri); - notificationManager.notify(NOTIFICATION_ID, notification); - - mTempFile.delete(); - } catch (IOException e) { - Log.e(TAG, "Error saving screen recording: " + e.getMessage()); - Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG) - .show(); - } + Resources res = getApplicationContext().getResources(); + String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE + ? res.getString(R.string.screenrecord_ongoing_screen_only) + : res.getString(R.string.screenrecord_ongoing_screen_and_audio); + Notification.Builder builder = new Notification.Builder(getApplicationContext(), CHANNEL_ID) + .setContentTitle(notificationTitle) + .setContentText( + getResources().getString(R.string.screenrecord_background_processing_label)) + .setSmallIcon(R.drawable.ic_screenrecord); + notificationManager.notify(NOTIFICATION_PROCESSING_ID, builder.build()); + + mLongExecutor.execute(() -> { + try { + Log.d(TAG, "saving recording"); + Notification notification = createSaveNotification(mRecorder.save()); + if (!mController.isRecording()) { + Log.d(TAG, "showing saved notification"); + notificationManager.notify(NOTIFICATION_VIEW_ID, notification); + } + } catch (IOException e) { + Log.e(TAG, "Error saving screen recording: " + e.getMessage()); + Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG) + .show(); + } finally { + notificationManager.cancel(NOTIFICATION_PROCESSING_ID); + } + }); } private void setTapsVisible(boolean turnOn) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java new file mode 100644 index 000000000000..752f4fddf24b --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java @@ -0,0 +1,290 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenrecord; + +import android.content.Context; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioPlaybackCaptureConfiguration; +import android.media.AudioRecord; +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.media.MediaMuxer; +import android.media.MediaRecorder; +import android.media.projection.MediaProjection; +import android.util.Log; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * Recording internal audio + */ +public class ScreenInternalAudioRecorder { + private static String TAG = "ScreenAudioRecorder"; + private static final int TIMEOUT = 500; + private final Context mContext; + private AudioRecord mAudioRecord; + private AudioRecord mAudioRecordMic; + private Config mConfig = new Config(); + private Thread mThread; + private MediaProjection mMediaProjection; + private MediaCodec mCodec; + private long mPresentationTime; + private long mTotalBytes; + private MediaMuxer mMuxer; + private String mOutFile; + private boolean mMic; + + private int mTrackId = -1; + + public ScreenInternalAudioRecorder(String outFile, Context context, + MediaProjection mp, boolean includeMicInput) throws IOException { + mMic = includeMicInput; + mOutFile = outFile; + mMuxer = new MediaMuxer(outFile, MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4); + mContext = context; + mMediaProjection = mp; + Log.d(TAG, "creating audio file " + outFile); + setupSimple(); + } + /** + * Audio recoding configuration + */ + public static class Config { + public int channelOutMask = AudioFormat.CHANNEL_OUT_MONO; + public int channelInMask = AudioFormat.CHANNEL_IN_MONO; + public int encoding = AudioFormat.ENCODING_PCM_16BIT; + public int sampleRate = 44100; + public int bitRate = 196000; + public int bufferSizeBytes = 1 << 17; + public boolean privileged = true; + public boolean legacy_app_looback = false; + + @Override + public String toString() { + return "channelMask=" + channelOutMask + + "\n encoding=" + encoding + + "\n sampleRate=" + sampleRate + + "\n bufferSize=" + bufferSizeBytes + + "\n privileged=" + privileged + + "\n legacy app looback=" + legacy_app_looback; + } + + } + + private void setupSimple() throws IOException { + int size = AudioRecord.getMinBufferSize( + mConfig.sampleRate, mConfig.channelInMask, + mConfig.encoding) * 2; + + Log.d(TAG, "audio buffer size: " + size); + + AudioFormat format = new AudioFormat.Builder() + .setEncoding(mConfig.encoding) + .setSampleRate(mConfig.sampleRate) + .setChannelMask(mConfig.channelOutMask) + .build(); + + AudioPlaybackCaptureConfiguration playbackConfig = + new AudioPlaybackCaptureConfiguration.Builder(mMediaProjection) + .addMatchingUsage(AudioAttributes.USAGE_MEDIA) + .addMatchingUsage(AudioAttributes.USAGE_UNKNOWN) + .addMatchingUsage(AudioAttributes.USAGE_GAME) + .build(); + + mAudioRecord = new AudioRecord.Builder() + .setAudioFormat(format) + .setAudioPlaybackCaptureConfig(playbackConfig) + .build(); + + if (mMic) { + mAudioRecordMic = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, + mConfig.sampleRate, AudioFormat.CHANNEL_IN_MONO, mConfig.encoding, size); + } + + mCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC); + MediaFormat medFormat = MediaFormat.createAudioFormat( + MediaFormat.MIMETYPE_AUDIO_AAC, mConfig.sampleRate, 1); + medFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, + MediaCodecInfo.CodecProfileLevel.AACObjectLC); + medFormat.setInteger(MediaFormat.KEY_BIT_RATE, mConfig.bitRate); + medFormat.setInteger(MediaFormat.KEY_PCM_ENCODING, mConfig.encoding); + mCodec.configure(medFormat, + null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + + mThread = new Thread(() -> { + short[] bufferInternal = null; + short[] bufferMic = null; + byte[] buffer = null; + + if (mMic) { + bufferInternal = new short[size / 2]; + bufferMic = new short[size / 2]; + } else { + buffer = new byte[size]; + } + + while (true) { + int readBytes = 0; + int readShortsInternal = 0; + int readShortsMic = 0; + if (mMic) { + readShortsInternal = mAudioRecord.read(bufferInternal, 0, + bufferInternal.length); + readShortsMic = mAudioRecordMic.read(bufferMic, 0, bufferMic.length); + readBytes = Math.min(readShortsInternal, readShortsMic) * 2; + buffer = addAndConvertBuffers(bufferInternal, readShortsInternal, bufferMic, + readShortsMic); + } else { + readBytes = mAudioRecord.read(buffer, 0, buffer.length); + } + + //exit the loop when at end of stream + if (readBytes < 0) { + Log.e(TAG, "read error " + readBytes + + ", shorts internal: " + readShortsInternal + + ", shorts mic: " + readShortsMic); + break; + } + encode(buffer, readBytes); + } + endStream(); + }); + } + + private byte[] addAndConvertBuffers(short[] a1, int a1Limit, short[] a2, int a2Limit) { + int size = Math.max(a1Limit, a2Limit); + if (size < 0) return new byte[0]; + byte[] buff = new byte[size * 2]; + for (int i = 0; i < size; i++) { + int sum; + if (i > a1Limit) { + sum = a2[i]; + } else if (i > a2Limit) { + sum = a1[i]; + } else { + sum = (int) a1[i] + (int) a2[i]; + } + + if (sum > Short.MAX_VALUE) sum = Short.MAX_VALUE; + if (sum < Short.MIN_VALUE) sum = Short.MIN_VALUE; + int byteIndex = i * 2; + buff[byteIndex] = (byte) (sum & 0xff); + buff[byteIndex + 1] = (byte) ((sum >> 8) & 0xff); + } + return buff; + } + + private void encode(byte[] buffer, int readBytes) { + int offset = 0; + while (readBytes > 0) { + int totalBytesRead = 0; + int bufferIndex = mCodec.dequeueInputBuffer(TIMEOUT); + if (bufferIndex < 0) { + writeOutput(); + return; + } + ByteBuffer buff = mCodec.getInputBuffer(bufferIndex); + buff.clear(); + int bufferSize = buff.capacity(); + int bytesToRead = readBytes > bufferSize ? bufferSize : readBytes; + totalBytesRead += bytesToRead; + readBytes -= bytesToRead; + buff.put(buffer, offset, bytesToRead); + offset += bytesToRead; + mCodec.queueInputBuffer(bufferIndex, 0, bytesToRead, mPresentationTime, 0); + mTotalBytes += totalBytesRead; + mPresentationTime = 1000000L * (mTotalBytes / 2) / mConfig.sampleRate; + + writeOutput(); + } + } + + private void endStream() { + int bufferIndex = mCodec.dequeueInputBuffer(TIMEOUT); + mCodec.queueInputBuffer(bufferIndex, 0, 0, mPresentationTime, + MediaCodec.BUFFER_FLAG_END_OF_STREAM); + writeOutput(); + } + + private void writeOutput() { + while (true) { + MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); + int bufferIndex = mCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT); + if (bufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + mTrackId = mMuxer.addTrack(mCodec.getOutputFormat()); + mMuxer.start(); + continue; + } + if (bufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { + break; + } + if (mTrackId < 0) return; + ByteBuffer buff = mCodec.getOutputBuffer(bufferIndex); + + if (!((bufferInfo.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0 + && bufferInfo.size != 0)) { + mMuxer.writeSampleData(mTrackId, buff, bufferInfo); + } + mCodec.releaseOutputBuffer(bufferIndex, false); + } + } + + /** + * start recording + */ + public void start() { + if (mThread != null) { + Log.e(TAG, "a recording is being done in parallel or stop is not called"); + } + mAudioRecord.startRecording(); + if (mMic) mAudioRecordMic.startRecording(); + Log.d(TAG, "channel count " + mAudioRecord.getChannelCount()); + mCodec.start(); + if (mAudioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) { + Log.e(TAG, "Error starting audio recording"); + return; + } + mThread.start(); + } + + /** + * end recording + */ + public void end() { + mAudioRecord.stop(); + if (mMic) { + mAudioRecordMic.stop(); + } + mAudioRecord.release(); + if (mMic) { + mAudioRecordMic.release(); + } + try { + mThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + mCodec.stop(); + mCodec.release(); + mMuxer.stop(); + mMuxer.release(); + mThread = null; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java new file mode 100644 index 000000000000..c967648c544e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenrecord; + +import static android.content.Context.MEDIA_PROJECTION_SERVICE; + +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.INTERNAL; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC_AND_INTERNAL; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.media.MediaMuxer; +import android.media.MediaRecorder; +import android.media.projection.IMediaProjection; +import android.media.projection.IMediaProjectionManager; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.net.Uri; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.provider.MediaStore; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Surface; +import android.view.WindowManager; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Recording screen and mic/internal audio + */ +public class ScreenMediaRecorder { + private static final int TOTAL_NUM_TRACKS = 1; + private static final int VIDEO_BIT_RATE = 10000000; + private static final int VIDEO_FRAME_RATE = 30; + private static final int AUDIO_BIT_RATE = 16; + private static final int AUDIO_SAMPLE_RATE = 44100; + private static final int MAX_DURATION_MS = 60 * 60 * 1000; + private static final long MAX_FILESIZE_BYTES = 5000000000L; + private static final String TAG = "ScreenMediaRecorder"; + + + private File mTempVideoFile; + private File mTempAudioFile; + private MediaProjection mMediaProjection; + private Surface mInputSurface; + private VirtualDisplay mVirtualDisplay; + private MediaRecorder mMediaRecorder; + private int mUser; + private ScreenRecordingMuxer mMuxer; + private ScreenInternalAudioRecorder mAudio; + private ScreenRecordingAudioSource mAudioSource; + + private Context mContext; + MediaRecorder.OnInfoListener mListener; + + public ScreenMediaRecorder(Context context, + int user, ScreenRecordingAudioSource audioSource, + MediaRecorder.OnInfoListener listener) { + mContext = context; + mUser = user; + mListener = listener; + mAudioSource = audioSource; + } + + private void prepare() throws IOException, RemoteException { + //Setup media projection + IBinder b = ServiceManager.getService(MEDIA_PROJECTION_SERVICE); + IMediaProjectionManager mediaService = + IMediaProjectionManager.Stub.asInterface(b); + IMediaProjection proj = null; + proj = mediaService.createProjection(mUser, mContext.getPackageName(), + MediaProjectionManager.TYPE_SCREEN_CAPTURE, false); + IBinder projection = proj.asBinder(); + mMediaProjection = new MediaProjection(mContext, + IMediaProjection.Stub.asInterface(projection)); + + File cacheDir = mContext.getCacheDir(); + cacheDir.mkdirs(); + mTempVideoFile = File.createTempFile("temp", ".mp4", cacheDir); + + // Set up media recorder + mMediaRecorder = new MediaRecorder(); + + // Set up audio source + if (mAudioSource == MIC) { + mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); + } + mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); + + mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); + + + // Set up video + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + int screenWidth = metrics.widthPixels; + int screenHeight = metrics.heightPixels; + mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); + mMediaRecorder.setVideoSize(screenWidth, screenHeight); + mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); + mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE); + mMediaRecorder.setMaxDuration(MAX_DURATION_MS); + mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); + + // Set up audio + if (mAudioSource == MIC) { + mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC); + mMediaRecorder.setAudioChannels(TOTAL_NUM_TRACKS); + mMediaRecorder.setAudioEncodingBitRate(AUDIO_BIT_RATE); + mMediaRecorder.setAudioSamplingRate(AUDIO_SAMPLE_RATE); + } + + mMediaRecorder.setOutputFile(mTempVideoFile); + mMediaRecorder.prepare(); + // Create surface + mInputSurface = mMediaRecorder.getSurface(); + mVirtualDisplay = mMediaProjection.createVirtualDisplay( + "Recording Display", + screenWidth, + screenHeight, + metrics.densityDpi, + DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + mInputSurface, + null, + null); + + mMediaRecorder.setOnInfoListener(mListener); + if (mAudioSource == INTERNAL || + mAudioSource == MIC_AND_INTERNAL) { + mTempAudioFile = File.createTempFile("temp", ".aac", + mContext.getCacheDir()); + mAudio = new ScreenInternalAudioRecorder(mTempAudioFile.getAbsolutePath(), mContext, + mMediaProjection, mAudioSource == MIC_AND_INTERNAL); + } + + } + + /** + * Start screen recording + */ + void start() throws IOException, RemoteException { + Log.d(TAG, "start recording"); + prepare(); + mMediaRecorder.start(); + recordInternalAudio(); + } + + /** + * End screen recording + */ + void end() { + mMediaRecorder.stop(); + mMediaProjection.stop(); + mMediaRecorder.release(); + mMediaRecorder = null; + mMediaProjection = null; + mInputSurface.release(); + mVirtualDisplay.release(); + stopInternalAudioRecording(); + + Log.d(TAG, "end recording"); + } + + private void stopInternalAudioRecording() { + if (mAudioSource == INTERNAL || mAudioSource == MIC_AND_INTERNAL) { + mAudio.end(); + mAudio = null; + } + } + + private void recordInternalAudio() { + if (mAudioSource == INTERNAL || mAudioSource == MIC_AND_INTERNAL) { + mAudio.start(); + } + } + + /** + * Store recorded video + */ + Uri save() throws IOException { + String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'") + .format(new Date()); + + ContentValues values = new ContentValues(); + values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName); + values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); + values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis()); + values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis()); + + ContentResolver resolver = mContext.getContentResolver(); + Uri collectionUri = MediaStore.Video.Media.getContentUri( + MediaStore.VOLUME_EXTERNAL_PRIMARY); + Uri itemUri = resolver.insert(collectionUri, values); + + Log.d(TAG, itemUri.toString()); + if (mAudioSource == MIC_AND_INTERNAL || mAudioSource == INTERNAL) { + try { + Log.d(TAG, "muxing recording"); + File file = File.createTempFile("temp", ".mp4", + mContext.getCacheDir()); + mMuxer = new ScreenRecordingMuxer(MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4, + file.getAbsolutePath(), + mTempVideoFile.getAbsolutePath(), + mTempAudioFile.getAbsolutePath()); + mMuxer.mux(); + mTempVideoFile.delete(); + mTempVideoFile = file; + } catch (IOException e) { + Log.e(TAG, "muxing recording " + e.getMessage()); + e.printStackTrace(); + } + } + + // Add to the mediastore + OutputStream os = resolver.openOutputStream(itemUri, "w"); + Files.copy(mTempVideoFile.toPath(), os); + os.close(); + mTempVideoFile.delete(); + if (mTempAudioFile != null) mTempAudioFile.delete(); + return itemUri; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java index 26973d092209..c247328078a7 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java @@ -16,17 +16,30 @@ package com.android.systemui.screenrecord; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.INTERNAL; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC_AND_INTERNAL; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.NONE; + import android.app.Activity; import android.app.PendingIntent; import android.os.Bundle; +import android.util.Log; import android.view.Gravity; +import android.view.View; import android.view.ViewGroup; import android.view.Window; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.Spinner; import android.widget.Switch; import com.android.systemui.R; +import java.util.ArrayList; +import java.util.List; + import javax.inject.Inject; /** @@ -35,10 +48,15 @@ import javax.inject.Inject; public class ScreenRecordDialog extends Activity { private static final long DELAY_MS = 3000; private static final long INTERVAL_MS = 1000; + private static final String TAG = "ScreenRecordDialog"; private final RecordingController mController; - private Switch mAudioSwitch; private Switch mTapsSwitch; + private Switch mAudioSwitch; + private Spinner mOptions; + private List<ScreenRecordingAudioSource> mModes; + private int mSelected; + @Inject public ScreenRecordDialog(RecordingController controller) { @@ -68,17 +86,32 @@ public class ScreenRecordDialog extends Activity { finish(); }); + mModes = new ArrayList<>(); + mModes.add(INTERNAL); + mModes.add(MIC); + mModes.add(MIC_AND_INTERNAL); + mAudioSwitch = findViewById(R.id.screenrecord_audio_switch); mTapsSwitch = findViewById(R.id.screenrecord_taps_switch); + mOptions = findViewById(R.id.screen_recording_options); + ArrayAdapter a = new ScreenRecordingAdapter(getApplicationContext(), + android.R.layout.simple_spinner_dropdown_item, + mModes); + a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mOptions.setAdapter(a); + } private void requestScreenCapture() { - boolean useAudio = mAudioSwitch.isChecked(); boolean showTaps = mTapsSwitch.isChecked(); + ScreenRecordingAudioSource audioMode = mAudioSwitch.isChecked() + ? (ScreenRecordingAudioSource) mOptions.getSelectedItem() + : NONE; PendingIntent startIntent = PendingIntent.getForegroundService(this, RecordingService.REQUEST_CODE, RecordingService.getStartIntent( - ScreenRecordDialog.this, RESULT_OK, null, useAudio, showTaps), + ScreenRecordDialog.this, RESULT_OK, + audioMode.ordinal(), showTaps), PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent stopIntent = PendingIntent.getService(this, RecordingService.REQUEST_CODE, diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java new file mode 100644 index 000000000000..2e0e746594b4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAdapter.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenrecord; + +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.INTERNAL; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC; +import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC_AND_INTERNAL; + +import android.content.Context; +import android.content.res.Resources; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.systemui.R; + +import java.util.List; + +/** + * Screen recording view adapter + */ +public class ScreenRecordingAdapter extends ArrayAdapter<ScreenRecordingAudioSource> { + private LinearLayout mSelectedMic; + private LinearLayout mSelectedInternal; + private LinearLayout mSelectedMicAndInternal; + private LinearLayout mMicOption; + private LinearLayout mMicAndInternalOption; + private LinearLayout mInternalOption; + + public ScreenRecordingAdapter(Context context, int resource, + List<ScreenRecordingAudioSource> objects) { + super(context, resource, objects); + initViews(); + } + + private void initViews() { + mSelectedInternal = getSelected(R.string.screenrecord_device_audio_label); + mSelectedMic = getSelected(R.string.screenrecord_mic_label); + mSelectedMicAndInternal = getSelected(R.string.screenrecord_device_audio_and_mic_label); + + mMicOption = getOption(R.string.screenrecord_mic_label, Resources.ID_NULL); + mMicOption.removeViewAt(1); + + mMicAndInternalOption = getOption( + R.string.screenrecord_device_audio_and_mic_label, Resources.ID_NULL); + mMicAndInternalOption.removeViewAt(1); + + mInternalOption = getOption(R.string.screenrecord_device_audio_label, + R.string.screenrecord_device_audio_description); + } + + private LinearLayout getOption(int label, int description) { + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + LinearLayout layout = (LinearLayout) inflater + .inflate(R.layout.screen_record_dialog_audio_source, null, false); + ((TextView) layout.findViewById(R.id.screen_recording_dialog_source_text)) + .setText(label); + if (description != Resources.ID_NULL) + ((TextView) layout.findViewById(R.id.screen_recording_dialog_source_description)) + .setText(description); + return layout; + } + + private LinearLayout getSelected(int label) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + LinearLayout layout = (LinearLayout) inflater + .inflate(R.layout.screen_record_dialog_audio_source_selected, null, false); + ((TextView) layout.findViewById(R.id.screen_recording_dialog_source_text)) + .setText(label); + return layout; + } + + private void setDescription(LinearLayout layout, int description) { + if (description != Resources.ID_NULL) { + ((TextView) layout.getChildAt(1)).setText(description); + } + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + switch (getItem(position)) { + case INTERNAL: + return mInternalOption; + case MIC_AND_INTERNAL: + return mMicAndInternalOption; + case MIC: + return mMicOption; + default: + return super.getDropDownView(position, convertView, parent); + } + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + switch (getItem(position)) { + case INTERNAL: + return mSelectedInternal; + case MIC_AND_INTERNAL: + return mSelectedMicAndInternal; + case MIC: + return mSelectedMic; + default: + return super.getView(position, convertView, parent); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAudioSource.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAudioSource.java new file mode 100644 index 000000000000..ee11865a03a1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingAudioSource.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenrecord; + +/** + * Audio sources + */ +public enum ScreenRecordingAudioSource { + NONE, + INTERNAL, + MIC, + MIC_AND_INTERNAL; +} diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java new file mode 100644 index 000000000000..7ffcfd46a1a4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordingMuxer.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.screenrecord; + +import android.media.MediaCodec; +import android.media.MediaExtractor; +import android.media.MediaMuxer; +import android.util.ArrayMap; +import android.util.Log; +import android.util.Pair; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayList; + +/** + * Mixing audio and video tracks + */ +public class ScreenRecordingMuxer { + // size of a memory page for cache coherency + private static final int BUFFER_SIZE = 1024 * 4096; + private String[] mFiles; + private String mOutFile; + private int mFormat; + private ArrayMap<Pair<MediaExtractor, Integer>, Integer> mExtractorIndexToMuxerIndex + = new ArrayMap<>(); + private ArrayList<MediaExtractor> mExtractors = new ArrayList<>(); + + private static String TAG = "ScreenRecordingMuxer"; + public ScreenRecordingMuxer(@MediaMuxer.Format int format, String outfileName, + String... inputFileNames) { + mFiles = inputFileNames; + mOutFile = outfileName; + mFormat = format; + Log.d(TAG, "out: " + mOutFile + " , in: " + mFiles[0]); + } + + /** + * RUN IN THE BACKGROUND THREAD! + */ + public void mux() throws IOException { + MediaMuxer muxer = null; + muxer = new MediaMuxer(mOutFile, mFormat); + // Add extractors + for (String file: mFiles) { + MediaExtractor extractor = new MediaExtractor(); + try { + extractor.setDataSource(file); + } catch (IOException e) { + Log.e(TAG, "error creating extractor: " + file); + e.printStackTrace(); + continue; + } + Log.d(TAG, file + " track count: " + extractor.getTrackCount()); + mExtractors.add(extractor); + for (int i = 0; i < extractor.getTrackCount(); i++) { + int muxId = muxer.addTrack(extractor.getTrackFormat(i)); + Log.d(TAG, "created extractor format" + extractor.getTrackFormat(i).toString()); + mExtractorIndexToMuxerIndex.put(Pair.create(extractor, i), muxId); + } + } + + muxer.start(); + for (Pair<MediaExtractor, Integer> pair: mExtractorIndexToMuxerIndex.keySet()) { + MediaExtractor extractor = pair.first; + extractor.selectTrack(pair.second); + int muxId = mExtractorIndexToMuxerIndex.get(pair); + Log.d(TAG, "track format: " + extractor.getTrackFormat(pair.second)); + extractor.seekTo(0, MediaExtractor.SEEK_TO_CLOSEST_SYNC); + ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); + MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + int offset; + while (true) { + offset = buffer.arrayOffset(); + info.size = extractor.readSampleData(buffer, offset); + if (info.size < 0) break; + info.presentationTimeUs = extractor.getSampleTime(); + info.flags = extractor.getSampleFlags(); + muxer.writeSampleData(muxId, buffer, info); + extractor.advance(); + } + } + + for (MediaExtractor extractor: mExtractors) { + extractor.release(); + } + muxer.stop(); + muxer.release(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 24195156d8cf..96d6ecbcc07f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -263,7 +263,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< default void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId) { } + long operationId, int sysUiSessionId) { } default void onBiometricAuthenticated() { } default void onBiometricHelp(String message) { } default void onBiometricError(int modality, int error, int vendorCode) { } @@ -782,7 +782,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< @Override public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId) { + long operationId, int sysUiSessionId) { synchronized (mLock) { SomeArgs args = SomeArgs.obtain(); args.arg1 = bundle; @@ -792,6 +792,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< args.argi2 = userId; args.arg4 = opPackageName; args.arg5 = operationId; + args.argi3 = sysUiSessionId; mHandler.obtainMessage(MSG_BIOMETRIC_SHOW, args) .sendToTarget(); } @@ -1169,7 +1170,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< (boolean) someArgs.arg3 /* requireConfirmation */, someArgs.argi2 /* userId */, (String) someArgs.arg4 /* opPackageName */, - (long) someArgs.arg5 /* operationId */); + (long) someArgs.arg5 /* operationId */, + someArgs.argi3 /* sysUiSessionId */); } someArgs.recycle(); break; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 8fcc67a0708e..e7f26183fa8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -184,8 +184,11 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle mLowPriorityInflationHelper.recheckLowPriorityViewAndInflate(ent, ent.getRow()); boolean isChildInGroup = mGroupManager.isChildInGroupWithSummary(ent.getSbn()); - boolean groupChangesAllowed = mVisualStabilityManager.areGroupChangesAllowed() - || !ent.hasFinishedInitialization(); + boolean groupChangesAllowed = + mVisualStabilityManager.areGroupChangesAllowed() // user isn't looking at notifs + || !ent.hasFinishedInitialization() // notif recently added + || !mListContainer.containsView(ent.getRow()); // notif recently unfiltered + NotificationEntry parent = mGroupManager.getGroupSummary(ent.getSbn()); if (!groupChangesAllowed) { // We don't to change groups while the user is looking at them diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 88f148b00cdc..02c98ae2867d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -121,14 +121,14 @@ constructor( } override fun onInterceptTouchEvent(event: MotionEvent): Boolean { - return maybeStartExpansion(event) + return canHandleMotionEvent() && startExpansion(event) } - private fun maybeStartExpansion(event: MotionEvent): Boolean { - if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded || - bouncerShowing) { - return false - } + private fun canHandleMotionEvent(): Boolean { + return !wakeUpCoordinator.canShowPulsingHuns || qsExpanded || bouncerShowing + } + + private fun startExpansion(event: MotionEvent): Boolean { if (velocityTracker == null) { velocityTracker = VelocityTracker.obtain() } @@ -177,9 +177,14 @@ constructor( } override fun onTouchEvent(event: MotionEvent): Boolean { - if (!isExpanding) { - return maybeStartExpansion(event) + if (!canHandleMotionEvent()) { + return false + } + + if (!isExpanding || event.actionMasked == MotionEvent.ACTION_DOWN) { + return startExpansion(event) } + velocityTracker!!.addMovement(event) val y = event.y diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java index 55a20fae4ffd..040dbe320711 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java @@ -288,7 +288,7 @@ public class InstantAppNotifier extends SystemUI mContext, 0, new Intent(Intent.ACTION_VIEW).setData(Uri.parse(helpUrl)), - 0, + PendingIntent.FLAG_IMMUTABLE, null, user) : null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index f1cb783742bb..d2517774ab2e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -440,6 +440,10 @@ public class NotificationEntryManager implements mLogger.logLifetimeExtended(key, extender.getClass().getName(), "pending"); } } + if (!lifetimeExtended) { + // At this point, we are guaranteed the notification will be removed + mAllNotifications.remove(pendingEntry); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt index 9738bcc69279..c78370ec4643 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt @@ -27,20 +27,17 @@ import com.android.systemui.statusbar.notification.NotificationFilter import com.android.systemui.statusbar.notification.NotificationSectionsFeatureManager import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier -import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_IMPORTANT_PERSON import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON -import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_PERSON import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_ALERTING import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_HEADS_UP import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_PEOPLE import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.BUCKET_SILENT - +import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager.PriorityBucket import com.android.systemui.statusbar.phone.NotificationGroupManager import com.android.systemui.statusbar.policy.HeadsUpManager import dagger.Lazy -import java.util.Objects; +import java.util.Objects import javax.inject.Inject -import kotlin.Comparator private const val TAG = "NotifRankingManager" @@ -140,33 +137,36 @@ open class NotificationRankingManager @Inject constructor( .filterNot(notifFilter::shouldFilterOut) .sortedWith(rankingComparator) .toList() - for (entry in filtered) { - assignBucketForEntry(entry) - } + assignBuckets(filtered) return filtered } - private fun assignBucketForEntry(entry: NotificationEntry) { + private fun assignBuckets(entries: List<NotificationEntry>) { + entries.forEach { it.bucket = getBucketForEntry(it) } + if (!usePeopleFiltering) { + // If we don't have a Conversation section, just assign buckets normally based on the + // content. + return + } + // If HUNs are not continuous with the top section, break out into a new Incoming section. + entries.asReversed().asSequence().zipWithNext().forEach { (next, entry) -> + if (entry.isRowHeadsUp && entry.bucket > next.bucket) { + entry.bucket = BUCKET_HEADS_UP + } + } + } + + @PriorityBucket + private fun getBucketForEntry(entry: NotificationEntry): Int { val isHeadsUp = entry.isRowHeadsUp val isMedia = isImportantMedia(entry) val isSystemMax = entry.isSystemMax() - setBucket(entry, isHeadsUp, isMedia, isSystemMax) - } - - private fun setBucket( - entry: NotificationEntry, - isHeadsUp: Boolean, - isMedia: Boolean, - isSystemMax: Boolean - ) { - if (usePeopleFiltering && isHeadsUp) { - entry.bucket = BUCKET_HEADS_UP - } else if (usePeopleFiltering && entry.getPeopleNotificationType() != TYPE_NON_PERSON) { - entry.bucket = BUCKET_PEOPLE - } else if (isHeadsUp || isMedia || isSystemMax || entry.isHighPriority()) { - entry.bucket = BUCKET_ALERTING - } else { - entry.bucket = BUCKET_SILENT + return when { + usePeopleFiltering && entry.getPeopleNotificationType() != TYPE_NON_PERSON -> + BUCKET_PEOPLE + isHeadsUp || isMedia || isSystemMax || entry.isHighPriority() -> + BUCKET_ALERTING + else -> BUCKET_SILENT } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java index d02037cf61fd..6eec1ca33e14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSectionsManager.java @@ -109,6 +109,7 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section @Nullable private View.OnClickListener mOnClearGentleNotifsClickListener; private SectionHeaderView mAlertingHeader; + private SectionHeaderView mIncomingHeader; private PeopleHubView mPeopleHubView; private boolean mPeopleHubVisible = false; @@ -199,6 +200,11 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section mPeopleHubSubscription = mPeopleHubViewAdapter.bindView(mPeopleHubViewBoundary); } + mIncomingHeader = reinflateView( + mIncomingHeader, layoutInflater, R.layout.status_bar_notification_section_header); + mIncomingHeader.setHeaderText(R.string.notification_section_header_incoming); + mIncomingHeader.setOnHeaderClickListener(this::onGentleHeaderClick); + if (mMediaControlsView != null) { mKeyguardMediaPlayer.unbindView(); } @@ -218,6 +224,7 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section || view == mMediaControlsView || view == mPeopleHubView || view == mAlertingHeader + || view == mIncomingHeader || !Objects.equals(getBucket(view), getBucket(previous)); } @@ -229,6 +236,8 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section private Integer getBucket(View view) { if (view == mGentleHeader) { return BUCKET_SILENT; + } else if (view == mIncomingHeader) { + return BUCKET_HEADS_UP; } else if (view == mMediaControlsView) { return BUCKET_MEDIA_CONTROLS; } else if (view == mPeopleHubView) { @@ -267,6 +276,8 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section // Currently, just putting media controls in the front and incrementing the position based // on the number of heads-up notifs. int mediaControlsTarget = isKeyguard && usingMediaControls ? 0 : -1; + int currentIncomingHeaderIdx = -1; + int incomingHeaderTarget = -1; int currentPeopleHeaderIdx = -1; int peopleHeaderTarget = -1; int currentAlertingHeaderIdx = -1; @@ -281,6 +292,10 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section View child = mParent.getChildAt(i); // Track the existing positions of the headers + if (child == mIncomingHeader) { + currentIncomingHeaderIdx = i; + continue; + } if (child == mMediaControlsView) { currentMediaControlsIdx = i; continue; @@ -306,6 +321,26 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section // Once we enter a new section, calculate the target position for the header. switch (row.getEntry().getBucket()) { case BUCKET_HEADS_UP: + if (showHeaders && incomingHeaderTarget == -1) { + incomingHeaderTarget = i; + // Offset the target if there are other headers before this that will be + // moved. + if (currentIncomingHeaderIdx != -1) { + incomingHeaderTarget--; + } + if (currentMediaControlsIdx != -1) { + incomingHeaderTarget--; + } + if (currentPeopleHeaderIdx != -1) { + incomingHeaderTarget--; + } + if (currentAlertingHeaderIdx != -1) { + incomingHeaderTarget--; + } + if (currentGentleHeaderIdx != -1) { + incomingHeaderTarget--; + } + } if (mediaControlsTarget != -1) { mediaControlsTarget++; } @@ -378,8 +413,8 @@ public class NotificationSectionsManager implements StackScrollAlgorithm.Section alertingHeaderTarget, mAlertingHeader, currentAlertingHeaderIdx); adjustHeaderVisibilityAndPosition( peopleHeaderTarget, mPeopleHubView, currentPeopleHeaderIdx); - adjustViewPosition( - mediaControlsTarget, mMediaControlsView, currentMediaControlsIdx); + adjustViewPosition(mediaControlsTarget, mMediaControlsView, currentMediaControlsIdx); + adjustViewPosition(incomingHeaderTarget, mIncomingHeader, currentIncomingHeaderIdx); // Update headers to reflect state of section contents mGentleHeader.setAreThereDismissableGentleNotifs( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java index fc6a02840891..567ddb680848 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowController.java @@ -321,7 +321,8 @@ public class NotificationShadeWindowController implements Callback, Dumpable, || state.mPanelVisible || state.mKeyguardFadingAway || state.mBouncerShowing || state.mHeadsUpShowing || state.mScrimsVisibility != ScrimController.TRANSPARENT) - || state.mBackgroundBlurRadius > 0; + || state.mBackgroundBlurRadius > 0 + || state.mLaunchingActivity; } private void applyFitsSystemWindows(State state) { @@ -485,6 +486,11 @@ public class NotificationShadeWindowController implements Callback, Dumpable, apply(mCurrentState); } + void setLaunchingActivity(boolean launching) { + mCurrentState.mLaunchingActivity = launching; + apply(mCurrentState); + } + public void setScrimsVisibility(int scrimsVisibility) { mCurrentState.mScrimsVisibility = scrimsVisibility; apply(mCurrentState); @@ -645,6 +651,7 @@ public class NotificationShadeWindowController implements Callback, Dumpable, boolean mForceCollapsed; boolean mForceDozeBrightness; boolean mForceUserActivity; + boolean mLaunchingActivity; boolean mBackdropShowing; boolean mWallpaperSupportsAmbientMode; boolean mNotTouchable; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java index 596a607bb8ad..0d2589847bcb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewController.java @@ -93,6 +93,7 @@ public class NotificationShadeWindowViewController { private PhoneStatusBarView mStatusBarView; private PhoneStatusBarTransitions mBarTransitions; private StatusBar mService; + private NotificationShadeWindowController mNotificationShadeWindowController; private DragDownHelper mDragDownHelper; private boolean mDoubleTapEnabled; private boolean mSingleTapEnabled; @@ -430,10 +431,14 @@ public class NotificationShadeWindowViewController { public void setExpandAnimationPending(boolean pending) { mExpandAnimationPending = pending; + mNotificationShadeWindowController + .setLaunchingActivity(mExpandAnimationPending | mExpandAnimationRunning); } public void setExpandAnimationRunning(boolean running) { mExpandAnimationRunning = running; + mNotificationShadeWindowController + .setLaunchingActivity(mExpandAnimationPending | mExpandAnimationRunning); } public void cancelExpandHelper() { @@ -456,8 +461,9 @@ public class NotificationShadeWindowViewController { } } - public void setService(StatusBar statusBar) { + public void setService(StatusBar statusBar, NotificationShadeWindowController controller) { mService = statusBar; + mNotificationShadeWindowController = controller; } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index c5901398a54b..33997b9a5735 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -440,24 +440,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo if (!(relevantState && mExpansionAffectsAlpha)) { return; } - applyExpansionToAlpha(); - if (mUpdatePending) { - return; - } - setOrAdaptCurrentAnimation(mScrimBehind); - setOrAdaptCurrentAnimation(mScrimInFront); - setOrAdaptCurrentAnimation(mScrimForBubble); - dispatchScrimState(mScrimBehind.getViewAlpha()); - - // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING - // and docking. - if (mWallpaperVisibilityTimedOut) { - mWallpaperVisibilityTimedOut = false; - DejankUtils.postAfterTraversal(() -> { - mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), - AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); - }); - } + applyAndDispatchExpansion(); } } @@ -513,6 +496,27 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } } + private void applyAndDispatchExpansion() { + applyExpansionToAlpha(); + if (mUpdatePending) { + return; + } + setOrAdaptCurrentAnimation(mScrimBehind); + setOrAdaptCurrentAnimation(mScrimInFront); + setOrAdaptCurrentAnimation(mScrimForBubble); + dispatchScrimState(mScrimBehind.getViewAlpha()); + + // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING + // and docking. + if (mWallpaperVisibilityTimedOut) { + mWallpaperVisibilityTimedOut = false; + DejankUtils.postAfterTraversal(() -> { + mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), + AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); + }); + } + } + /** * Sets the given drawable as the background of the scrim that shows up behind the * notifications. @@ -1006,6 +1010,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo public void setExpansionAffectsAlpha(boolean expansionAffectsAlpha) { mExpansionAffectsAlpha = expansionAffectsAlpha; + if (expansionAffectsAlpha) { + applyAndDispatchExpansion(); + } } public void setKeyguardOccluded(boolean keyguardOccluded) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index bbf83bc2057a..dd54a3d800fb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1001,7 +1001,7 @@ public class StatusBar extends SystemUI implements DemoMode, updateTheme(); inflateStatusBarWindow(); - mNotificationShadeWindowViewController.setService(this); + mNotificationShadeWindowViewController.setService(this, mNotificationShadeWindowController); mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener()); // TODO: Deal with the ugliness that comes from having some of the statusbar broken out diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index 1df617d68374..44ece3584ee2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -285,18 +285,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit mLogger.logHandleClickAfterKeyguardDismissed(sbn.getKey()); // TODO: Some of this code may be able to move to NotificationEntryManager. - if (mHeadsUpManager != null && mHeadsUpManager.isAlerting(sbn.getKey())) { - // Release the HUN notification to the shade. - - if (mPresenter.isPresenterFullyCollapsed()) { - HeadsUpUtil.setIsClickedHeadsUpNotification(row, true); - } - // - // In most cases, when FLAG_AUTO_CANCEL is set, the notification will - // become canceled shortly by NoMan, but we can't assume that. - mHeadsUpManager.removeNotification(sbn.getKey(), - true /* releaseImmediately */); - } + removeHUN(row); NotificationEntry parentToCancel = null; if (shouldAutoCancel(sbn) && mGroupManager.isOnlyChildInGroup(sbn)) { NotificationEntry summarySbn = mGroupManager.getLogicalGroupSummary(sbn); @@ -461,8 +450,12 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit row, mStatusBar.isOccluded())), new UserHandle(UserHandle.getUserId(appUid))); mActivityLaunchAnimator.setLaunchResult(launchResult, true /* isActivityIntent */); + + // Putting it back on the main thread, since we're touching views + mMainThreadHandler.post(() -> { + removeHUN(row); + }); if (shouldCollapse()) { - // Putting it back on the main thread, since we're touching views mMainThreadHandler.post(() -> mCommandQueue.animateCollapsePanels( CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */)); } @@ -494,6 +487,20 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit }, null, false /* afterKeyguardGone */); } + private void removeHUN(ExpandableNotificationRow row) { + String key = row.getEntry().getSbn().getKey(); + if (mHeadsUpManager != null && mHeadsUpManager.isAlerting(key)) { + // Release the HUN notification to the shade. + if (mPresenter.isPresenterFullyCollapsed()) { + HeadsUpUtil.setIsClickedHeadsUpNotification(row, true); + } + + // In most cases, when FLAG_AUTO_CANCEL is set, the notification will + // become canceled shortly by NoMan, but we can't assume that. + mHeadsUpManager.removeNotification(key, true /* releaseImmediately */); + } + } + private void handleFullScreenIntent(NotificationEntry entry) { if (mNotificationInterruptStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) { if (shouldSuppressFullScreenIntent(entry)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index a81189eaeaf8..b9168e3c2223 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -53,6 +53,11 @@ public interface BatteryController extends DemoMode, Dumpable, boolean isAodPowerSave(); /** + * Initializes the class. + */ + default void init() { } + + /** * Returns {@code true} if reverse is supported. */ default boolean isReverseSupported() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index 95b41a141244..00419e671814 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -80,7 +80,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @VisibleForTesting @Inject - protected BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, + public BatteryControllerImpl(Context context, EnhancedEstimates enhancedEstimates, PowerManager powerManager, BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, @Background Handler bgHandler) { mContext = context; @@ -89,10 +89,6 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mPowerManager = powerManager; mEstimates = enhancedEstimates; mBroadcastDispatcher = broadcastDispatcher; - - registerReceiver(); - updatePowerSave(); - updateEstimate(); } private void registerReceiver() { @@ -104,6 +100,13 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } @Override + public void init() { + registerReceiver(); + updatePowerSave(); + updateEstimate(); + } + + @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("BatteryController state:"); pw.print(" mLevel="); pw.println(mLevel); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index a284335c972e..f41a27cf4c64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -329,7 +329,8 @@ public class NetworkControllerImpl extends BroadcastReceiver return mDataSaverController; } - private void registerListeners() { + @VisibleForTesting + void registerListeners() { for (int i = 0; i < mMobileSignalControllers.size(); i++) { MobileSignalController mobileSignalController = mMobileSignalControllers.valueAt(i); mobileSignalController.registerListener(); @@ -364,6 +365,18 @@ public class NetworkControllerImpl extends BroadcastReceiver // Initial setup of WifiSignalController. Handled as if we had received a sticky broadcast // of WifiManager.WIFI_STATE_CHANGED_ACTION or WifiManager.NETWORK_STATE_CHANGED_ACTION mReceiverHandler.post(mWifiSignalController::fetchInitialState); + + // Initial setup of mLastServiceState. Only run if there is no service state yet. + // Each MobileSignalController will also get their corresponding + mReceiverHandler.post(() -> { + if (mLastServiceState == null) { + mLastServiceState = mPhone.getServiceState(); + if (mMobileSignalControllers.size() == 0) { + recalculateEmergency(); + } + } + }); + updateMobileControllers(); // Initial setup of emergency information. Handled as if we had received a sticky broadcast diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java index 8acfbf2b6996..7729965b56c4 100644 --- a/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java +++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/ConcurrencyModule.java @@ -23,6 +23,7 @@ import android.os.Looper; import android.os.Process; import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.LongRunning; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; @@ -50,6 +51,17 @@ public abstract class ConcurrencyModule { return thread.getLooper(); } + /** Long running tasks Looper */ + @Provides + @Singleton + @LongRunning + public static Looper provideLongRunningLooper() { + HandlerThread thread = new HandlerThread("SysUiLng", + Process.THREAD_PRIORITY_BACKGROUND); + thread.start(); + return thread.getLooper(); + } + /** Main Looper */ @Provides @Main @@ -89,6 +101,16 @@ public abstract class ConcurrencyModule { } /** + * Provide a Long running Executor by default. + */ + @Provides + @Singleton + @LongRunning + public static Executor provideLongRunningExecutor(@LongRunning Looper looper) { + return new ExecutorImpl(looper); + } + + /** * Provide a Background-Thread Executor. */ @Provides diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 6c00ecacf97d..c3106bb2e3f2 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -70,6 +70,7 @@ import android.testing.TestableLooper; import androidx.lifecycle.LiveData; import androidx.lifecycle.Observer; +import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.telephony.TelephonyIntents; import com.android.keyguard.KeyguardUpdateMonitor.BiometricAuthenticated; import com.android.systemui.SysuiTestCase; @@ -87,6 +88,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.MockitoSession; import java.util.ArrayList; import java.util.List; @@ -134,16 +136,17 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock + private TelephonyManager mTelephonyManager; + @Mock private RingerModeTracker mRingerModeTracker; @Mock private LiveData<Integer> mRingerModeLiveData; - @Mock - private TelephonyManager mTelephonyManager; // Direct executor private Executor mBackgroundExecutor = Runnable::run; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; private TestableContext mSpiedContext; + private MockitoSession mMockitoSession; @Before public void setup() { @@ -165,6 +168,9 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(mStrongAuthTracker .isUnlockingWithBiometricAllowed(anyBoolean() /* isStrongBiometric */)) .thenReturn(true); + + when(mTelephonyManager.getServiceStateForSubscriber(anyInt())) + .thenReturn(new ServiceState()); mSpiedContext.addMockSystemService(TrustManager.class, mTrustManager); mSpiedContext.addMockSystemService(FingerprintManager.class, mFingerprintManager); mSpiedContext.addMockSystemService(BiometricManager.class, mBiometricManager); @@ -176,6 +182,11 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(mRingerModeTracker.getRingerMode()).thenReturn(mRingerModeLiveData); + mMockitoSession = ExtendedMockito.mockitoSession() + .spyStatic(SubscriptionManager.class).startMocking(); + ExtendedMockito.doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID) + .when(SubscriptionManager::getDefaultSubscriptionId); + mTestableLooper = TestableLooper.get(this); allowTestableLooperAsMainThread(); mKeyguardUpdateMonitor = new TestableKeyguardUpdateMonitor(mSpiedContext); @@ -183,6 +194,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @After public void tearDown() { + mMockitoSession.finishMocking(); mKeyguardUpdateMonitor.destroy(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index fc1ddf74a448..821b8504e5f7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -470,7 +470,8 @@ public class AuthControllerTest extends SysuiTestCase { true /* requireConfirmation */, 0 /* userId */, "testPackage", - 0 /* operationId */); + 0 /* operationId */, + 0 /* sysUiSessionId */); } private Bundle createTestDialogBundle(int authenticators) { @@ -508,7 +509,7 @@ public class AuthControllerTest extends SysuiTestCase { @Override protected AuthDialog buildDialog(Bundle biometricPromptBundle, boolean requireConfirmation, int userId, int type, String opPackageName, - boolean skipIntro, long operationId) { + boolean skipIntro, long operationId, int sysUiSessionId) { mLastBiometricPromptBundle = biometricPromptBundle; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java index 9d35e53e7421..128d6e5612f1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java @@ -25,6 +25,8 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.Context; +import android.os.UserManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -37,6 +39,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.settingslib.bluetooth.LocalBluetoothManager; +import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; @@ -46,6 +49,7 @@ import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.notification.NotificationEntryManager; +import com.android.systemui.statusbar.policy.SecurityController; import com.android.systemui.util.concurrency.DelayableExecutor; import org.junit.Before; @@ -100,8 +104,14 @@ public class QSPanelTest extends SysuiTestCase { @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); - mTestableLooper = TestableLooper.get(this); + + // Dependencies for QSSecurityFooter + mDependency.injectTestDependency(ActivityStarter.class, mActivityStarter); + mDependency.injectMockDependency(SecurityController.class); + mDependency.injectTestDependency(Dependency.BG_LOOPER, mTestableLooper.getLooper()); + mContext.addMockSystemService(Context.USER_SERVICE, mock(UserManager.class)); + mUiEventLogger = new UiEventLoggerFake(); mTestableLooper.runWithLooper(() -> { mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 72a65034922c..53ef86660867 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -23,10 +23,10 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -41,6 +41,7 @@ import android.content.pm.ServiceInfo; import android.provider.Settings; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; import android.text.TextUtils; import android.util.ArraySet; @@ -50,10 +51,6 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSTileHost; -import com.android.systemui.qs.logging.QSLogger; -import com.android.systemui.qs.tiles.HotspotTile; -import com.android.systemui.statusbar.policy.DataSaverController; -import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; @@ -63,6 +60,7 @@ import org.junit.runner.RunWith; import org.mockito.Answers; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -73,6 +71,7 @@ import java.util.Set; @SmallTest @RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper public class TileQueryHelperTest extends SysuiTestCase { private static final String CURRENT_TILES = "wifi,dnd,nfc"; private static final String ONLY_STOCK_TILES = "wifi,dnd"; @@ -99,8 +98,6 @@ public class TileQueryHelperTest extends SysuiTestCase { private QSTileHost mQSTileHost; @Mock private PackageManager mPackageManager; - @Mock - private QSLogger mQSLogger; @Captor private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor; @@ -112,8 +109,8 @@ public class TileQueryHelperTest extends SysuiTestCase { @Before public void setup() { MockitoAnnotations.initMocks(this); + mContext.setMockPackageManager(mPackageManager); - when(mQSTileHost.getQSLogger()).thenReturn(mQSLogger); mState = new QSTile.State(); doAnswer(invocation -> { @@ -279,11 +276,10 @@ public class TileQueryHelperTest extends SysuiTestCase { } @Test - public void testQueryTiles_notAvailableDestroyed_isNotNullSpec() { - HotspotController mockHC = mock(HotspotController.class); - DataSaverController mockDSC = mock(DataSaverController.class); - when(mockHC.isHotspotSupported()).thenReturn(false); - HotspotTile t = new HotspotTile(mQSTileHost, mockHC, mockDSC); + public void testQueryTiles_notAvailableDestroyed_tileSpecIsSet() { + Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.QS_TILES, null); + + QSTile t = mock(QSTile.class); when(mQSTileHost.createTile("hotspot")).thenReturn(t); mContext.getOrCreateTestableResources().addOverride(R.string.quick_settings_tiles_stock, @@ -292,6 +288,8 @@ public class TileQueryHelperTest extends SysuiTestCase { mTileQueryHelper.queryTiles(mQSTileHost); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); - verify(mQSLogger).logTileDestroyed(eq("hotspot"), anyString()); + InOrder verifier = inOrder(t); + verifier.verify(t).setTileSpec("hotspot"); + verifier.verify(t).destroy(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index cffcabb55e14..63e6e8cba628 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -410,11 +410,12 @@ public class CommandQueueTest extends SysuiTestCase { Bundle bundle = new Bundle(); String packageName = "test"; final long operationId = 1; + final int sysUiSessionId = 2; mCommandQueue.showAuthenticationDialog(bundle, null /* receiver */, 1, true, 3, - packageName, operationId); + packageName, operationId, sysUiSessionId); waitForIdleSync(); verify(mCallbacks).showAuthenticationDialog(eq(bundle), eq(null), eq(1), eq(true), eq(3), - eq(packageName), eq(operationId)); + eq(packageName), eq(operationId), eq(sysUiSessionId)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 972357e960ef..bb7f73a3a959 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -26,6 +26,7 @@ import static junit.framework.Assert.assertNull; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -93,6 +94,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -261,6 +263,19 @@ public class NotificationEntryManagerTest extends SysuiTestCase { } @Test + public void testRemoveUninflatedNotification_removesNotificationFromAllNotifsList() { + // GIVEN an uninflated entry is added + mEntryManager.addNotification(mSbn, mRankingMap); + assertTrue(entriesContainKey(mEntryManager.getAllNotifs(), mSbn.getKey())); + + // WHEN the uninflated entry is removed + mEntryManager.performRemoveNotification(mSbn, UNDEFINED_DISMISS_REASON); + + // THEN the entry is still removed from the allNotifications list + assertFalse(entriesContainKey(mEntryManager.getAllNotifs(), mSbn.getKey())); + } + + @Test public void testRemoveNotification_onEntryRemoveNotFiredIfEntryDoesntExist() { mEntryManager.removeNotification("not_a_real_key", mRankingMap, UNDEFINED_DISMISS_REASON); @@ -545,6 +560,15 @@ public class NotificationEntryManagerTest extends SysuiTestCase { /* End annex */ + private boolean entriesContainKey(Collection<NotificationEntry> entries, String key) { + for (NotificationEntry entry : entries) { + if (entry.getSbn().getKey().equals(key)) { + return true; + } + } + return false; + } + private Notification.Action createAction() { return new Notification.Action.Builder( Icon.createWithResource(getContext(), android.R.drawable.sym_def_app_icon), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt index b501a2ebeb64..ca7a5dbdc36d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt @@ -49,12 +49,12 @@ class NotificationSectionsFeatureManagerTest : SysuiTestCase() { manager!!.clearCache() originalQsMediaPlayer = Settings.System.getInt(context.getContentResolver(), "qs_media_player", 1) - Settings.System.putInt(context.getContentResolver(), "qs_media_player", 0) + Settings.Global.putInt(context.getContentResolver(), "qs_media_player", 0) } @After public fun teardown() { - Settings.System.putInt(context.getContentResolver(), "qs_media_player", + Settings.Global.putInt(context.getContentResolver(), "qs_media_player", originalQsMediaPlayer) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java index cc2d1c25de38..e04d25b17c71 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationShadeWindowViewTest.java @@ -83,6 +83,7 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { @Mock private NotificationStackScrollLayout mNotificationStackScrollLayout; @Mock private NotificationShadeDepthController mNotificationShadeDepthController; @Mock private SuperStatusBarViewFactory mStatusBarViewFactory; + @Mock private NotificationShadeWindowController mNotificationShadeWindowController; @Before public void setUp() { @@ -121,7 +122,7 @@ public class NotificationShadeWindowViewTest extends SysuiTestCase { mNotificationPanelViewController, mStatusBarViewFactory); mController.setupExpandedStatusBar(); - mController.setService(mStatusBar); + mController.setService(mStatusBar, mNotificationShadeWindowController); mController.setDragDownHelper(mDragDownHelper); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index 05a48678c8d7..f83fbd478bf3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -55,6 +55,7 @@ public class BatteryControllerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mBatteryController = new BatteryControllerImpl(getContext(), mock(EnhancedEstimates.class), mPowerManager, mBroadcastDispatcher, new Handler(), new Handler()); + mBatteryController.init(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 399b5c24431b..3b2743775721 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkCapabilities; +import android.os.Handler; import android.os.Looper; import android.telephony.CellSignalStrength; import android.telephony.ServiceState; @@ -46,6 +47,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @SmallTest @@ -68,6 +70,28 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { } @Test + public void testServiceStateInitialState() throws Exception { + // Verify that NetworkControllerImpl pulls the service state from Telephony upon + // initialization rather than relying on the sticky behavior of ACTION_SERVICE_STATE + + when(mServiceState.isEmergencyOnly()).thenReturn(true); + when(mMockTm.getServiceState()).thenReturn(mServiceState); + when(mMockSm.getCompleteActiveSubscriptionInfoList()).thenReturn(Collections.emptyList()); + + mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, + mMockNsm, mMockSm, mConfig, Looper.getMainLooper(), mCallbackHandler, + mock(AccessPointControllerImpl.class), mock(DataUsageController.class), + mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd); + mNetworkController.registerListeners(); + + // Wait for the main looper to execute the previous command + Handler mainThreadHandler = new Handler(Looper.getMainLooper()); + waitForIdleSync(mainThreadHandler); + + verifyEmergencyOnly(true); + } + + @Test public void testNoSimsIconPresent() { // No Subscriptions. mNetworkController.mMobileSignalControllers.clear(); diff --git a/packages/Tethering/Android.bp b/packages/Tethering/Android.bp index bfb65241ec6d..cbc5e14139ac 100644 --- a/packages/Tethering/Android.bp +++ b/packages/Tethering/Android.bp @@ -27,7 +27,7 @@ java_defaults { "androidx.annotation_annotation", "netd_aidl_interface-V3-java", "netlink-client", - "networkstack-aidl-interfaces-unstable-java", + "networkstack-aidl-interfaces-java", "android.hardware.tetheroffload.config-V1.0-java", "android.hardware.tetheroffload.control-V1.0-java", "net-utils-framework-common", @@ -109,6 +109,7 @@ android_app { manifest: "AndroidManifest_InProcess.xml", // InProcessTethering is a replacement for Tethering overrides: ["Tethering"], + apex_available: ["com.android.tethering"], } // Updatable tethering packaged as an application diff --git a/packages/Tethering/apex/Android.bp b/packages/Tethering/apex/Android.bp index 24df5f696077..20ccd2ad6453 100644 --- a/packages/Tethering/apex/Android.bp +++ b/packages/Tethering/apex/Android.bp @@ -36,3 +36,12 @@ android_app_certificate { name: "com.android.tethering.certificate", certificate: "com.android.tethering", } + +override_apex { + name: "com.android.tethering.inprocess", + base: "com.android.tethering", + package_name: "com.android.tethering.inprocess", + apps: [ + "InProcessTethering", + ], +} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java b/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java index 049a9f68bbd2..23b8be1d0720 100644 --- a/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java +++ b/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java @@ -37,6 +37,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.util.SharedLog; import android.os.Bundle; +import android.os.ConditionVariable; import android.os.Handler; import android.os.Parcel; import android.os.PersistableBundle; @@ -45,13 +46,12 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Settings; import android.telephony.CarrierConfigManager; -import android.util.ArraySet; import android.util.SparseIntArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.StateMachine; import java.io.PrintWriter; +import java.util.BitSet; /** * Re-check tethering provisioning for enabled downstream tether types. @@ -73,39 +73,37 @@ public class EntitlementManager { private final ComponentName mSilentProvisioningService; private static final int MS_PER_HOUR = 60 * 60 * 1000; + private static final int DUMP_TIMEOUT = 10_000; - // The ArraySet contains enabled downstream types, ex: + // The BitSet is the bit map of each enabled downstream types, ex: // {@link TetheringManager.TETHERING_WIFI} // {@link TetheringManager.TETHERING_USB} // {@link TetheringManager.TETHERING_BLUETOOTH} - private final ArraySet<Integer> mCurrentTethers; + private final BitSet mCurrentDownstreams; private final Context mContext; - private final int mPermissionChangeMessageCode; private final SharedLog mLog; private final SparseIntArray mEntitlementCacheValue; private final Handler mHandler; - private final StateMachine mTetherMasterSM; // Key: TetheringManager.TETHERING_*(downstream). // Value: TetheringManager.TETHER_ERROR_{NO_ERROR or PROVISION_FAILED}(provisioning result). - private final SparseIntArray mCellularPermitted; + private final SparseIntArray mCurrentEntitlementResults; + private final Runnable mPermissionChangeCallback; private PendingIntent mProvisioningRecheckAlarm; - private boolean mCellularUpstreamPermitted = true; + private boolean mLastCellularUpstreamPermitted = true; private boolean mUsingCellularAsUpstream = false; private boolean mNeedReRunProvisioningUi = false; private OnUiEntitlementFailedListener mListener; private TetheringConfigurationFetcher mFetcher; - public EntitlementManager(Context ctx, StateMachine tetherMasterSM, SharedLog log, - int permissionChangeMessageCode) { - + public EntitlementManager(Context ctx, Handler h, SharedLog log, + Runnable callback) { mContext = ctx; mLog = log.forSubComponent(TAG); - mCurrentTethers = new ArraySet<Integer>(); - mCellularPermitted = new SparseIntArray(); + mCurrentDownstreams = new BitSet(); + mCurrentEntitlementResults = new SparseIntArray(); mEntitlementCacheValue = new SparseIntArray(); - mTetherMasterSM = tetherMasterSM; - mPermissionChangeMessageCode = permissionChangeMessageCode; - mHandler = tetherMasterSM.getHandler(); + mPermissionChangeCallback = callback; + mHandler = h; mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PROVISIONING_ALARM), null, mHandler); mSilentProvisioningService = ComponentName.unflattenFromString( @@ -144,13 +142,19 @@ public class EntitlementManager { * Check if cellular upstream is permitted. */ public boolean isCellularUpstreamPermitted() { - // If provisioning is required and EntitlementManager don't know any downstream, - // cellular upstream should not be allowed. final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - if (mCurrentTethers.size() == 0 && isTetherProvisioningRequired(config)) { - return false; - } - return mCellularUpstreamPermitted; + + return isCellularUpstreamPermitted(config); + } + + private boolean isCellularUpstreamPermitted(final TetheringConfiguration config) { + if (!isTetherProvisioningRequired(config)) return true; + + // If provisioning is required and EntitlementManager doesn't know any downstreams, + // cellular upstream should not be allowed. + if (mCurrentDownstreams.isEmpty()) return false; + + return mCurrentEntitlementResults.indexOfValue(TETHER_ERROR_NO_ERROR) > -1; } /** @@ -164,29 +168,22 @@ public class EntitlementManager { public void startProvisioningIfNeeded(int downstreamType, boolean showProvisioningUi) { if (!isValidDownstreamType(downstreamType)) return; - if (!mCurrentTethers.contains(downstreamType)) mCurrentTethers.add(downstreamType); + mCurrentDownstreams.set(downstreamType, true); final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - if (isTetherProvisioningRequired(config)) { - // If provisioning is required and the result is not available yet, - // cellular upstream should not be allowed. - if (mCellularPermitted.size() == 0) { - mCellularUpstreamPermitted = false; - } - // If upstream is not cellular, provisioning app would not be launched - // till upstream change to cellular. - if (mUsingCellularAsUpstream) { - if (showProvisioningUi) { - runUiTetherProvisioning(downstreamType, config.activeDataSubId); - } else { - runSilentTetherProvisioning(downstreamType, config.activeDataSubId); - } - mNeedReRunProvisioningUi = false; + if (!isTetherProvisioningRequired(config)) return; + + // If upstream is not cellular, provisioning app would not be launched + // till upstream change to cellular. + if (mUsingCellularAsUpstream) { + if (showProvisioningUi) { + runUiTetherProvisioning(downstreamType, config.activeDataSubId); } else { - mNeedReRunProvisioningUi |= showProvisioningUi; + runSilentTetherProvisioning(downstreamType, config.activeDataSubId); } + mNeedReRunProvisioningUi = false; } else { - mCellularUpstreamPermitted = true; + mNeedReRunProvisioningUi |= showProvisioningUi; } } @@ -195,14 +192,14 @@ public class EntitlementManager { * * @param type tethering type from TetheringManager.TETHERING_{@code *} */ - public void stopProvisioningIfNeeded(int type) { - if (!isValidDownstreamType(type)) return; + public void stopProvisioningIfNeeded(int downstreamType) { + if (!isValidDownstreamType(downstreamType)) return; - mCurrentTethers.remove(type); + mCurrentDownstreams.set(downstreamType, false); // There are lurking bugs where the notion of "provisioning required" or // "tethering supported" may change without without tethering being notified properly. // Remove the mapping all the time no matter provisioning is required or not. - removeDownstreamMapping(type); + removeDownstreamMapping(downstreamType); } /** @@ -213,7 +210,7 @@ public class EntitlementManager { public void notifyUpstream(boolean isCellular) { if (DBG) { mLog.i("notifyUpstream: " + isCellular - + ", mCellularUpstreamPermitted: " + mCellularUpstreamPermitted + + ", mLastCellularUpstreamPermitted: " + mLastCellularUpstreamPermitted + ", mNeedReRunProvisioningUi: " + mNeedReRunProvisioningUi); } mUsingCellularAsUpstream = isCellular; @@ -231,7 +228,7 @@ public class EntitlementManager { } private void maybeRunProvisioning(final TetheringConfiguration config) { - if (mCurrentTethers.size() == 0 || !isTetherProvisioningRequired(config)) { + if (mCurrentDownstreams.isEmpty() || !isTetherProvisioningRequired(config)) { return; } @@ -239,8 +236,9 @@ public class EntitlementManager { // are allowed. Therefore even if the silent check here ends in a failure and the UI later // yields success, then the downstream that got a failure will re-evaluate as a result of // the change and get the new correct value. - for (Integer downstream : mCurrentTethers) { - if (mCellularPermitted.indexOfKey(downstream) < 0) { + for (int downstream = mCurrentDownstreams.nextSetBit(0); downstream >= 0; + downstream = mCurrentDownstreams.nextSetBit(downstream + 1)) { + if (mCurrentEntitlementResults.indexOfKey(downstream) < 0) { if (mNeedReRunProvisioningUi) { mNeedReRunProvisioningUi = false; runUiTetherProvisioning(downstream, config.activeDataSubId); @@ -286,7 +284,7 @@ public class EntitlementManager { mLog.log("reevaluateSimCardProvisioning() don't run in TetherMaster thread"); } mEntitlementCacheValue.clear(); - mCellularPermitted.clear(); + mCurrentEntitlementResults.clear(); // TODO: refine provisioning check to isTetherProvisioningRequired() ?? if (!config.hasMobileHotspotProvisionApp() @@ -410,26 +408,25 @@ public class EntitlementManager { } private void evaluateCellularPermission(final TetheringConfiguration config) { - final boolean oldPermitted = mCellularUpstreamPermitted; - mCellularUpstreamPermitted = (!isTetherProvisioningRequired(config) - || mCellularPermitted.indexOfValue(TETHER_ERROR_NO_ERROR) > -1); + final boolean permitted = isCellularUpstreamPermitted(config); if (DBG) { - mLog.i("Cellular permission change from " + oldPermitted - + " to " + mCellularUpstreamPermitted); + mLog.i("Cellular permission change from " + mLastCellularUpstreamPermitted + + " to " + permitted); } - if (mCellularUpstreamPermitted != oldPermitted) { - mLog.log("Cellular permission change: " + mCellularUpstreamPermitted); - mTetherMasterSM.sendMessage(mPermissionChangeMessageCode); + if (mLastCellularUpstreamPermitted != permitted) { + mLog.log("Cellular permission change: " + permitted); + mPermissionChangeCallback.run(); } // Only schedule periodic re-check when tether is provisioned // and the result is ok. - if (mCellularUpstreamPermitted && mCellularPermitted.size() > 0) { + if (permitted && mCurrentEntitlementResults.size() > 0) { scheduleProvisioningRechecks(config); } else { cancelTetherProvisioningRechecks(); } + mLastCellularUpstreamPermitted = permitted; } /** @@ -441,10 +438,10 @@ public class EntitlementManager { */ protected void addDownstreamMapping(int type, int resultCode) { mLog.i("addDownstreamMapping: " + type + ", result: " + resultCode - + " ,TetherTypeRequested: " + mCurrentTethers.contains(type)); - if (!mCurrentTethers.contains(type)) return; + + " ,TetherTypeRequested: " + mCurrentDownstreams.get(type)); + if (!mCurrentDownstreams.get(type)) return; - mCellularPermitted.put(type, resultCode); + mCurrentEntitlementResults.put(type, resultCode); final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); evaluateCellularPermission(config); } @@ -455,7 +452,7 @@ public class EntitlementManager { */ protected void removeDownstreamMapping(int type) { mLog.i("removeDownstreamMapping: " + type); - mCellularPermitted.delete(type); + mCurrentEntitlementResults.delete(type); final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); evaluateCellularPermission(config); } @@ -488,17 +485,25 @@ public class EntitlementManager { * @param pw {@link PrintWriter} is used to print formatted */ public void dump(PrintWriter pw) { - pw.print("mCellularUpstreamPermitted: "); - pw.println(mCellularUpstreamPermitted); - for (Integer type : mCurrentTethers) { - pw.print("Type: "); - pw.print(typeString(type)); - if (mCellularPermitted.indexOfKey(type) > -1) { - pw.print(", Value: "); - pw.println(errorString(mCellularPermitted.get(type))); - } else { - pw.println(", Value: empty"); + final ConditionVariable mWaiting = new ConditionVariable(); + mHandler.post(() -> { + pw.print("isCellularUpstreamPermitted: "); + pw.println(isCellularUpstreamPermitted()); + for (int type = mCurrentDownstreams.nextSetBit(0); type >= 0; + type = mCurrentDownstreams.nextSetBit(type + 1)) { + pw.print("Type: "); + pw.print(typeString(type)); + if (mCurrentEntitlementResults.indexOfKey(type) > -1) { + pw.print(", Value: "); + pw.println(errorString(mCurrentEntitlementResults.get(type))); + } else { + pw.println(", Value: empty"); + } } + mWaiting.open(); + }); + if (!mWaiting.block(DUMP_TIMEOUT)) { + pw.println("... dump timed out after " + DUMP_TIMEOUT + "ms"); } } diff --git a/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java b/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java index 952325cc4380..753abc9f69ad 100644 --- a/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -62,7 +62,6 @@ import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE; -import android.app.usage.NetworkStatsManager; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; @@ -268,12 +267,9 @@ public class Tethering { mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps); mTetherMasterSM.start(); - final NetworkStatsManager statsManager = - (NetworkStatsManager) mContext.getSystemService(Context.NETWORK_STATS_SERVICE); mHandler = mTetherMasterSM.getHandler(); - mOffloadController = new OffloadController(mHandler, - mDeps.getOffloadHardwareInterface(mHandler, mLog), mContext.getContentResolver(), - statsManager, mLog, new OffloadController.Dependencies() { + mOffloadController = mDeps.getOffloadController(mHandler, mLog, + new OffloadController.Dependencies() { @Override public TetheringConfiguration getTetherConfig() { @@ -288,8 +284,9 @@ public class Tethering { filter.addAction(ACTION_CARRIER_CONFIG_CHANGED); // EntitlementManager will send EVENT_UPSTREAM_PERMISSION_CHANGED when cellular upstream // permission is changed according to entitlement check result. - mEntitlementMgr = mDeps.getEntitlementManager(mContext, mTetherMasterSM, mLog, - TetherMasterSM.EVENT_UPSTREAM_PERMISSION_CHANGED); + mEntitlementMgr = mDeps.getEntitlementManager(mContext, mHandler, mLog, + () -> mTetherMasterSM.sendMessage( + TetherMasterSM.EVENT_UPSTREAM_PERMISSION_CHANGED)); mEntitlementMgr.setOnUiEntitlementFailedListener((int downstream) -> { mLog.log("OBSERVED UiEnitlementFailed"); stopTethering(downstream); diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java index 9b54b5ff2403..ce546c701a61 100644 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java +++ b/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java @@ -16,6 +16,7 @@ package com.android.networkstack.tethering; +import android.app.usage.NetworkStatsManager; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.net.INetd; @@ -47,6 +48,19 @@ public abstract class TetheringDependencies { } /** + * Get a reference to the offload controller to be used by tethering. + */ + @NonNull + public OffloadController getOffloadController(@NonNull Handler h, + @NonNull SharedLog log, @NonNull OffloadController.Dependencies deps) { + final NetworkStatsManager statsManager = + (NetworkStatsManager) getContext().getSystemService(Context.NETWORK_STATS_SERVICE); + return new OffloadController(h, getOffloadHardwareInterface(h, log), + getContext().getContentResolver(), statsManager, log, deps); + } + + + /** * Get a reference to the UpstreamNetworkMonitor to be used by tethering. */ public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target, @@ -82,9 +96,9 @@ public abstract class TetheringDependencies { /** * Get a reference to the EntitlementManager to be used by tethering. */ - public EntitlementManager getEntitlementManager(Context ctx, StateMachine target, - SharedLog log, int what) { - return new EntitlementManager(ctx, target, log, what); + public EntitlementManager getEntitlementManager(Context ctx, Handler h, SharedLog log, + Runnable callback) { + return new EntitlementManager(ctx, h, log, callback); } /** diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java index 8bd0edc2490d..a692935375f7 100644 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java +++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java @@ -37,6 +37,8 @@ import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -45,7 +47,7 @@ import android.content.Context; import android.content.res.Resources; import android.net.util.SharedLog; import android.os.Bundle; -import android.os.Message; +import android.os.Handler; import android.os.PersistableBundle; import android.os.ResultReceiver; import android.os.SystemProperties; @@ -56,26 +58,22 @@ import android.telephony.CarrierConfigManager; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.util.State; -import com.android.internal.util.StateMachine; import com.android.internal.util.test.BroadcastInterceptingContext; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoSession; import org.mockito.quality.Strictness; -import java.util.ArrayList; - @RunWith(AndroidJUnit4.class) @SmallTest public final class EntitlementManagerTest { - private static final int EVENT_EM_UPDATE = 1; private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app"; @@ -90,8 +88,8 @@ public final class EntitlementManagerTest { private final PersistableBundle mCarrierConfig = new PersistableBundle(); private final TestLooper mLooper = new TestLooper(); private Context mMockContext; + private Runnable mPermissionChangeCallback; - private TestStateMachine mSM; private WrappedEntitlementManager mEnMgr; private TetheringConfiguration mConfig; private MockitoSession mMockingSession; @@ -112,9 +110,9 @@ public final class EntitlementManagerTest { public int uiProvisionCount = 0; public int silentProvisionCount = 0; - public WrappedEntitlementManager(Context ctx, StateMachine target, - SharedLog log, int what) { - super(ctx, target, log, what); + public WrappedEntitlementManager(Context ctx, Handler h, SharedLog log, + Runnable callback) { + super(ctx, h, log, callback); } public void reset() { @@ -169,8 +167,9 @@ public final class EntitlementManagerTest { when(mLog.forSubComponent(anyString())).thenReturn(mLog); mMockContext = new MockContext(mContext); - mSM = new TestStateMachine(); - mEnMgr = new WrappedEntitlementManager(mMockContext, mSM, mLog, EVENT_EM_UPDATE); + mPermissionChangeCallback = spy(() -> { }); + mEnMgr = new WrappedEntitlementManager(mMockContext, new Handler(mLooper.getLooper()), mLog, + mPermissionChangeCallback); mEnMgr.setOnUiEntitlementFailedListener(mEntitlementFailedListener); mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); mEnMgr.setTetheringConfigurationFetcher(() -> { @@ -180,10 +179,6 @@ public final class EntitlementManagerTest { @After public void tearDown() throws Exception { - if (mSM != null) { - mSM.quit(); - mSM = null; - } mMockingSession.finishMocking(); } @@ -350,68 +345,105 @@ public final class EntitlementManagerTest { mEnMgr.reset(); } + private void assertPermissionChangeCallback(InOrder inOrder) { + inOrder.verify(mPermissionChangeCallback, times(1)).run(); + } + + private void assertNoPermissionChange(InOrder inOrder) { + inOrder.verifyNoMoreInteractions(); + } + @Test public void verifyPermissionResult() { + final InOrder inOrder = inOrder(mPermissionChangeCallback); setupForRequiredProvisioning(); mEnMgr.notifyUpstream(true); mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); mLooper.dispatchAll(); + // Permitted: true -> false + assertPermissionChangeCallback(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); + mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI); mLooper.dispatchAll(); + // Permitted: false -> false + assertNoPermissionChange(inOrder); + mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); mLooper.dispatchAll(); + // Permitted: false -> true + assertPermissionChangeCallback(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); } @Test public void verifyPermissionIfAllNotApproved() { + final InOrder inOrder = inOrder(mPermissionChangeCallback); setupForRequiredProvisioning(); mEnMgr.notifyUpstream(true); mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); mLooper.dispatchAll(); + // Permitted: true -> false + assertPermissionChangeCallback(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); + mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); mLooper.dispatchAll(); + // Permitted: false -> false + assertNoPermissionChange(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); + mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true); mLooper.dispatchAll(); + // Permitted: false -> false + assertNoPermissionChange(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); } @Test public void verifyPermissionIfAnyApproved() { + final InOrder inOrder = inOrder(mPermissionChangeCallback); setupForRequiredProvisioning(); mEnMgr.notifyUpstream(true); mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); mLooper.dispatchAll(); + // Permitted: true -> true + assertNoPermissionChange(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); - mLooper.dispatchAll(); + mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); mLooper.dispatchAll(); + // Permitted: true -> true + assertNoPermissionChange(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); + mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI); mLooper.dispatchAll(); + // Permitted: true -> false + assertPermissionChangeCallback(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); - } @Test public void verifyPermissionWhenProvisioningNotStarted() { + final InOrder inOrder = inOrder(mPermissionChangeCallback); assertTrue(mEnMgr.isCellularUpstreamPermitted()); + assertNoPermissionChange(inOrder); setupForRequiredProvisioning(); assertFalse(mEnMgr.isCellularUpstreamPermitted()); + assertNoPermissionChange(inOrder); } @Test public void testRunTetherProvisioning() { + final InOrder inOrder = inOrder(mPermissionChangeCallback); setupForRequiredProvisioning(); // 1. start ui provisioning, upstream is mobile mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; @@ -421,16 +453,22 @@ public final class EntitlementManagerTest { mLooper.dispatchAll(); assertEquals(1, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + // Permitted: true -> true + assertNoPermissionChange(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); mEnMgr.reset(); + // 2. start no-ui provisioning mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, false); mLooper.dispatchAll(); assertEquals(0, mEnMgr.uiProvisionCount); assertEquals(1, mEnMgr.silentProvisionCount); + // Permitted: true -> true + assertNoPermissionChange(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); mEnMgr.reset(); + // 3. tear down mobile, then start ui provisioning mEnMgr.notifyUpstream(false); mLooper.dispatchAll(); @@ -438,44 +476,58 @@ public final class EntitlementManagerTest { mLooper.dispatchAll(); assertEquals(0, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + assertNoPermissionChange(inOrder); mEnMgr.reset(); + // 4. switch upstream back to mobile mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.notifyUpstream(true); mLooper.dispatchAll(); assertEquals(1, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + // Permitted: true -> true + assertNoPermissionChange(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); mEnMgr.reset(); + // 5. tear down mobile, then switch SIM mEnMgr.notifyUpstream(false); mLooper.dispatchAll(); mEnMgr.reevaluateSimCardProvisioning(mConfig); assertEquals(0, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + assertNoPermissionChange(inOrder); mEnMgr.reset(); + // 6. switch upstream back to mobile again mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; mEnMgr.notifyUpstream(true); mLooper.dispatchAll(); assertEquals(0, mEnMgr.uiProvisionCount); assertEquals(3, mEnMgr.silentProvisionCount); + // Permitted: true -> false + assertPermissionChangeCallback(inOrder); assertFalse(mEnMgr.isCellularUpstreamPermitted()); mEnMgr.reset(); + // 7. start ui provisioning, upstream is mobile, downstream is ethernet mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.startProvisioningIfNeeded(TETHERING_ETHERNET, true); mLooper.dispatchAll(); assertEquals(1, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + // Permitted: false -> true + assertPermissionChangeCallback(inOrder); assertTrue(mEnMgr.isCellularUpstreamPermitted()); mEnMgr.reset(); + // 8. downstream is invalid mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI_P2P, true); mLooper.dispatchAll(); assertEquals(0, mEnMgr.uiProvisionCount); assertEquals(0, mEnMgr.silentProvisionCount); + assertNoPermissionChange(inOrder); mEnMgr.reset(); } @@ -491,32 +543,4 @@ public final class EntitlementManagerTest { assertEquals(1, mEnMgr.uiProvisionCount); verify(mEntitlementFailedListener, times(1)).onUiEntitlementFailed(TETHERING_WIFI); } - - public class TestStateMachine extends StateMachine { - public final ArrayList<Message> messages = new ArrayList<>(); - private final State - mLoggingState = new EntitlementManagerTest.TestStateMachine.LoggingState(); - - class LoggingState extends State { - @Override public void enter() { - messages.clear(); - } - - @Override public void exit() { - messages.clear(); - } - - @Override public boolean processMessage(Message msg) { - messages.add(msg); - return false; - } - } - - public TestStateMachine() { - super("EntitlementManagerTest.TestStateMachine", mLooper.getLooper()); - addState(mLoggingState); - setInitialState(mLoggingState); - super.start(); - } - } } diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java index 0363f5f9989f..fa260a489332 100644 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java +++ b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java @@ -150,6 +150,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.net.Inet4Address; import java.net.Inet6Address; import java.util.ArrayList; @@ -212,6 +214,9 @@ public class TetheringTest { private Tethering mTethering; private PhoneStateListener mPhoneStateListener; private InterfaceConfigurationParcel mInterfaceConfiguration; + private TetheringConfiguration mConfig; + private EntitlementManager mEntitleMgr; + private OffloadController mOffloadCtrl; private class TestContext extends BroadcastInterceptingContext { TestContext(Context base) { @@ -297,8 +302,9 @@ public class TetheringTest { } } - private class MockTetheringConfiguration extends TetheringConfiguration { - MockTetheringConfiguration(Context ctx, SharedLog log, int id) { + // MyTetheringConfiguration is used to override static method for testing. + private class MyTetheringConfiguration extends TetheringConfiguration { + MyTetheringConfiguration(Context ctx, SharedLog log, int id) { super(ctx, log, id); } @@ -328,6 +334,15 @@ public class TetheringTest { } @Override + public OffloadController getOffloadController(Handler h, SharedLog log, + OffloadController.Dependencies deps) { + mOffloadCtrl = spy(super.getOffloadController(h, log, deps)); + // Return real object here instead of mock because + // testReportFailCallbackIfOffloadNotSupported depend on real OffloadController object. + return mOffloadCtrl; + } + + @Override public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target, SharedLog log, int what) { mUpstreamNetworkMonitorMasterSM = target; @@ -352,6 +367,13 @@ public class TetheringTest { } @Override + public EntitlementManager getEntitlementManager(Context ctx, Handler h, SharedLog log, + Runnable callback) { + mEntitleMgr = spy(super.getEntitlementManager(ctx, h, log, callback)); + return mEntitleMgr; + } + + @Override public boolean isTetheringSupported() { return true; } @@ -359,7 +381,8 @@ public class TetheringTest { @Override public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log, int subId) { - return new MockTetheringConfiguration(ctx, log, subId); + mConfig = spy(new MyTetheringConfiguration(ctx, log, subId)); + return mConfig; } @Override @@ -1726,6 +1749,19 @@ public class TetheringTest { verify(mNotificationUpdater, never()).onUpstreamCapabilitiesChanged(any()); } + @Test + public void testDumpTetheringLog() throws Exception { + final FileDescriptor mockFd = mock(FileDescriptor.class); + final PrintWriter mockPw = mock(PrintWriter.class); + runUsbTethering(null); + mLooper.startAutoDispatch(); + mTethering.dump(mockFd, mockPw, new String[0]); + verify(mConfig).dump(any()); + verify(mEntitleMgr).dump(any()); + verify(mOffloadCtrl).dump(any()); + mLooper.stopAutoDispatch(); + } + // TODO: Test that a request for hotspot mode doesn't interfere with an // already operating tethering mode interface. } diff --git a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-nl/strings.xml b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-nl/strings.xml index 4e947cba00c0..bf49cec957f5 100644 --- a/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-nl/strings.xml +++ b/packages/overlays/DisplayCutoutEmulationHoleOverlay/res/values-nl/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="display_cutout_emulation_overlay" msgid="7305489596221077240">"Punch Hole-cutout"</string> + <string name="display_cutout_emulation_overlay" msgid="7305489596221077240">"Cameragat-cutout"</string> </resources> diff --git a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-nl/strings.xml b/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-nl/strings.xml index a77840764b79..6abedbd1b72c 100644 --- a/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-nl/strings.xml +++ b/packages/overlays/DisplayCutoutEmulationWaterfallOverlay/res/values-nl/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="display_cutout_emulation_overlay" msgid="3523556473422419323">"Waterfall-cutout"</string> + <string name="display_cutout_emulation_overlay" msgid="3523556473422419323">"Waterval-cutout"</string> </resources> diff --git a/packages/overlays/IconShapeTaperedRectOverlay/res/values/config.xml b/packages/overlays/IconShapeTaperedRectOverlay/res/values/config.xml index 8e80c9df1da3..63ba20e779c3 100644 --- a/packages/overlays/IconShapeTaperedRectOverlay/res/values/config.xml +++ b/packages/overlays/IconShapeTaperedRectOverlay/res/values/config.xml @@ -24,6 +24,5 @@ <!-- Corner radius for bottom sheet system dialogs --> <dimen name="config_bottomDialogCornerRadius">0dp</dimen> <!-- Tile stroke width --> - <dimen name="config_qsTileStrokeWidthInactive">10dp</dimen> - + <dimen name="config_qsTileStrokeWidthInactive">1dp</dimen> </resources> diff --git a/services/Android.bp b/services/Android.bp index a07bb2853bfc..882085a7d0ba 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -80,6 +80,8 @@ java_library { "services.usb", "services.voiceinteraction", "services.wifi", + "service-blobstore", + "service-jobscheduler", "android.hidl.base-V1.0-java", ], diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 02ab60b05bca..6d848d17eb70 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -20,8 +20,10 @@ import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_BUTT import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY; import static android.view.accessibility.AccessibilityManager.ShortcutType; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; +import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated; import static com.android.internal.util.FunctionalUtils.ignoreRemoteException; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain; @@ -2422,6 +2424,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } // In case user assigned magnification to the given shortcut. if (targetName.equals(MAGNIFICATION_CONTROLLER_NAME)) { + final boolean enabled = !getMagnificationController().isMagnifying(displayId); + logAccessibilityShortcutActivated(MAGNIFICATION_COMPONENT_NAME, shortcutType, enabled); sendAccessibilityButtonToInputFilter(displayId); return; } @@ -2431,11 +2435,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } // In case user assigned an accessibility framework feature to the given shortcut. - if (performAccessibilityFrameworkFeature(targetComponentName)) { + if (performAccessibilityFrameworkFeature(targetComponentName, shortcutType)) { return; } // In case user assigned an accessibility shortcut target to the given shortcut. if (performAccessibilityShortcutTargetActivity(displayId, targetComponentName)) { + logAccessibilityShortcutActivated(targetComponentName, shortcutType); return; } // in case user assigned an accessibility service to the given shortcut. @@ -2445,7 +2450,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - private boolean performAccessibilityFrameworkFeature(ComponentName assignedTarget) { + private boolean performAccessibilityFrameworkFeature(ComponentName assignedTarget, + @ShortcutType int shortcutType) { final Map<ComponentName, ToggleableFrameworkFeatureInfo> frameworkFeatureMap = AccessibilityShortcutController.getFrameworkShortcutFeaturesMap(); if (!frameworkFeatureMap.containsKey(assignedTarget)) { @@ -2457,8 +2463,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub featureInfo.getSettingKey(), mCurrentUserId); // Assuming that the default state will be to have the feature off if (!TextUtils.equals(featureInfo.getSettingOnValue(), setting.read())) { + logAccessibilityShortcutActivated(assignedTarget, shortcutType, /* serviceEnabled= */ + true); setting.write(featureInfo.getSettingOnValue()); } else { + logAccessibilityShortcutActivated(assignedTarget, shortcutType, /* serviceEnabled= */ + false); setting.write(featureInfo.getSettingOffValue()); } return true; @@ -2520,8 +2530,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == ACCESSIBILITY_SHORTCUT_KEY) || (targetSdk > Build.VERSION_CODES.Q && !requestA11yButton)) { if (serviceConnection == null) { + logAccessibilityShortcutActivated(assignedTarget, + shortcutType, /* serviceEnabled= */ true); enableAccessibilityServiceLocked(assignedTarget, mCurrentUserId); + } else { + logAccessibilityShortcutActivated(assignedTarget, + shortcutType, /* serviceEnabled= */ false); disableAccessibilityServiceLocked(assignedTarget, mCurrentUserId); } return true; @@ -2541,6 +2556,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub + assignedTarget); return false; } + // ServiceConnection means service enabled. + logAccessibilityShortcutActivated(assignedTarget, shortcutType, /* serviceEnabled= */ + true); serviceConnection.notifyAccessibilityButtonClickedLocked(displayId); return true; } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java index edb4445151d5..0f98992d1ea0 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java @@ -94,8 +94,10 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect if (userState == null) return; final long identity = Binder.clearCallingIdentity(); try { - int flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE - | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS; + int flags = Context.BIND_AUTO_CREATE + | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE + | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS + | Context.BIND_INCLUDE_CAPABILITIES; if (userState.getBindInstantServiceAllowedLocked()) { flags |= Context.BIND_ALLOW_INSTANT; } diff --git a/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java index 9e4fd80c9e6b..afe6238ca38f 100644 --- a/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java +++ b/services/accessibility/java/com/android/server/accessibility/FullScreenMagnificationGestureHandler.java @@ -24,6 +24,7 @@ import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; +import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logMagnificationTripleTap; import static com.android.server.accessibility.gestures.GestureUtils.distance; import static java.lang.Math.abs; @@ -759,10 +760,17 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler // Shortcut acts as the 2 initial taps if (mShortcutTriggered) return tapCount() + 2 >= numTaps; - return mDetectTripleTap + final boolean multitapTriggered = mDetectTripleTap && tapCount() >= numTaps && isMultiTap(mPreLastDown, mLastDown) && isMultiTap(mPreLastUp, mLastUp); + + // Only log the triple tap event, use numTaps to filter. + if (multitapTriggered && numTaps > 2) { + final boolean enabled = mMagnificationController.isMagnifying(mDisplayId); + logMagnificationTripleTap(enabled); + } + return multitapTriggered; } private boolean isMultiTap(MotionEvent first, MotionEvent second) { @@ -885,7 +893,6 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler } private void onTripleTap(MotionEvent up) { - if (DEBUG_DETECTING) { Slog.i(LOG_TAG, "onTripleTap(); delayed: " + MotionEventInfo.toString(mDelayedEventQueue)); @@ -908,6 +915,10 @@ class FullScreenMagnificationGestureHandler extends MagnificationGestureHandler mViewportDraggingState.mZoomedInBeforeDrag = mMagnificationController.isMagnifying(mDisplayId); + // Triple tap and hold also belongs to triple tap event. + final boolean enabled = !mViewportDraggingState.mZoomedInBeforeDrag; + logMagnificationTripleTap(enabled); + zoomOn(down.getX(), down.getY()); transitionTo(mViewportDraggingState); diff --git a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java index 0b3899d15993..fdc5f810db22 100644 --- a/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java +++ b/services/appprediction/java/com/android/server/appprediction/AppPredictionPerUserService.java @@ -120,7 +120,7 @@ public class AppPredictionPerUserService extends this::removeAppPredictionSessionInfo)); } final boolean serviceExists = resolveService(sessionId, s -> - s.onCreatePredictionSession(context, sessionId)); + s.onCreatePredictionSession(context, sessionId), true); if (!serviceExists) { mSessionInfos.remove(sessionId); } @@ -132,7 +132,7 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void notifyAppTargetEventLocked(@NonNull AppPredictionSessionId sessionId, @NonNull AppTargetEvent event) { - resolveService(sessionId, s -> s.notifyAppTargetEvent(sessionId, event)); + resolveService(sessionId, s -> s.notifyAppTargetEvent(sessionId, event), false); } /** @@ -142,7 +142,7 @@ public class AppPredictionPerUserService extends public void notifyLaunchLocationShownLocked(@NonNull AppPredictionSessionId sessionId, @NonNull String launchLocation, @NonNull ParceledListSlice targetIds) { resolveService(sessionId, s -> - s.notifyLaunchLocationShown(sessionId, launchLocation, targetIds)); + s.notifyLaunchLocationShown(sessionId, launchLocation, targetIds), false); } /** @@ -151,7 +151,7 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void sortAppTargetsLocked(@NonNull AppPredictionSessionId sessionId, @NonNull ParceledListSlice targets, @NonNull IPredictionCallback callback) { - resolveService(sessionId, s -> s.sortAppTargets(sessionId, targets, callback)); + resolveService(sessionId, s -> s.sortAppTargets(sessionId, targets, callback), true); } /** @@ -161,7 +161,7 @@ public class AppPredictionPerUserService extends public void registerPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { final boolean serviceExists = resolveService(sessionId, s -> - s.registerPredictionUpdates(sessionId, callback)); + s.registerPredictionUpdates(sessionId, callback), false); final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); if (serviceExists && sessionInfo != null) { sessionInfo.addCallbackLocked(callback); @@ -175,7 +175,7 @@ public class AppPredictionPerUserService extends public void unregisterPredictionUpdatesLocked(@NonNull AppPredictionSessionId sessionId, @NonNull IPredictionCallback callback) { final boolean serviceExists = resolveService(sessionId, s -> - s.unregisterPredictionUpdates(sessionId, callback)); + s.unregisterPredictionUpdates(sessionId, callback), false); final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); if (serviceExists && sessionInfo != null) { sessionInfo.removeCallbackLocked(callback); @@ -187,7 +187,7 @@ public class AppPredictionPerUserService extends */ @GuardedBy("mLock") public void requestPredictionUpdateLocked(@NonNull AppPredictionSessionId sessionId) { - resolveService(sessionId, s -> s.requestPredictionUpdate(sessionId)); + resolveService(sessionId, s -> s.requestPredictionUpdate(sessionId), true); } /** @@ -196,7 +196,7 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") public void onDestroyPredictionSessionLocked(@NonNull AppPredictionSessionId sessionId) { final boolean serviceExists = resolveService(sessionId, s -> - s.onDestroyPredictionSession(sessionId)); + s.onDestroyPredictionSession(sessionId), false); final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); if (serviceExists && sessionInfo != null) { sessionInfo.destroy(); @@ -304,7 +304,8 @@ public class AppPredictionPerUserService extends @GuardedBy("mLock") @Nullable protected boolean resolveService(@NonNull final AppPredictionSessionId sessionId, - @NonNull final AbstractRemoteService.AsyncRequest<IPredictionService> cb) { + @NonNull final AbstractRemoteService.AsyncRequest<IPredictionService> cb, + boolean sendImmediately) { final AppPredictionSessionInfo sessionInfo = mSessionInfos.get(sessionId); if (sessionInfo == null) return false; if (sessionInfo.mUsesPeopleService) { @@ -322,7 +323,13 @@ public class AppPredictionPerUserService extends } else { final RemoteAppPredictionService service = getRemoteServiceLocked(); if (service != null) { - service.scheduleOnResolvedService(cb); + // TODO(b/155887722): implement a priority system so that latency-sensitive + // requests gets executed first. + if (sendImmediately) { + service.executeOnResolvedService(cb); + } else { + service.scheduleOnResolvedService(cb); + } } return service != null; } diff --git a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java index ceb1cafcebeb..a57ff11fa20f 100644 --- a/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java +++ b/services/appprediction/java/com/android/server/appprediction/RemoteAppPredictionService.java @@ -80,6 +80,13 @@ public class RemoteAppPredictionService extends } /** + * Execute async request on remote service immediately instead of sending it to Handler queue. + */ + public void executeOnResolvedService(@NonNull AsyncRequest<IPredictionService> request) { + executeAsyncRequest(request); + } + + /** * Failure callback */ public interface RemoteAppPredictionServiceCallbacks diff --git a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java index 3612e093c8bd..3282870fe281 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java +++ b/services/autofill/java/com/android/server/autofill/AutofillInlineSessionController.java @@ -17,17 +17,17 @@ package com.android.server.autofill; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.ComponentName; import android.os.Bundle; import android.os.Handler; import android.view.autofill.AutofillId; import android.view.inputmethod.InlineSuggestionsRequest; -import android.view.inputmethod.InlineSuggestionsResponse; import com.android.internal.annotations.GuardedBy; +import com.android.server.autofill.ui.InlineFillUi; import com.android.server.inputmethod.InputMethodManagerInternal; -import java.util.Collections; import java.util.Optional; import java.util.function.Consumer; @@ -46,8 +46,12 @@ final class AutofillInlineSessionController { @NonNull private final Handler mHandler; + @Nullable @GuardedBy("mLock") private AutofillInlineSuggestionsRequestSession mSession; + @Nullable + @GuardedBy("mLock") + private InlineFillUi mInlineFillUi; AutofillInlineSessionController(InputMethodManagerInternal inputMethodManagerInternal, int userId, ComponentName componentName, Handler handler, Object lock) { @@ -72,16 +76,16 @@ final class AutofillInlineSessionController { // TODO(b/151123764): rename the method to better reflect what it does. if (mSession != null) { // Send an empty response to IME and destroy the existing session. - mSession.onInlineSuggestionsResponseLocked(mSession.getAutofillIdLocked(), - new InlineSuggestionsResponse(Collections.EMPTY_LIST)); + mSession.onInlineSuggestionsResponseLocked( + InlineFillUi.emptyUi(mSession.getAutofillIdLocked())); mSession.destroySessionLocked(); + mInlineFillUi = null; } // TODO(b/151123764): consider reusing the same AutofillInlineSession object for the // same field. mSession = new AutofillInlineSuggestionsRequestSession(mInputMethodManagerInternal, mUserId, mComponentName, mHandler, mLock, autofillId, requestConsumer, uiExtras); mSession.onCreateInlineSuggestionsRequestLocked(); - } /** @@ -101,30 +105,63 @@ final class AutofillInlineSessionController { /** * Requests the IME to hide the current suggestions, if any. Returns true if the message is sent - * to the IME. + * to the IME. This only hides the UI temporarily. For example if user starts typing/deleting + * characters, new filterText will kick in and may revive the suggestion UI. */ @GuardedBy("mLock") boolean hideInlineSuggestionsUiLocked(@NonNull AutofillId autofillId) { if (mSession != null) { - return mSession.onInlineSuggestionsResponseLocked(autofillId, - new InlineSuggestionsResponse(Collections.EMPTY_LIST)); + return mSession.onInlineSuggestionsResponseLocked(InlineFillUi.emptyUi(autofillId)); + } + return false; + } + + /** + * Permanently delete the current inline fill UI. Notify the IME to hide the suggestions as + * well. + */ + @GuardedBy("mLock") + boolean deleteInlineFillUiLocked(@NonNull AutofillId autofillId) { + mInlineFillUi = null; + return hideInlineSuggestionsUiLocked(autofillId); + } + + /** + * Updates the inline fill UI with the filter text. It'll send updated inline suggestions to + * the IME. + */ + @GuardedBy("mLock") + boolean filterInlineFillUiLocked(@NonNull AutofillId autofillId, @Nullable String filterText) { + if (mInlineFillUi != null && mInlineFillUi.getAutofillId().equals(autofillId)) { + mInlineFillUi.setFilterText(filterText); + return requestImeToShowInlineSuggestionsLocked(); } return false; } /** - * Requests showing the inline suggestion in the IME when the IME becomes visible and is focused - * on the {@code autofillId}. + * Set the current inline fill UI. It'll request the IME to show the inline suggestions when + * the IME becomes visible and is focused on the {@code autofillId}. * - * @return false if there is no session, or if the IME callback is not available in the session. + * @return false if the suggestions are not sent to IME because there is no session, or if the + * IME callback is not available in the session. */ @GuardedBy("mLock") - boolean onInlineSuggestionsResponseLocked(@NonNull AutofillId autofillId, - @NonNull InlineSuggestionsResponse inlineSuggestionsResponse) { - // TODO(b/151123764): rename the method to better reflect what it does. - if (mSession != null) { - return mSession.onInlineSuggestionsResponseLocked(autofillId, - inlineSuggestionsResponse); + boolean setInlineFillUiLocked(@NonNull InlineFillUi inlineFillUi) { + mInlineFillUi = inlineFillUi; + return requestImeToShowInlineSuggestionsLocked(); + } + + /** + * Sends the suggestions from the current inline fill UI to the IME. + * + * @return false if the suggestions are not sent to IME because there is no session, or if the + * IME callback is not available in the session. + */ + @GuardedBy("mLock") + private boolean requestImeToShowInlineSuggestionsLocked() { + if (mSession != null && mInlineFillUi != null) { + return mSession.onInlineSuggestionsResponseLocked(mInlineFillUi); } return false; } diff --git a/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java b/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java index ce11c76e5c6a..0bf89936f2ce 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java +++ b/services/autofill/java/com/android/server/autofill/AutofillInlineSuggestionsRequestSession.java @@ -27,7 +27,6 @@ import android.content.ComponentName; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; -import android.util.Log; import android.util.Slog; import android.view.autofill.AutofillId; import android.view.inputmethod.InlineSuggestionsRequest; @@ -37,6 +36,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.view.IInlineSuggestionsRequestCallback; import com.android.internal.view.IInlineSuggestionsResponseCallback; import com.android.internal.view.InlineSuggestionsRequestInfo; +import com.android.server.autofill.ui.InlineFillUi; import com.android.server.inputmethod.InputMethodManagerInternal; import java.lang.ref.WeakReference; @@ -105,7 +105,7 @@ final class AutofillInlineSuggestionsRequestSession { private boolean mImeInputViewStarted; @GuardedBy("mLock") @Nullable - private InlineSuggestionsResponse mInlineSuggestionsResponse; + private InlineFillUi mInlineFillUi; @GuardedBy("mLock") private boolean mPreviousResponseIsNotEmpty; @@ -155,18 +155,20 @@ final class AutofillInlineSuggestionsRequestSession { * @return false if the IME callback is not available. */ @GuardedBy("mLock") - boolean onInlineSuggestionsResponseLocked(@NonNull AutofillId autofillId, - @NonNull InlineSuggestionsResponse inlineSuggestionsResponse) { + boolean onInlineSuggestionsResponseLocked(@NonNull InlineFillUi inlineFillUi) { if (mDestroyed) { return false; } - if (sDebug) Log.d(TAG, "onInlineSuggestionsResponseLocked called for:" + autofillId); + if (sDebug) { + Slog.d(TAG, + "onInlineSuggestionsResponseLocked called for:" + inlineFillUi.getAutofillId()); + } if (mImeRequest == null || mResponseCallback == null) { return false; } // TODO(b/151123764): each session should only correspond to one field. - mAutofillId = autofillId; - mInlineSuggestionsResponse = inlineSuggestionsResponse; + mAutofillId = inlineFillUi.getAutofillId(); + mInlineFillUi = inlineFillUi; maybeUpdateResponseToImeLocked(); return true; } @@ -190,12 +192,12 @@ final class AutofillInlineSuggestionsRequestSession { if (mDestroyed) { return; } - if (sDebug) Log.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId); + if (sDebug) Slog.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId); mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(mUserId, new InlineSuggestionsRequestInfo(mComponentName, mAutofillId, mUiExtras), new InlineSuggestionsRequestCallbackImpl(this)); mTimeoutCallback = () -> { - Log.w(TAG, "Timed out waiting for IME callback InlineSuggestionsRequest."); + Slog.w(TAG, "Timed out waiting for IME callback InlineSuggestionsRequest."); handleOnReceiveImeRequest(null, null); }; mHandler.postDelayed(mTimeoutCallback, CREATE_INLINE_SUGGESTIONS_REQUEST_TIMEOUT_MS); @@ -206,7 +208,7 @@ final class AutofillInlineSuggestionsRequestSession { */ @GuardedBy("mLock") private void maybeUpdateResponseToImeLocked() { - if (sVerbose) Log.v(TAG, "maybeUpdateResponseToImeLocked called"); + if (sVerbose) Slog.v(TAG, "maybeUpdateResponseToImeLocked called"); if (mDestroyed || mResponseCallback == null) { return; } @@ -216,18 +218,19 @@ final class AutofillInlineSuggestionsRequestSession { // Although the inline suggestions should disappear when IME hides which removes them // from the view hierarchy, but we still send an empty response to be extra safe. - if (sVerbose) Log.v(TAG, "Send empty inline response"); + if (sVerbose) Slog.v(TAG, "Send empty inline response"); updateResponseToImeUncheckLocked(new InlineSuggestionsResponse(Collections.EMPTY_LIST)); mPreviousResponseIsNotEmpty = false; - } else if (mImeInputViewStarted && mInlineSuggestionsResponse != null && match(mAutofillId, + } else if (mImeInputViewStarted && mInlineFillUi != null && match(mAutofillId, mImeCurrentFieldId)) { // 2. if IME is visible, and response is not null, send the response - boolean isEmptyResponse = mInlineSuggestionsResponse.getInlineSuggestions().isEmpty(); + InlineSuggestionsResponse response = mInlineFillUi.getInlineSuggestionsResponse(); + boolean isEmptyResponse = response.getInlineSuggestions().isEmpty(); if (isEmptyResponse && !mPreviousResponseIsNotEmpty) { // No-op if both the previous response and current response are empty. return; } - updateResponseToImeUncheckLocked(mInlineSuggestionsResponse); + updateResponseToImeUncheckLocked(response); mPreviousResponseIsNotEmpty = !isEmptyResponse; } } @@ -240,7 +243,7 @@ final class AutofillInlineSuggestionsRequestSession { if (mDestroyed) { return; } - if (sDebug) Log.d(TAG, "Send inline response: " + response.getInlineSuggestions().size()); + if (sDebug) Slog.d(TAG, "Send inline response: " + response.getInlineSuggestions().size()); try { mResponseCallback.onInlineSuggestionsResponse(mAutofillId, response); } catch (RemoteException e) { @@ -262,7 +265,7 @@ final class AutofillInlineSuggestionsRequestSession { mImeRequestReceived = true; if (mTimeoutCallback != null) { - if (sVerbose) Log.v(TAG, "removing timeout callback"); + if (sVerbose) Slog.v(TAG, "removing timeout callback"); mHandler.removeCallbacks(mTimeoutCallback); mTimeoutCallback = null; } @@ -333,7 +336,7 @@ final class AutofillInlineSuggestionsRequestSession { @BinderThread @Override public void onInlineSuggestionsUnsupported() throws RemoteException { - if (sDebug) Log.d(TAG, "onInlineSuggestionsUnsupported() called."); + if (sDebug) Slog.d(TAG, "onInlineSuggestionsUnsupported() called."); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( @@ -346,7 +349,7 @@ final class AutofillInlineSuggestionsRequestSession { @Override public void onInlineSuggestionsRequest(InlineSuggestionsRequest request, IInlineSuggestionsResponseCallback callback) { - if (sDebug) Log.d(TAG, "onInlineSuggestionsRequest() received: " + request); + if (sDebug) Slog.d(TAG, "onInlineSuggestionsRequest() received: " + request); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( @@ -357,7 +360,7 @@ final class AutofillInlineSuggestionsRequestSession { @Override public void onInputMethodStartInput(AutofillId imeFieldId) throws RemoteException { - if (sVerbose) Log.v(TAG, "onInputMethodStartInput() received on " + imeFieldId); + if (sVerbose) Slog.v(TAG, "onInputMethodStartInput() received on " + imeFieldId); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( @@ -369,14 +372,14 @@ final class AutofillInlineSuggestionsRequestSession { @Override public void onInputMethodShowInputRequested(boolean requestResult) throws RemoteException { if (sVerbose) { - Log.v(TAG, "onInputMethodShowInputRequested() received: " + requestResult); + Slog.v(TAG, "onInputMethodShowInputRequested() received: " + requestResult); } } @BinderThread @Override public void onInputMethodStartInputView() { - if (sVerbose) Log.v(TAG, "onInputMethodStartInputView() received"); + if (sVerbose) Slog.v(TAG, "onInputMethodStartInputView() received"); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( @@ -388,7 +391,7 @@ final class AutofillInlineSuggestionsRequestSession { @BinderThread @Override public void onInputMethodFinishInputView() { - if (sVerbose) Log.v(TAG, "onInputMethodFinishInputView() received"); + if (sVerbose) Slog.v(TAG, "onInputMethodFinishInputView() received"); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( @@ -399,7 +402,7 @@ final class AutofillInlineSuggestionsRequestSession { @Override public void onInputMethodFinishInput() throws RemoteException { - if (sVerbose) Log.v(TAG, "onInputMethodFinishInput() received"); + if (sVerbose) Slog.v(TAG, "onInputMethodFinishInput() received"); final AutofillInlineSuggestionsRequestSession session = mSession.get(); if (session != null) { session.mHandler.sendMessage(obtainMessage( diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 1bc026cd3b19..1aeb19bb4a9e 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -260,7 +260,7 @@ final class AutofillManagerServiceImpl if (isEnabledLocked()) return FLAG_ADD_CLIENT_ENABLED; // Check if it's enabled for augmented autofill - if (isAugmentedAutofillServiceAvailableLocked() + if (componentName != null && isAugmentedAutofillServiceAvailableLocked() && isWhitelistedForAugmentedAutofillLocked(componentName)) { return FLAG_ADD_CLIENT_ENABLED_FOR_AUGMENTED_AUTOFILL_ONLY; } diff --git a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java index 6cec8d82f9d4..851e4cc0bfd1 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteAugmentedAutofillService.java @@ -48,17 +48,15 @@ import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; import android.view.inputmethod.InlineSuggestionsRequest; -import android.view.inputmethod.InlineSuggestionsResponse; import com.android.internal.infra.AbstractRemoteService; import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.ServiceConnector; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.IResultReceiver; -import com.android.server.autofill.ui.InlineSuggestionFactory; +import com.android.server.autofill.ui.InlineFillUi; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.TimeUnit; @@ -149,7 +147,7 @@ final class RemoteAugmentedAutofillService int taskId, @NonNull ComponentName activityComponent, @NonNull AutofillId focusedId, @Nullable AutofillValue focusedValue, @Nullable InlineSuggestionsRequest inlineSuggestionsRequest, - @Nullable Function<InlineSuggestionsResponse, Boolean> inlineSuggestionsCallback, + @Nullable Function<InlineFillUi, Boolean> inlineSuggestionsCallback, @NonNull Runnable onErrorCallback, @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { long requestTime = SystemClock.elapsedRealtime(); @@ -173,7 +171,8 @@ final class RemoteAugmentedAutofillService mCallbacks.resetLastResponse(); maybeRequestShowInlineSuggestions(sessionId, inlineSuggestionsRequest, inlineSuggestionsData, - clientState, focusedId, inlineSuggestionsCallback, + clientState, focusedId, focusedValue, + inlineSuggestionsCallback, client, onErrorCallback, remoteRenderService); requestAutofill.complete(null); } @@ -239,8 +238,8 @@ final class RemoteAugmentedAutofillService private void maybeRequestShowInlineSuggestions(int sessionId, @Nullable InlineSuggestionsRequest request, @Nullable List<Dataset> inlineSuggestionsData, @Nullable Bundle clientState, - @NonNull AutofillId focusedId, - @Nullable Function<InlineSuggestionsResponse, Boolean> inlineSuggestionsCallback, + @NonNull AutofillId focusedId, @Nullable AutofillValue focusedValue, + @Nullable Function<InlineFillUi, Boolean> inlineSuggestionsCallback, @NonNull IAutoFillManagerClient client, @NonNull Runnable onErrorCallback, @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { if (inlineSuggestionsData == null || inlineSuggestionsData.isEmpty() @@ -250,10 +249,14 @@ final class RemoteAugmentedAutofillService } mCallbacks.setLastResponse(sessionId); - final InlineSuggestionsResponse inlineSuggestionsResponse = - InlineSuggestionFactory.createAugmentedInlineSuggestionsResponse( - request, inlineSuggestionsData, focusedId, - new InlineSuggestionFactory.InlineSuggestionUiCallback() { + final String filterText = + focusedValue != null && focusedValue.isText() + ? focusedValue.getTextValue().toString() : null; + + final InlineFillUi inlineFillUi = + InlineFillUi.forAugmentedAutofill( + request, inlineSuggestionsData, focusedId, filterText, + new InlineFillUi.InlineSuggestionUiCallback() { @Override public void autofill(Dataset dataset) { mCallbacks.logAugmentedAutofillSelected(sessionId, @@ -265,8 +268,8 @@ final class RemoteAugmentedAutofillService && fieldIds.get(0).equals(focusedId); client.autofill(sessionId, fieldIds, dataset.getFieldValues(), hideHighlight); - inlineSuggestionsCallback.apply(new InlineSuggestionsResponse( - Collections.EMPTY_LIST)); + inlineSuggestionsCallback.apply( + InlineFillUi.emptyUi(focusedId)); } catch (RemoteException e) { Slog.w(TAG, "Encounter exception autofilling the values"); } @@ -283,11 +286,7 @@ final class RemoteAugmentedAutofillService } }, onErrorCallback, remoteRenderService); - if (inlineSuggestionsResponse == null) { - Slog.w(TAG, "InlineSuggestionFactory created null response"); - return; - } - if (inlineSuggestionsCallback.apply(inlineSuggestionsResponse)) { + if (inlineSuggestionsCallback.apply(inlineFillUi)) { mCallbacks.logAugmentedAutofillShown(sessionId, clientState); } } diff --git a/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java b/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java index 255adcd92da3..617c111c6c38 100644 --- a/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java +++ b/services/autofill/java/com/android/server/autofill/RemoteInlineSuggestionRenderService.java @@ -47,7 +47,7 @@ public final class RemoteInlineSuggestionRenderService extends private static final String TAG = "RemoteInlineSuggestionRenderService"; - private final int mIdleUnbindTimeoutMs = 5000; + private final long mIdleUnbindTimeoutMs = PERMANENT_BOUND_TIMEOUT_MS; RemoteInlineSuggestionRenderService(Context context, ComponentName componentName, String serviceInterface, int userId, InlineSuggestionRenderCallbacks callback, diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 20d1b98f8647..ff4e7bac6cae 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -94,7 +94,6 @@ import android.view.autofill.AutofillValue; import android.view.autofill.IAutoFillManagerClient; import android.view.autofill.IAutofillWindowPresenter; import android.view.inputmethod.InlineSuggestionsRequest; -import android.view.inputmethod.InlineSuggestionsResponse; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; @@ -102,7 +101,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ArrayUtils; import com.android.server.autofill.ui.AutoFillUI; -import com.android.server.autofill.ui.InlineSuggestionFactory; +import com.android.server.autofill.ui.InlineFillUi; import com.android.server.autofill.ui.PendingUi; import com.android.server.inputmethod.InputMethodManagerInternal; @@ -2662,10 +2661,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } else if (viewState.id.equals(this.mCurrentViewId) && (viewState.getState() & ViewState.STATE_INLINE_SHOWN) != 0) { - requestShowInlineSuggestionsLocked(viewState.getResponse(), filterText); + if ((viewState.getState() & ViewState.STATE_INLINE_DISABLED) != 0) { + final FillResponse response = viewState.getResponse(); + if (response != null) { + response.getDatasets().clear(); + } + mInlineSessionController.deleteInlineFillUiLocked(viewState.id); + } else { + mInlineSessionController.filterInlineFillUiLocked(mCurrentViewId, filterText); + } } else if (viewState.id.equals(this.mCurrentViewId) && (viewState.getState() & ViewState.STATE_TRIGGERED_AUGMENTED_AUTOFILL) != 0) { if (!TextUtils.isEmpty(filterText)) { + // TODO: we should be able to replace this with controller#filterInlineFillUiLocked + // to accomplish filtering for augmented autofill. mInlineSessionController.hideInlineSuggestionsUiLocked(mCurrentViewId); } } @@ -2816,26 +2825,15 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState return false; } - final ViewState currentView = mViewStates.get(focusedId); - if ((currentView.getState() & ViewState.STATE_INLINE_DISABLED) != 0) { - response.getDatasets().clear(); - } - InlineSuggestionsResponse inlineSuggestionsResponse = - InlineSuggestionFactory.createInlineSuggestionsResponse( - inlineSuggestionsRequest.get(), response, filterText, focusedId, - this, () -> { - synchronized (mLock) { - mInlineSessionController.hideInlineSuggestionsUiLocked( - focusedId); - } - }, remoteRenderService); - if (inlineSuggestionsResponse == null) { - Slog.w(TAG, "InlineSuggestionFactory created null response"); - return false; - } - - return mInlineSessionController.onInlineSuggestionsResponseLocked(focusedId, - inlineSuggestionsResponse); + InlineFillUi inlineFillUi = InlineFillUi.forAutofill( + inlineSuggestionsRequest.get(), response, focusedId, filterText, + /*uiCallback*/this, /*onErrorCallback*/ () -> { + synchronized (mLock) { + mInlineSessionController.hideInlineSuggestionsUiLocked( + focusedId); + } + }, remoteRenderService); + return mInlineSessionController.setInlineFillUiLocked(inlineFillUi); } boolean isDestroyed() { @@ -3119,11 +3117,10 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final AutofillId focusedId = mCurrentViewId; - final Function<InlineSuggestionsResponse, Boolean> inlineSuggestionsResponseCallback = + final Function<InlineFillUi, Boolean> inlineSuggestionsResponseCallback = response -> { synchronized (mLock) { - return mInlineSessionController.onInlineSuggestionsResponseLocked( - focusedId, response); + return mInlineSessionController.setInlineFillUiLocked(response); } }; final Consumer<InlineSuggestionsRequest> requestAugmentedAutofill = diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index 344b92f43089..890208720f97 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -130,9 +130,9 @@ final class FillUi { } FillUi(@NonNull Context context, @NonNull FillResponse response, - @NonNull AutofillId focusedViewId, @NonNull @Nullable String filterText, - @NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel, - @NonNull Drawable serviceIcon, boolean nightMode, @NonNull Callback callback) { + @NonNull AutofillId focusedViewId, @Nullable String filterText, + @NonNull OverlayControl overlayControl, @NonNull CharSequence serviceLabel, + @NonNull Drawable serviceIcon, boolean nightMode, @NonNull Callback callback) { if (sVerbose) Slog.v(TAG, "nightMode: " + nightMode); mThemeId = nightMode ? THEME_ID_DARK : THEME_ID_LIGHT; mCallback = callback; diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineContentProviderImpl.java b/services/autofill/java/com/android/server/autofill/ui/InlineContentProviderImpl.java new file mode 100644 index 000000000000..7fbf4b9c590c --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/ui/InlineContentProviderImpl.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.autofill.ui; + +import static com.android.server.autofill.Helper.sVerbose; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.Handler; +import android.util.Slog; + +import com.android.internal.view.inline.IInlineContentCallback; +import com.android.internal.view.inline.IInlineContentProvider; +import com.android.server.FgThread; + +/** + * We create one instance of this class for each {@link android.view.inputmethod.InlineSuggestion} + * instance. Each inline suggestion instance will only be sent to the remote IME process once. In + * case of filtering and resending the suggestion when keyboard state changes between hide and + * show, a new instance of this class will be created using {@link #copy()}, with the same backing + * {@link RemoteInlineSuggestionUi}. When the + * {@link #provideContent(int, int, IInlineContentCallback)} is called the first time (it's only + * allowed to be called at most once), the passed in width/height is used to determine whether + * the existing {@link RemoteInlineSuggestionUi} provided in the constructor can be reused, or a + * new one should be created to suit the new size requirement for the view. In normal cases, + * we should not expect the size requirement to change, although in theory the public API allows + * the IME to do that. + * + * <p>This design is to enable us to be able to reuse the backing remote view while still keeping + * the callbacks relatively well aligned. For example, if we allow multiple remote IME binder + * callbacks to call into one instance of this class, then binder A may call in with width/height + * X for which we create a view (i.e. {@link RemoteInlineSuggestionUi}) for it, + * + * See also {@link RemoteInlineSuggestionUi} for relevant information. + */ +final class InlineContentProviderImpl extends IInlineContentProvider.Stub { + + // TODO(b/153615023): consider not holding strong reference to heavy objects in this stub, to + // avoid memory leak in case the client app is holding the remote reference for a longer + // time than expected. Essentially we need strong reference in the system process to + // the member variables, but weak reference to them in the IInlineContentProvider.Stub. + + private static final String TAG = InlineContentProviderImpl.class.getSimpleName(); + + private final Handler mHandler = FgThread.getHandler();; + + @NonNull + private final RemoteInlineSuggestionViewConnector mRemoteInlineSuggestionViewConnector; + @Nullable + private RemoteInlineSuggestionUi mRemoteInlineSuggestionUi; + + private boolean mProvideContentCalled = false; + + InlineContentProviderImpl( + @NonNull RemoteInlineSuggestionViewConnector remoteInlineSuggestionViewConnector, + @Nullable RemoteInlineSuggestionUi remoteInlineSuggestionUi) { + mRemoteInlineSuggestionViewConnector = remoteInlineSuggestionViewConnector; + mRemoteInlineSuggestionUi = remoteInlineSuggestionUi; + } + + /** + * Returns a new instance of this class, with the same {@code mInlineSuggestionRenderer} and + * {@code mRemoteInlineSuggestionUi}. The latter may or may not be reusable depending on the + * size information provided when the client calls {@link #provideContent(int, int, + * IInlineContentCallback)}. + */ + @NonNull + public InlineContentProviderImpl copy() { + return new InlineContentProviderImpl(mRemoteInlineSuggestionViewConnector, + mRemoteInlineSuggestionUi); + } + + /** + * Provides a SurfacePackage associated with the inline suggestion view to the IME. If such + * view doesn't exit, then create a new one. This method should be called once per lifecycle + * of this object. Any further calls to the method will be ignored. + */ + @Override + public void provideContent(int width, int height, IInlineContentCallback callback) { + mHandler.post(() -> handleProvideContent(width, height, callback)); + } + + @Override + public void requestSurfacePackage() { + mHandler.post(this::handleGetSurfacePackage); + } + + @Override + public void onSurfacePackageReleased() { + mHandler.post(this::handleOnSurfacePackageReleased); + } + + private void handleProvideContent(int width, int height, IInlineContentCallback callback) { + if (sVerbose) Slog.v(TAG, "handleProvideContent"); + if (mProvideContentCalled) { + // This method should only be called once. + return; + } + mProvideContentCalled = true; + if (mRemoteInlineSuggestionUi == null || !mRemoteInlineSuggestionUi.match(width, height)) { + mRemoteInlineSuggestionUi = new RemoteInlineSuggestionUi( + mRemoteInlineSuggestionViewConnector, + width, height, mHandler); + } + mRemoteInlineSuggestionUi.setInlineContentCallback(callback); + mRemoteInlineSuggestionUi.requestSurfacePackage(); + } + + private void handleGetSurfacePackage() { + if (sVerbose) Slog.v(TAG, "handleGetSurfacePackage"); + if (!mProvideContentCalled || mRemoteInlineSuggestionUi == null) { + // provideContent should be called first, and remote UI should not be null. + return; + } + mRemoteInlineSuggestionUi.requestSurfacePackage(); + } + + private void handleOnSurfacePackageReleased() { + if (sVerbose) Slog.v(TAG, "handleOnSurfacePackageReleased"); + if (!mProvideContentCalled || mRemoteInlineSuggestionUi == null) { + // provideContent should be called first, and remote UI should not be null. + return; + } + mRemoteInlineSuggestionUi.surfacePackageReleased(); + } +} diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineFillUi.java b/services/autofill/java/com/android/server/autofill/ui/InlineFillUi.java new file mode 100644 index 000000000000..652252220c1a --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/ui/InlineFillUi.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.autofill.ui; + +import static com.android.server.autofill.Helper.sVerbose; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Intent; +import android.content.IntentSender; +import android.service.autofill.Dataset; +import android.service.autofill.FillResponse; +import android.service.autofill.InlinePresentation; +import android.text.TextUtils; +import android.util.Pair; +import android.util.Slog; +import android.util.SparseArray; +import android.view.autofill.AutofillId; +import android.view.autofill.AutofillValue; +import android.view.inputmethod.InlineSuggestion; +import android.view.inputmethod.InlineSuggestionsRequest; +import android.view.inputmethod.InlineSuggestionsResponse; + +import com.android.internal.view.inline.IInlineContentProvider; +import com.android.server.autofill.RemoteInlineSuggestionRenderService; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; + + +/** + * UI for a particular field (i.e. {@link AutofillId}) based on an inline autofill response from + * the autofill service or the augmented autofill service. It wraps multiple inline suggestions. + * + * <p> This class is responsible for filtering the suggestions based on the filtered text. + * It'll create {@link InlineSuggestion} instances by reusing the backing remote views (from the + * renderer service) if possible. + */ +public final class InlineFillUi { + + private static final String TAG = "InlineFillUi"; + + /** + * The id of the field which the current Ui is for. + */ + @NonNull + final AutofillId mAutofillId; + + /** + * The list of inline suggestions, before applying any filtering + */ + @NonNull + private final ArrayList<InlineSuggestion> mInlineSuggestions; + + /** + * The corresponding data sets for the inline suggestions. The list may be null if the current + * Ui is the authentication UI for the response. If non-null, the size of data sets should equal + * that of inline suggestions. + */ + @Nullable + private final ArrayList<Dataset> mDatasets; + + /** + * The filter text which will be applied on the inline suggestion list before they are returned + * as a response. + */ + @Nullable + private String mFilterText; + + /** + * Returns an empty inline autofill UI. + */ + @NonNull + public static InlineFillUi emptyUi(@NonNull AutofillId autofillId) { + return new InlineFillUi(autofillId, new SparseArray<>(), null); + } + + /** + * Returns an inline autofill UI for a field based on an Autofilll response. + */ + @NonNull + public static InlineFillUi forAutofill(@NonNull InlineSuggestionsRequest request, + @NonNull FillResponse response, + @NonNull AutofillId focusedViewId, @Nullable String filterText, + @NonNull AutoFillUI.AutoFillUiCallback uiCallback, + @NonNull Runnable onErrorCallback, + @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { + + if (InlineSuggestionFactory.responseNeedAuthentication(response)) { + InlineSuggestion inlineAuthentication = + InlineSuggestionFactory.createInlineAuthentication(request, response, + focusedViewId, uiCallback, onErrorCallback, remoteRenderService); + return new InlineFillUi(focusedViewId, inlineAuthentication, filterText); + } else if (response.getDatasets() != null) { + SparseArray<Pair<Dataset, InlineSuggestion>> inlineSuggestions = + InlineSuggestionFactory.createAutofillInlineSuggestions(request, + response.getRequestId(), + response.getDatasets(), focusedViewId, uiCallback, onErrorCallback, + remoteRenderService); + return new InlineFillUi(focusedViewId, inlineSuggestions, filterText); + } + return new InlineFillUi(focusedViewId, new SparseArray<>(), filterText); + } + + /** + * Returns an inline autofill UI for a field based on an Autofilll response. + */ + @NonNull + public static InlineFillUi forAugmentedAutofill(@NonNull InlineSuggestionsRequest request, + @NonNull List<Dataset> datasets, + @NonNull AutofillId focusedViewId, @Nullable String filterText, + @NonNull InlineSuggestionUiCallback uiCallback, + @NonNull Runnable onErrorCallback, + @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { + SparseArray<Pair<Dataset, InlineSuggestion>> inlineSuggestions = + InlineSuggestionFactory.createAugmentedAutofillInlineSuggestions(request, datasets, + focusedViewId, + uiCallback, onErrorCallback, remoteRenderService); + return new InlineFillUi(focusedViewId, inlineSuggestions, filterText); + } + + InlineFillUi(@NonNull AutofillId autofillId, + @NonNull SparseArray<Pair<Dataset, InlineSuggestion>> inlineSuggestions, + @Nullable String filterText) { + mAutofillId = autofillId; + int size = inlineSuggestions.size(); + mDatasets = new ArrayList<>(size); + mInlineSuggestions = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + Pair<Dataset, InlineSuggestion> value = inlineSuggestions.valueAt(i); + mDatasets.add(value.first); + mInlineSuggestions.add(value.second); + } + mFilterText = filterText; + } + + InlineFillUi(@NonNull AutofillId autofillId, InlineSuggestion inlineSuggestion, + @Nullable String filterText) { + mAutofillId = autofillId; + mDatasets = null; + mInlineSuggestions = new ArrayList<>(); + mInlineSuggestions.add(inlineSuggestion); + mFilterText = filterText; + } + + @NonNull + public AutofillId getAutofillId() { + return mAutofillId; + } + + public void setFilterText(@Nullable String filterText) { + mFilterText = filterText; + } + + /** + * Returns the list of filtered inline suggestions suitable for being sent to the IME. + */ + @NonNull + public InlineSuggestionsResponse getInlineSuggestionsResponse() { + final int size = mInlineSuggestions.size(); + if (size == 0) { + return new InlineSuggestionsResponse(Collections.emptyList()); + } + final List<InlineSuggestion> inlineSuggestions = new ArrayList<>(); + if (mDatasets == null || mDatasets.size() != size) { + // authentication case + for (int i = 0; i < size; i++) { + inlineSuggestions.add(copy(i, mInlineSuggestions.get(i))); + } + return new InlineSuggestionsResponse(inlineSuggestions); + } + for (int i = 0; i < size; i++) { + final Dataset dataset = mDatasets.get(i); + final int fieldIndex = dataset.getFieldIds().indexOf(mAutofillId); + if (fieldIndex < 0) { + Slog.w(TAG, "AutofillId=" + mAutofillId + " not found in dataset"); + continue; + } + final InlinePresentation inlinePresentation = dataset.getFieldInlinePresentation( + fieldIndex); + if (inlinePresentation == null) { + Slog.w(TAG, "InlinePresentation not found in dataset"); + continue; + } + if (!inlinePresentation.isPinned() // don't filter pinned suggestions + && !includeDataset(dataset, fieldIndex, mFilterText)) { + continue; + } + inlineSuggestions.add(copy(i, mInlineSuggestions.get(i))); + } + return new InlineSuggestionsResponse(inlineSuggestions); + } + + /** + * Returns a copy of the suggestion, that internally copies the {@link IInlineContentProvider} + * so that it's not reused by the remote IME process across different inline suggestions. + * See {@link InlineContentProviderImpl} for why this is needed. + * + * <p>Note that although it copies the {@link IInlineContentProvider}, the underlying remote + * view (in the renderer service) is still reused. + */ + @NonNull + private InlineSuggestion copy(int index, @NonNull InlineSuggestion inlineSuggestion) { + final IInlineContentProvider contentProvider = inlineSuggestion.getContentProvider(); + if (contentProvider instanceof InlineContentProviderImpl) { + // We have to create a new inline suggestion instance to ensure we don't reuse the + // same {@link IInlineContentProvider}, but the underlying views are reused when + // calling {@link InlineContentProviderImpl#copy()}. + InlineSuggestion newInlineSuggestion = new InlineSuggestion(inlineSuggestion + .getInfo(), ((InlineContentProviderImpl) contentProvider).copy()); + // The remote view is only set when the content provider is called to inflate the view, + // which happens after it's sent to the IME (i.e. not now), so we keep the latest + // content provider (through newInlineSuggestion) to make sure the next time we copy it, + // we get to reuse the view. + mInlineSuggestions.set(index, newInlineSuggestion); + return newInlineSuggestion; + } + return inlineSuggestion; + } + + // TODO: Extract the shared filtering logic here and in FillUi to a common method. + private static boolean includeDataset(Dataset dataset, int fieldIndex, + @Nullable String filterText) { + // Show everything when the user input is empty. + if (TextUtils.isEmpty(filterText)) { + return true; + } + + final String constraintLowerCase = filterText.toString().toLowerCase(); + + // Use the filter provided by the service, if available. + final Dataset.DatasetFieldFilter filter = dataset.getFilter(fieldIndex); + if (filter != null) { + Pattern filterPattern = filter.pattern; + if (filterPattern == null) { + if (sVerbose) { + Slog.v(TAG, "Explicitly disabling filter for dataset id" + dataset.getId()); + } + return true; + } + return filterPattern.matcher(constraintLowerCase).matches(); + } + + final AutofillValue value = dataset.getFieldValues().get(fieldIndex); + if (value == null || !value.isText()) { + return dataset.getAuthentication() != null; + } + final String valueText = value.getTextValue().toString().toLowerCase(); + return valueText.toLowerCase().startsWith(constraintLowerCase); + } + + /** + * Callback from the inline suggestion Ui. + */ + public interface InlineSuggestionUiCallback { + /** + * Callback to autofill a dataset to the client app. + */ + void autofill(@NonNull Dataset dataset); + + /** + * Callback to start Intent in client app. + */ + void startIntentSender(@NonNull IntentSender intentSender, @NonNull Intent intent); + } +} diff --git a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java index 79c9efa48d73..089eeb2aa086 100644 --- a/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java +++ b/services/autofill/java/com/android/server/autofill/ui/InlineSuggestionFactory.java @@ -17,59 +17,57 @@ package com.android.server.autofill.ui; import static com.android.server.autofill.Helper.sDebug; -import static com.android.server.autofill.Helper.sVerbose; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Intent; import android.content.IntentSender; import android.os.IBinder; -import android.os.RemoteException; import android.service.autofill.Dataset; import android.service.autofill.FillResponse; -import android.service.autofill.IInlineSuggestionUiCallback; import android.service.autofill.InlinePresentation; -import android.text.TextUtils; +import android.util.Pair; import android.util.Slog; -import android.view.SurfaceControlViewHost; +import android.util.SparseArray; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; -import android.view.autofill.AutofillValue; import android.view.inputmethod.InlineSuggestion; import android.view.inputmethod.InlineSuggestionInfo; import android.view.inputmethod.InlineSuggestionsRequest; import android.view.inputmethod.InlineSuggestionsResponse; import android.widget.inline.InlinePresentationSpec; -import com.android.internal.view.inline.IInlineContentCallback; import com.android.internal.view.inline.IInlineContentProvider; -import com.android.server.LocalServices; -import com.android.server.UiThread; import com.android.server.autofill.RemoteInlineSuggestionRenderService; -import com.android.server.inputmethod.InputMethodManagerInternal; -import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.regex.Pattern; -public final class InlineSuggestionFactory { +final class InlineSuggestionFactory { private static final String TAG = "InlineSuggestionFactory"; - /** - * Callback from the inline suggestion Ui. - */ - public interface InlineSuggestionUiCallback { - /** - * Callback to autofill a dataset to the client app. - */ - void autofill(@NonNull Dataset dataset); + public static boolean responseNeedAuthentication(@NonNull FillResponse response) { + return response.getAuthentication() != null && response.getInlinePresentation() != null; + } - /** - * Callback to start Intent in client app. - */ - void startIntentSender(@NonNull IntentSender intentSender, @NonNull Intent intent); + public static InlineSuggestion createInlineAuthentication( + @NonNull InlineSuggestionsRequest request, @NonNull FillResponse response, + @NonNull AutofillId autofillId, + @NonNull AutoFillUI.AutoFillUiCallback client, @NonNull Runnable onErrorCallback, + @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { + final BiConsumer<Dataset, Integer> onClickFactory = (dataset, datasetIndex) -> { + client.requestHideFillUi(autofillId); + client.authenticate(response.getRequestId(), + datasetIndex, response.getAuthentication(), response.getClientState(), + /* authenticateInline= */ true); + }; + final Consumer<IntentSender> intentSenderConsumer = (intentSender) -> + client.startIntentSender(intentSender, new Intent()); + InlinePresentation inlineAuthentication = response.getInlinePresentation(); + return createInlineAuthSuggestion(inlineAuthentication, + remoteRenderService, onClickFactory, onErrorCallback, intentSenderConsumer, + request.getHostInputToken(), request.getHostDisplayId()); } /** @@ -77,33 +75,23 @@ public final class InlineSuggestionFactory { * autofill service, potentially filtering the datasets. */ @Nullable - public static InlineSuggestionsResponse createInlineSuggestionsResponse( - @NonNull InlineSuggestionsRequest request, @NonNull FillResponse response, - @Nullable String filterText, @NonNull AutofillId autofillId, + public static SparseArray<Pair<Dataset, InlineSuggestion>> createAutofillInlineSuggestions( + @NonNull InlineSuggestionsRequest request, int requestId, + @NonNull List<Dataset> datasets, + @NonNull AutofillId autofillId, @NonNull AutoFillUI.AutoFillUiCallback client, @NonNull Runnable onErrorCallback, @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { if (sDebug) Slog.d(TAG, "createInlineSuggestionsResponse called"); - final BiConsumer<Dataset, Integer> onClickFactory; - if (response.getAuthentication() != null) { - onClickFactory = (dataset, datasetIndex) -> { - client.requestHideFillUi(autofillId); - client.authenticate(response.getRequestId(), - datasetIndex, response.getAuthentication(), response.getClientState(), - /* authenticateInline= */ true); - }; - } else { - onClickFactory = (dataset, datasetIndex) -> { - client.requestHideFillUi(autofillId); - client.fill(response.getRequestId(), datasetIndex, dataset); - }; - } + final Consumer<IntentSender> intentSenderConsumer = (intentSender) -> + client.startIntentSender(intentSender, new Intent()); + final BiConsumer<Dataset, Integer> onClickFactory = (dataset, datasetIndex) -> { + client.requestHideFillUi(autofillId); + client.fill(requestId, datasetIndex, dataset); + }; - final InlinePresentation inlineAuthentication = - response.getAuthentication() == null ? null : response.getInlinePresentation(); - return createInlineSuggestionsResponseInternal(/* isAugmented= */ false, request, - response.getDatasets(), filterText, inlineAuthentication, autofillId, - onErrorCallback, onClickFactory, (intentSender) -> - client.startIntentSender(intentSender, new Intent()), remoteRenderService); + return createInlineSuggestionsInternal(/* isAugmented= */ false, request, + datasets, autofillId, + onErrorCallback, onClickFactory, intentSenderConsumer, remoteRenderService); } /** @@ -111,16 +99,16 @@ public final class InlineSuggestionFactory { * autofill service. */ @Nullable - public static InlineSuggestionsResponse createAugmentedInlineSuggestionsResponse( + public static SparseArray<Pair<Dataset, InlineSuggestion>> + createAugmentedAutofillInlineSuggestions( @NonNull InlineSuggestionsRequest request, @NonNull List<Dataset> datasets, @NonNull AutofillId autofillId, - @NonNull InlineSuggestionUiCallback inlineSuggestionUiCallback, + @NonNull InlineFillUi.InlineSuggestionUiCallback inlineSuggestionUiCallback, @NonNull Runnable onErrorCallback, @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { if (sDebug) Slog.d(TAG, "createAugmentedInlineSuggestionsResponse called"); - return createInlineSuggestionsResponseInternal(/* isAugmented= */ true, request, - datasets, /* filterText= */ null, /* inlineAuthentication= */ null, - autofillId, onErrorCallback, + return createInlineSuggestionsInternal(/* isAugmented= */ true, request, + datasets, autofillId, onErrorCallback, (dataset, datasetIndex) -> inlineSuggestionUiCallback.autofill(dataset), (intentSender) -> @@ -129,29 +117,13 @@ public final class InlineSuggestionFactory { } @Nullable - private static InlineSuggestionsResponse createInlineSuggestionsResponseInternal( + private static SparseArray<Pair<Dataset, InlineSuggestion>> createInlineSuggestionsInternal( boolean isAugmented, @NonNull InlineSuggestionsRequest request, - @Nullable List<Dataset> datasets, @Nullable String filterText, - @Nullable InlinePresentation inlineAuthentication, @NonNull AutofillId autofillId, + @NonNull List<Dataset> datasets, @NonNull AutofillId autofillId, @NonNull Runnable onErrorCallback, @NonNull BiConsumer<Dataset, Integer> onClickFactory, @NonNull Consumer<IntentSender> intentSenderConsumer, @Nullable RemoteInlineSuggestionRenderService remoteRenderService) { - - final ArrayList<InlineSuggestion> inlineSuggestions = new ArrayList<>(); - if (inlineAuthentication != null) { - InlineSuggestion inlineAuthSuggestion = createInlineAuthSuggestion(inlineAuthentication, - remoteRenderService, onClickFactory, onErrorCallback, intentSenderConsumer, - request.getHostInputToken(), request.getHostDisplayId()); - inlineSuggestions.add(inlineAuthSuggestion); - - return new InlineSuggestionsResponse(inlineSuggestions); - } - - if (datasets == null) { - Slog.w(TAG, "Datasets should not be null here"); - return null; - } - + SparseArray<Pair<Dataset, InlineSuggestion>> response = new SparseArray<>(datasets.size()); for (int datasetIndex = 0; datasetIndex < datasets.size(); datasetIndex++) { final Dataset dataset = datasets.get(datasetIndex); final int fieldIndex = dataset.getFieldIds().indexOf(autofillId); @@ -165,50 +137,14 @@ public final class InlineSuggestionFactory { Slog.w(TAG, "InlinePresentation not found in dataset"); continue; } - if (!inlinePresentation.isPinned() // don't filter pinned suggestions - && !includeDataset(dataset, fieldIndex, filterText)) { - continue; - } InlineSuggestion inlineSuggestion = createInlineSuggestion(isAugmented, dataset, datasetIndex, mergedInlinePresentation(request, datasetIndex, inlinePresentation), onClickFactory, remoteRenderService, onErrorCallback, intentSenderConsumer, request.getHostInputToken(), request.getHostDisplayId()); - - inlineSuggestions.add(inlineSuggestion); - } - return new InlineSuggestionsResponse(inlineSuggestions); - } - - // TODO: Extract the shared filtering logic here and in FillUi to a common method. - private static boolean includeDataset(Dataset dataset, int fieldIndex, - @Nullable String filterText) { - // Show everything when the user input is empty. - if (TextUtils.isEmpty(filterText)) { - return true; + response.append(datasetIndex, Pair.create(dataset, inlineSuggestion)); } - - final String constraintLowerCase = filterText.toString().toLowerCase(); - - // Use the filter provided by the service, if available. - final Dataset.DatasetFieldFilter filter = dataset.getFilter(fieldIndex); - if (filter != null) { - Pattern filterPattern = filter.pattern; - if (filterPattern == null) { - if (sVerbose) { - Slog.v(TAG, "Explicitly disabling filter for dataset id" + dataset.getId()); - } - return true; - } - return filterPattern.matcher(constraintLowerCase).matches(); - } - - final AutofillValue value = dataset.getFieldValues().get(fieldIndex); - if (value == null || !value.isText()) { - return dataset.getAuthentication() == null; - } - final String valueText = value.getTextValue().toString().toLowerCase(); - return valueText.toLowerCase().startsWith(constraintLowerCase); + return response; } private static InlineSuggestion createInlineSuggestion(boolean isAugmented, @@ -276,78 +212,20 @@ public final class InlineSuggestionFactory { inlinePresentation.isPinned()); } - private static IInlineContentProvider.Stub createInlineContentProvider( + private static IInlineContentProvider createInlineContentProvider( @NonNull InlinePresentation inlinePresentation, @Nullable Runnable onClickAction, @NonNull Runnable onErrorCallback, @NonNull Consumer<IntentSender> intentSenderConsumer, @Nullable RemoteInlineSuggestionRenderService remoteRenderService, @Nullable IBinder hostInputToken, int displayId) { - return new IInlineContentProvider.Stub() { - @Override - public void provideContent(int width, int height, IInlineContentCallback callback) { - UiThread.getHandler().post(() -> { - final IInlineSuggestionUiCallback uiCallback = createInlineSuggestionUiCallback( - callback, onClickAction, onErrorCallback, intentSenderConsumer); - - if (remoteRenderService == null) { - Slog.e(TAG, "RemoteInlineSuggestionRenderService is null"); - return; - } - - remoteRenderService.renderSuggestion(uiCallback, inlinePresentation, - width, height, hostInputToken, displayId); - }); - } - }; - } - - private static IInlineSuggestionUiCallback.Stub createInlineSuggestionUiCallback( - @NonNull IInlineContentCallback callback, @NonNull Runnable onAutofillCallback, - @NonNull Runnable onErrorCallback, - @NonNull Consumer<IntentSender> intentSenderConsumer) { - return new IInlineSuggestionUiCallback.Stub() { - @Override - public void onClick() throws RemoteException { - onAutofillCallback.run(); - callback.onClick(); - } - - @Override - public void onLongClick() throws RemoteException { - callback.onLongClick(); - } - - @Override - public void onContent(SurfaceControlViewHost.SurfacePackage surface, int width, - int height) - throws RemoteException { - callback.onContent(surface, width, height); - surface.release(); - } - - @Override - public void onError() throws RemoteException { - onErrorCallback.run(); - } - - @Override - public void onTransferTouchFocusToImeWindow(IBinder sourceInputToken, int displayId) - throws RemoteException { - final InputMethodManagerInternal inputMethodManagerInternal = - LocalServices.getService(InputMethodManagerInternal.class); - if (!inputMethodManagerInternal.transferTouchFocusToImeWindow(sourceInputToken, - displayId)) { - Slog.e(TAG, "Cannot transfer touch focus from suggestion to IME"); - onErrorCallback.run(); - } - } - - @Override - public void onStartIntentSender(IntentSender intentSender) { - intentSenderConsumer.accept(intentSender); - } - }; + RemoteInlineSuggestionViewConnector + remoteInlineSuggestionViewConnector = new RemoteInlineSuggestionViewConnector( + remoteRenderService, inlinePresentation, hostInputToken, displayId, onClickAction, + onErrorCallback, intentSenderConsumer); + InlineContentProviderImpl inlineContentProvider = new InlineContentProviderImpl( + remoteInlineSuggestionViewConnector, null); + return inlineContentProvider; } private InlineSuggestionFactory() { diff --git a/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionUi.java b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionUi.java new file mode 100644 index 000000000000..368f71760b0d --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionUi.java @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.autofill.ui; + +import static com.android.server.autofill.Helper.sDebug; +import static com.android.server.autofill.Helper.sVerbose; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.IntentSender; +import android.os.Handler; +import android.os.IBinder; +import android.os.RemoteException; +import android.service.autofill.IInlineSuggestionUi; +import android.service.autofill.IInlineSuggestionUiCallback; +import android.service.autofill.ISurfacePackageResultCallback; +import android.util.Slog; +import android.view.SurfaceControlViewHost; + +import com.android.internal.view.inline.IInlineContentCallback; + +/** + * The instance of this class lives in the system server, orchestrating the communication between + * the remote process owning embedded view (i.e. ExtServices) and the remote process hosting the + * embedded view (i.e. IME). It's also responsible for releasing the embedded view from the owning + * process when it's not longer needed in the hosting process. + * + * <p>An instance of this class may be reused to associate with multiple instances of + * {@link InlineContentProviderImpl}s, each of which wraps a callback from the IME. But at any + * given time, there is only one active IME callback which this class will callback into. + * + * <p>This class is thread safe, because all the outside calls are piped into a single handler + * thread to be processed. + */ +final class RemoteInlineSuggestionUi { + + private static final String TAG = RemoteInlineSuggestionUi.class.getSimpleName(); + + // The delay time to release the remote inline suggestion view (in the renderer + // process) after receiving a signal about the surface package being released due to being + // detached from the window in the host app (in the IME process). The release will be + // canceled if the host app reattaches the view to a window within this delay time. + // TODO(b/154683107): try out using the Chroreographer to schedule the release right at the + // next frame. Basically if the view is not re-attached to the window immediately in the next + // frame after it was detached, then it will be released. + private static final long RELEASE_REMOTE_VIEW_HOST_DELAY_MS = 200; + + @NonNull + private final Handler mHandler; + @NonNull + private final RemoteInlineSuggestionViewConnector mRemoteInlineSuggestionViewConnector; + private final int mWidth; + private final int mHeight; + @NonNull + private final InlineSuggestionUiCallbackImpl mInlineSuggestionUiCallback; + + @Nullable + private IInlineContentCallback mInlineContentCallback; // from IME + + /** + * Remote inline suggestion view, backed by an instance of {@link SurfaceControlViewHost} in + * the render service process. We takes care of releasing it when there is no remote + * reference to it (from IME), and we will create a new instance of the view when it's needed + * by IME again. + */ + @Nullable + private IInlineSuggestionUi mInlineSuggestionUi; + private int mRefCount = 0; + private boolean mWaitingForUiCreation = false; + private int mActualWidth; + private int mActualHeight; + + @Nullable + private Runnable mDelayedReleaseViewRunnable; + + RemoteInlineSuggestionUi( + @NonNull RemoteInlineSuggestionViewConnector remoteInlineSuggestionViewConnector, + int width, int height, Handler handler) { + mHandler = handler; + mRemoteInlineSuggestionViewConnector = remoteInlineSuggestionViewConnector; + mWidth = width; + mHeight = height; + mInlineSuggestionUiCallback = new InlineSuggestionUiCallbackImpl(); + } + + /** + * Updates the callback from the IME process. It'll swap out the previous IME callback, and + * all the subsequent callback events (onClick, onLongClick, touch event transfer, etc) will + * be directed to the new callback. + */ + void setInlineContentCallback(@NonNull IInlineContentCallback inlineContentCallback) { + mHandler.post(() -> { + mInlineContentCallback = inlineContentCallback; + }); + } + + /** + * Handles the request from the IME process to get a new surface package. May create a new + * view in the renderer process if the existing view is already released. + */ + void requestSurfacePackage() { + mHandler.post(this::handleRequestSurfacePackage); + } + + /** + * Handles the signal from the IME process that the previously sent surface package has been + * released. + */ + void surfacePackageReleased() { + mHandler.post(() -> handleUpdateRefCount(-1)); + } + + /** + * Returns true if the provided size matches the remote view's size. + */ + boolean match(int width, int height) { + return mWidth == width && mHeight == height; + } + + private void handleRequestSurfacePackage() { + cancelPendingReleaseViewRequest(); + + if (mInlineSuggestionUi == null) { + if (mWaitingForUiCreation) { + // This could happen in the following case: the remote embedded view was released + // when previously detached from window. An event after that to re-attached to + // the window will cause us calling the renderSuggestion again. Now, before the + // render call returns a new surface package, if the view is detached and + // re-attached to the window, causing this method to be called again, we will get + // to this state. This request will be ignored and the surface package will still + // be sent back once the view is rendered. + if (sDebug) Slog.d(TAG, "Inline suggestion ui is not ready"); + } else { + mRemoteInlineSuggestionViewConnector.renderSuggestion(mWidth, mHeight, + mInlineSuggestionUiCallback); + mWaitingForUiCreation = true; + } + } else { + try { + mInlineSuggestionUi.getSurfacePackage(new ISurfacePackageResultCallback.Stub() { + @Override + public void onResult(SurfaceControlViewHost.SurfacePackage result) { + mHandler.post(() -> { + if (sVerbose) Slog.v(TAG, "Sending refreshed SurfacePackage to IME"); + try { + mInlineContentCallback.onContent(result, mActualWidth, + mActualHeight); + handleUpdateRefCount(1); + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling onContent"); + } + }); + } + }); + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling getSurfacePackage."); + } + } + } + + private void handleUpdateRefCount(int delta) { + cancelPendingReleaseViewRequest(); + mRefCount += delta; + if (mRefCount <= 0) { + mDelayedReleaseViewRunnable = () -> { + if (mInlineSuggestionUi != null) { + try { + if (sVerbose) Slog.v(TAG, "releasing the host"); + mInlineSuggestionUi.releaseSurfaceControlViewHost(); + mInlineSuggestionUi = null; + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling releaseSurfaceControlViewHost"); + } + } + mDelayedReleaseViewRunnable = null; + }; + mHandler.postDelayed(mDelayedReleaseViewRunnable, RELEASE_REMOTE_VIEW_HOST_DELAY_MS); + } + } + + private void cancelPendingReleaseViewRequest() { + if (mDelayedReleaseViewRunnable != null) { + mHandler.removeCallbacks(mDelayedReleaseViewRunnable); + mDelayedReleaseViewRunnable = null; + } + } + + /** + * This is called when a new inline suggestion UI is inflated from the ext services. + */ + private void handleInlineSuggestionUiReady(IInlineSuggestionUi content, + SurfaceControlViewHost.SurfacePackage surfacePackage, int width, int height) { + mInlineSuggestionUi = content; + mRefCount = 0; + mWaitingForUiCreation = false; + mActualWidth = width; + mActualHeight = height; + if (mInlineContentCallback != null) { + try { + if (sVerbose) Slog.v(TAG, "Sending new UI content to IME"); + handleUpdateRefCount(1); + mInlineContentCallback.onContent(surfacePackage, mActualWidth, mActualHeight); + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling onContent"); + } + } + if (surfacePackage != null) { + surfacePackage.release(); + } + } + + private void handleOnClick() { + // Autofill the value + mRemoteInlineSuggestionViewConnector.onClick(); + + // Notify the remote process (IME) that hosts the embedded UI that it's clicked + if (mInlineContentCallback != null) { + try { + mInlineContentCallback.onClick(); + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling onClick"); + } + } + } + + private void handleOnLongClick() { + // Notify the remote process (IME) that hosts the embedded UI that it's long clicked + if (mInlineContentCallback != null) { + try { + mInlineContentCallback.onLongClick(); + } catch (RemoteException e) { + Slog.w(TAG, "RemoteException calling onLongClick"); + } + } + } + + private void handleOnError() { + mRemoteInlineSuggestionViewConnector.onError(); + } + + private void handleOnTransferTouchFocusToImeWindow(IBinder sourceInputToken, int displayId) { + mRemoteInlineSuggestionViewConnector.onTransferTouchFocusToImeWindow(sourceInputToken, + displayId); + } + + private void handleOnStartIntentSender(IntentSender intentSender) { + mRemoteInlineSuggestionViewConnector.onStartIntentSender(intentSender); + } + + /** + * Responsible for communicating with the inline suggestion view owning process. + */ + private class InlineSuggestionUiCallbackImpl extends IInlineSuggestionUiCallback.Stub { + + @Override + public void onClick() { + mHandler.post(RemoteInlineSuggestionUi.this::handleOnClick); + } + + @Override + public void onLongClick() { + mHandler.post(RemoteInlineSuggestionUi.this::handleOnLongClick); + } + + @Override + public void onContent(IInlineSuggestionUi content, + SurfaceControlViewHost.SurfacePackage surface, int width, int height) { + mHandler.post(() -> handleInlineSuggestionUiReady(content, surface, width, height)); + } + + @Override + public void onError() { + mHandler.post(RemoteInlineSuggestionUi.this::handleOnError); + } + + @Override + public void onTransferTouchFocusToImeWindow(IBinder sourceInputToken, int displayId) { + mHandler.post(() -> handleOnTransferTouchFocusToImeWindow(sourceInputToken, displayId)); + } + + @Override + public void onStartIntentSender(IntentSender intentSender) { + mHandler.post(() -> handleOnStartIntentSender(intentSender)); + } + } +} diff --git a/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java new file mode 100644 index 000000000000..9d23c171800d --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/ui/RemoteInlineSuggestionViewConnector.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.autofill.ui; + +import static com.android.server.autofill.Helper.sDebug; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.IntentSender; +import android.os.IBinder; +import android.service.autofill.IInlineSuggestionUiCallback; +import android.service.autofill.InlinePresentation; +import android.util.Slog; + +import com.android.server.LocalServices; +import com.android.server.autofill.RemoteInlineSuggestionRenderService; +import com.android.server.inputmethod.InputMethodManagerInternal; + +import java.util.function.Consumer; + +/** + * Wraps the parameters needed to create a new inline suggestion view in the remote renderer + * service, and handles the callback from the events on the created remote view. + */ +final class RemoteInlineSuggestionViewConnector { + private static final String TAG = RemoteInlineSuggestionViewConnector.class.getSimpleName(); + + @Nullable + private final RemoteInlineSuggestionRenderService mRemoteRenderService; + @NonNull + private final InlinePresentation mInlinePresentation; + @Nullable + private final IBinder mHostInputToken; + private final int mDisplayId; + + @NonNull + private final Runnable mOnAutofillCallback; + @NonNull + private final Runnable mOnErrorCallback; + @NonNull + private final Consumer<IntentSender> mStartIntentSenderFromClientApp; + + RemoteInlineSuggestionViewConnector( + @Nullable RemoteInlineSuggestionRenderService remoteRenderService, + @NonNull InlinePresentation inlinePresentation, + @Nullable IBinder hostInputToken, + int displayId, + @NonNull Runnable onAutofillCallback, + @NonNull Runnable onErrorCallback, + @NonNull Consumer<IntentSender> startIntentSenderFromClientApp) { + mRemoteRenderService = remoteRenderService; + mInlinePresentation = inlinePresentation; + mHostInputToken = hostInputToken; + mDisplayId = displayId; + + mOnAutofillCallback = onAutofillCallback; + mOnErrorCallback = onErrorCallback; + mStartIntentSenderFromClientApp = startIntentSenderFromClientApp; + } + + /** + * Calls the remote renderer service to create a new inline suggestion view. + * + * @return true if the call is made to the remote renderer service, false otherwise. + */ + public boolean renderSuggestion(int width, int height, + @NonNull IInlineSuggestionUiCallback callback) { + if (mRemoteRenderService != null) { + if (sDebug) Slog.d(TAG, "Request to recreate the UI"); + mRemoteRenderService.renderSuggestion(callback, mInlinePresentation, width, height, + mHostInputToken, mDisplayId); + return true; + } + return false; + } + + /** + * Handles the callback for the event of remote view being clicked. + */ + public void onClick() { + mOnAutofillCallback.run(); + } + + /** + * Handles the callback for the remote error when creating or interacting with the view. + */ + public void onError() { + mOnErrorCallback.run(); + } + + /** + * Handles the callback for transferring the touch event on the remote view to the IME + * process. + */ + public void onTransferTouchFocusToImeWindow(IBinder sourceInputToken, int displayId) { + final InputMethodManagerInternal inputMethodManagerInternal = + LocalServices.getService(InputMethodManagerInternal.class); + if (!inputMethodManagerInternal.transferTouchFocusToImeWindow(sourceInputToken, + displayId)) { + Slog.e(TAG, "Cannot transfer touch focus from suggestion to IME"); + mOnErrorCallback.run(); + } + } + + /** + * Handles starting an intent sender from the client app's process. + */ + public void onStartIntentSender(IntentSender intentSender) { + mStartIntentSenderFromClientApp.accept(intentSender); + } +} diff --git a/services/core/Android.bp b/services/core/Android.bp index 21ac3cd24089..cf85b1d012d2 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -130,6 +130,7 @@ java_library_static { "dnsresolver_aidl_interface-java", "netd_aidl_interfaces-platform-java", "overlayable_policy_aidl-java", + "SurfaceFlingerProperties", ], } diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java index bfcde97d6c91..829fca66ec0d 100644 --- a/services/core/java/com/android/server/RescueParty.java +++ b/services/core/java/com/android/server/RescueParty.java @@ -253,10 +253,7 @@ public class RescueParty { logCriticalInfo(Log.DEBUG, "Finished rescue level " + levelToString(level)); } catch (Throwable t) { - final String msg = ExceptionUtils.getCompleteMessage(t); - EventLogTags.writeRescueFailure(level, msg); - logCriticalInfo(Log.ERROR, - "Failed rescue level " + levelToString(level) + ": " + msg); + logRescueException(level, t); } } @@ -274,11 +271,31 @@ public class RescueParty { resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS, failedPackage); break; case LEVEL_FACTORY_RESET: - RecoverySystem.rebootPromptAndWipeUserData(context, TAG); + // Request the reboot from a separate thread to avoid deadlock on PackageWatchdog + // when device shutting down. + Runnable runnable = new Runnable() { + @Override + public void run() { + try { + RecoverySystem.rebootPromptAndWipeUserData(context, TAG); + } catch (Throwable t) { + logRescueException(level, t); + } + } + }; + Thread thread = new Thread(runnable); + thread.start(); break; } } + private static void logRescueException(int level, Throwable t) { + final String msg = ExceptionUtils.getCompleteMessage(t); + EventLogTags.writeRescueFailure(level, msg); + logCriticalInfo(Log.ERROR, + "Failed rescue level " + levelToString(level) + ": " + msg); + } + private static int mapRescueLevelToUserImpact(int rescueLevel) { switch(rescueLevel) { case LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS: diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 97a5cfe6006d..1d40e2ee92f4 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -23,6 +23,7 @@ import static android.telephony.TelephonyRegistryManager.SIM_ACTIVATION_TYPE_VOI import static java.util.Arrays.copyOf; +import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -2459,7 +2460,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId); intent.putExtra(PHONE_CONSTANTS_SLOT_KEY, phoneId); intent.putExtra(SubscriptionManager.EXTRA_SLOT_INDEX, phoneId); - mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.READ_PHONE_STATE); } private void broadcastSignalStrengthChanged(SignalStrength signalStrength, int phoneId, @@ -2584,7 +2585,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { intent.putExtra(PHONE_CONSTANTS_DATA_APN_TYPE_KEY, ApnSetting.getApnTypesStringFromBitmask(apnType)); intent.putExtra(PHONE_CONSTANTS_SUBSCRIPTION_KEY, subId); - mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, Manifest.permission.READ_PHONE_STATE); } private void enforceNotifyPermissionOrCarrierPrivilege(String method) { diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 70b639846e1e..dd3de359a01e 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -122,6 +122,7 @@ final class UiModeManagerService extends SystemService { private boolean mVrHeadset; private boolean mComputedNightMode; private int mCarModeEnableFlags; + private boolean mSetupWizardComplete; // flag set by resource, whether to enable Car dock launch when starting car mode. private boolean mEnableCarDockLaunch = true; @@ -163,6 +164,12 @@ final class UiModeManagerService extends SystemService { mConfiguration.setToDefaults(); } + @VisibleForTesting + protected UiModeManagerService(Context context, boolean setupWizardComplete) { + this(context); + mSetupWizardComplete = setupWizardComplete; + } + private static Intent buildHomeIntent(String category) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(category); @@ -276,6 +283,25 @@ final class UiModeManagerService extends SystemService { } }; + private final ContentObserver mSetupWizardObserver = new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange, Uri uri) { + synchronized (mLock) { + // setup wizard is done now so we can unblock + if (setupWizardCompleteForCurrentUser() && !selfChange) { + mSetupWizardComplete = true; + getContext().getContentResolver() + .unregisterContentObserver(mSetupWizardObserver); + // update night mode + Context context = getContext(); + updateNightModeFromSettingsLocked(context, context.getResources(), + UserHandle.getCallingUserId()); + updateLocked(0, 0); + } + } + } + }; + private final ContentObserver mDarkThemeObserver = new ContentObserver(mHandler) { @Override public void onChange(boolean selfChange, Uri uri) { @@ -293,6 +319,13 @@ final class UiModeManagerService extends SystemService { } @Override + public void onSwitchUser(int userHandle) { + super.onSwitchUser(userHandle); + getContext().getContentResolver().unregisterContentObserver(mSetupWizardObserver); + verifySetupWizardCompleted(); + } + + @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { synchronized (mLock) { @@ -330,8 +363,13 @@ final class UiModeManagerService extends SystemService { @Override public void onStart() { final Context context = getContext(); + // If setup isn't complete for this user listen for completion so we can unblock + // being able to send a night mode configuration change event + verifySetupWizardCompleted(); final Resources res = context.getResources(); + mNightMode = res.getInteger( + com.android.internal.R.integer.config_defaultNightMode); mDefaultUiModeType = res.getInteger( com.android.internal.R.integer.config_defaultUiModeType); mCarModeKeepsScreenOn = (res.getInteger( @@ -404,6 +442,20 @@ final class UiModeManagerService extends SystemService { return mConfiguration; } + // Records whether setup wizard has happened or not and adds an observer for this user if not. + private void verifySetupWizardCompleted() { + final Context context = getContext(); + final int userId = UserHandle.getCallingUserId(); + if (!setupWizardCompleteForCurrentUser()) { + mSetupWizardComplete = false; + context.getContentResolver().registerContentObserver( + Secure.getUriFor( + Secure.USER_SETUP_COMPLETE), false, mSetupWizardObserver, userId); + } else { + mSetupWizardComplete = true; + } + } + private boolean setupWizardCompleteForCurrentUser() { return Secure.getIntForUser(getContext().getContentResolver(), Secure.USER_SETUP_COMPLETE, 0, UserHandle.getCallingUserId()) == 1; @@ -429,27 +481,35 @@ final class UiModeManagerService extends SystemService { * @return True if the new value is different from the old value. False otherwise. */ private boolean updateNightModeFromSettingsLocked(Context context, Resources res, int userId) { - final int defaultNightMode = res.getInteger( - com.android.internal.R.integer.config_defaultNightMode); int oldNightMode = mNightMode; - mNightMode = Secure.getIntForUser(context.getContentResolver(), - Secure.UI_NIGHT_MODE, defaultNightMode, userId); - mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(), - Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0; - mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(), - Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0; - mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay( - Secure.getLongForUser(context.getContentResolver(), - Secure.DARK_THEME_CUSTOM_START_TIME, - DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000); - mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay( - Secure.getLongForUser(context.getContentResolver(), - Secure.DARK_THEME_CUSTOM_END_TIME, - DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000); + if (mSetupWizardComplete) { + mNightMode = Secure.getIntForUser(context.getContentResolver(), + Secure.UI_NIGHT_MODE, mNightMode, userId); + mOverrideNightModeOn = Secure.getIntForUser(context.getContentResolver(), + Secure.UI_NIGHT_MODE_OVERRIDE_ON, 0, userId) != 0; + mOverrideNightModeOff = Secure.getIntForUser(context.getContentResolver(), + Secure.UI_NIGHT_MODE_OVERRIDE_OFF, 0, userId) != 0; + mCustomAutoNightModeStartMilliseconds = LocalTime.ofNanoOfDay( + Secure.getLongForUser(context.getContentResolver(), + Secure.DARK_THEME_CUSTOM_START_TIME, + DEFAULT_CUSTOM_NIGHT_START_TIME.toNanoOfDay() / 1000L, userId) * 1000); + mCustomAutoNightModeEndMilliseconds = LocalTime.ofNanoOfDay( + Secure.getLongForUser(context.getContentResolver(), + Secure.DARK_THEME_CUSTOM_END_TIME, + DEFAULT_CUSTOM_NIGHT_END_TIME.toNanoOfDay() / 1000L, userId) * 1000); + } return oldNightMode != mNightMode; } + private static long toMilliSeconds(LocalTime t) { + return t.toNanoOfDay() / 1000; + } + + private static LocalTime fromMilliseconds(long t) { + return LocalTime.ofNanoOfDay(t * 1000); + } + private void registerScreenOffEventLocked() { if (mPowerSave) return; mWaitForScreenOff = true; @@ -1385,8 +1445,11 @@ final class UiModeManagerService extends SystemService { pw.println("UiModeManager service (uimode) commands:"); pw.println(" help"); pw.println(" Print this help text."); - pw.println(" night [yes|no|auto]"); + pw.println(" night [yes|no|auto|custom]"); pw.println(" Set or read night mode."); + pw.println(" time [start|end] <ISO time>"); + pw.println(" Set custom start/end schedule time" + + " (night mode must be set to custom to apply)."); } @Override @@ -1399,6 +1462,8 @@ final class UiModeManagerService extends SystemService { switch (cmd) { case "night": return handleNightMode(); + case "time": + return handleCustomTime(); default: return handleDefaultCommands(cmd); } @@ -1409,6 +1474,34 @@ final class UiModeManagerService extends SystemService { return -1; } + private int handleCustomTime() throws RemoteException { + final String modeStr = getNextArg(); + if (modeStr == null) { + printCustomTime(); + return 0; + } + switch (modeStr) { + case "start": + final String start = getNextArg(); + mInterface.setCustomNightModeStart(toMilliSeconds(LocalTime.parse(start))); + return 0; + case "end": + final String end = getNextArg(); + mInterface.setCustomNightModeEnd(toMilliSeconds(LocalTime.parse(end))); + return 0; + default: + getErrPrintWriter().println("command must be in [start|end]"); + return -1; + } + } + + private void printCustomTime() throws RemoteException { + getOutPrintWriter().println("start " + fromMilliseconds( + mInterface.getCustomNightModeStart()).toString()); + getOutPrintWriter().println("end " + fromMilliseconds( + mInterface.getCustomNightModeEnd()).toString()); + } + private int handleNightMode() throws RemoteException { final PrintWriter err = getErrPrintWriter(); final String modeStr = getNextArg(); @@ -1424,7 +1517,8 @@ final class UiModeManagerService extends SystemService { return 0; } else { err.println("Error: mode must be '" + NIGHT_MODE_STR_YES + "', '" - + NIGHT_MODE_STR_NO + "', or '" + NIGHT_MODE_STR_AUTO + "'"); + + NIGHT_MODE_STR_NO + "', or '" + NIGHT_MODE_STR_AUTO + + "', or '" + NIGHT_MODE_STR_CUSTOM + "'"); return -1; } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 8d3515202126..d914bda3eff4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8766,27 +8766,6 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public boolean isUidActiveOrForeground(int uid, String callingPackage) { - if (!hasUsageStatsPermission(callingPackage)) { - enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, - "isUidActiveOrForeground"); - } - synchronized (this) { - final boolean isActive = isUidActiveLocked(uid); - if (isActive) { - return true; - } - } - final boolean isForeground = mAtmInternal.isUidForeground(uid); - if (isForeground) { - Slog.wtf(TAG, "isUidActiveOrForeground: isUidActive false but " - + " isUidForeground true, uid:" + uid - + " callingPackage:" + callingPackage); - } - return isForeground; - } - - @Override public void setPersistentVrThread(int tid) { mActivityTaskManager.setPersistentVrThread(tid); } @@ -20201,4 +20180,15 @@ public class ActivityManagerService extends IActivityManager.Stub mUsageStatsService.reportLocusUpdate(activity, userId, locusId, appToken); } } + + @Override + public boolean isAppFreezerSupported() { + final long token = Binder.clearCallingIdentity(); + + try { + return mOomAdjuster.mCachedAppOptimizer.isFreezerSupported(); + } finally { + Binder.restoreCallingIdentity(token); + } + } } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 86d9028f53dc..f9d204fa008e 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -33,6 +33,7 @@ import android.os.Trace; import android.provider.DeviceConfig; import android.provider.DeviceConfig.OnPropertiesChangedListener; import android.provider.DeviceConfig.Properties; +import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Slog; @@ -407,7 +408,7 @@ public final class CachedAppOptimizer { /** * Determines whether the freezer is correctly supported by this system */ - public boolean isFreezerSupported() { + public static boolean isFreezerSupported() { boolean supported = false; FileReader fr = null; @@ -443,7 +444,13 @@ public final class CachedAppOptimizer { */ @GuardedBy("mPhenotypeFlagLock") private void updateUseFreezer() { - if (DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, + final String configOverride = Settings.Global.getString(mAm.mContext.getContentResolver(), + Settings.Global.CACHED_APPS_FREEZER_ENABLED); + + if ("disabled".equals(configOverride)) { + mUseFreezer = false; + } else if ("enabled".equals(configOverride) + || DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT, KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) { mUseFreezer = isFreezerSupported(); } diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index 17f4187e4dcc..823d2c80082c 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -95,14 +95,15 @@ option java_package com.android.server.am 30069 am_unfreeze (Pid|1|5),(Process Name|3) # User switch events -30070 uc_finish_user_unlocking (UID|1|5) -30071 uc_finish_user_unlocked (UID|1|5) -30072 uc_finish_user_unlocked_completed (UID|1|5) -30073 uc_finish_user_stopping (UID|1|5) -30074 uc_finish_user_stopped (UID|1|5) -30075 uc_switch_user (UID|1|5) -30076 uc_start_user_internal (UID|1|5) -30077 uc_unlock_user (UID|1|5) -30078 uc_finish_user_boot (UID|1|5) -30079 uc_dispatch_user_switch (oldUID|1|5) (newUID|1|5) -30080 uc_continue_user_switch (oldUID|1|5) (newUID|1|5) +30070 uc_finish_user_unlocking (userId|1|5) +30071 uc_finish_user_unlocked (userId|1|5) +30072 uc_finish_user_unlocked_completed (userId|1|5) +30073 uc_finish_user_stopping (userId|1|5) +30074 uc_finish_user_stopped (userId|1|5) +30075 uc_switch_user (userId|1|5) +30076 uc_start_user_internal (userId|1|5) +30077 uc_unlock_user (userId|1|5) +30078 uc_finish_user_boot (userId|1|5) +30079 uc_dispatch_user_switch (oldUserId|1|5) (newUserId|1|5) +30080 uc_continue_user_switch (oldUserId|1|5) (newUserId|1|5) +30081 uc_send_user_broadcast (userId|1|5) (IntentAction|3|)
\ No newline at end of file diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index c7c25102343b..5b12933f7a40 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -668,6 +668,8 @@ class UserController implements Handler.Callback { // Spin up app widgets prior to boot-complete, so they can be ready promptly mInjector.startUserWidgets(userId); + mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget(); + Slog.i(TAG, "Posting BOOT_COMPLETED user #" + userId); // Do not report secondary users, runtime restarts or first boot/upgrade if (userId == UserHandle.USER_SYSTEM @@ -677,9 +679,6 @@ class UserController implements Handler.Callback { FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__FRAMEWORK_BOOT_COMPLETED, elapsedTimeMs); } - - mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget(); - final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT @@ -2423,8 +2422,10 @@ class UserController implements Handler.Callback { logUserJourneyInfo(null, getUserInfo(msg.arg1), USER_JOURNEY_USER_START); logUserLifecycleEvent(msg.arg1, USER_JOURNEY_USER_START, USER_LIFECYCLE_EVENT_START_USER, true); + mInjector.getSystemServiceManager().startUser(TimingsTraceAndSlog.newAsyncLog(), msg.arg1); + logUserLifecycleEvent(msg.arg1, USER_JOURNEY_USER_START, USER_LIFECYCLE_EVENT_START_USER, false); clearSessionId(msg.arg1, USER_JOURNEY_USER_START); @@ -2456,6 +2457,7 @@ class UserController implements Handler.Callback { break; case REPORT_USER_SWITCH_COMPLETE_MSG: dispatchUserSwitchComplete(msg.arg1); + final int currentJourney = mUserSwitchUiEnabled ? USER_JOURNEY_USER_SWITCH_UI : USER_JOURNEY_USER_SWITCH_FG; logUserLifecycleEvent(msg.arg1, currentJourney, @@ -2601,6 +2603,13 @@ class UserController implements Handler.Callback { Bundle resultExtras, String[] requiredPermissions, int appOp, Bundle bOptions, boolean ordered, boolean sticky, int callingPid, int callingUid, int realCallingUid, int realCallingPid, @UserIdInt int userId) { + + int logUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); + if (logUserId == UserHandle.USER_NULL) { + logUserId = userId; + } + EventLog.writeEvent(EventLogTags.UC_SEND_USER_BROADCAST, logUserId, intent.getAction()); + // TODO b/64165549 Verify that mLock is not held before calling AMS methods synchronized (mService) { return mService.broadcastIntentLocked(null, null, null, intent, resolvedType, @@ -2666,6 +2675,8 @@ class UserController implements Handler.Callback { } void sendPreBootBroadcast(@UserIdInt int userId, boolean quiet, final Runnable onFinish) { + EventLog.writeEvent(EventLogTags.UC_SEND_USER_BROADCAST, + userId, Intent.ACTION_PRE_BOOT_COMPLETED); new PreBootBroadcaster(mService, userId, null, quiet) { @Override public void onFinished() { diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index 70fbca5b4798..7e28e94a17bb 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -170,6 +170,8 @@ public class BiometricService extends SystemService { final String mOpPackageName; // Info to be shown on BiometricDialog when all cookies are returned. final Bundle mBundle; + // Random id associated to this AuthSession + final int mSysUiSessionId; final int mCallingUid; final int mCallingPid; final int mCallingUserId; @@ -203,11 +205,13 @@ public class BiometricService extends SystemService { mClientReceiver = receiver; mOpPackageName = opPackageName; mBundle = bundle; + mSysUiSessionId = mRandom.nextInt(); mCallingUid = callingUid; mCallingPid = callingPid; mCallingUserId = callingUserId; mModality = modality; mRequireConfirmation = requireConfirmation; + Slog.d(TAG, "New AuthSession, mSysUiSessionId: " + mSysUiSessionId); } boolean isCrypto() { @@ -1457,7 +1461,8 @@ public class BiometricService extends SystemService { false /* requireConfirmation */, mCurrentAuthSession.mUserId, mCurrentAuthSession.mOpPackageName, - mCurrentAuthSession.mSessionId); + mCurrentAuthSession.mSessionId, + mCurrentAuthSession.mSysUiSessionId); } else { mPendingAuthSession.mClientReceiver.onError(modality, error, vendorCode); mPendingAuthSession = null; @@ -1680,7 +1685,8 @@ public class BiometricService extends SystemService { mStatusBarService.showAuthenticationDialog(mCurrentAuthSession.mBundle, mInternalReceiver, modality, requireConfirmation, userId, mCurrentAuthSession.mOpPackageName, - mCurrentAuthSession.mSessionId); + mCurrentAuthSession.mSessionId, + mCurrentAuthSession.mSysUiSessionId); } catch (RemoteException e) { Slog.e(TAG, "Remote exception", e); } @@ -1766,7 +1772,8 @@ public class BiometricService extends SystemService { false /* requireConfirmation */, mCurrentAuthSession.mUserId, mCurrentAuthSession.mOpPackageName, - sessionId); + sessionId, + mCurrentAuthSession.mSysUiSessionId); } else { mPendingAuthSession.mState = STATE_AUTH_CALLED; for (AuthenticatorWrapper authenticator : mAuthenticators) { diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index b2bf1fce0d07..ccbe96f30e04 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -2667,8 +2667,7 @@ public class LocationManagerService extends ILocationManager.Stub { mRequestStatistics.statistics); for (Map.Entry<PackageProviderKey, PackageStatistics> entry : sorted.entrySet()) { - PackageProviderKey key = entry.getKey(); - ipw.println(key.mPackageName + ": " + key.mProviderName + ": " + entry.getValue()); + ipw.println(entry.getKey() + ": " + entry.getValue()); } ipw.decreaseIndent(); diff --git a/services/core/java/com/android/server/location/LocationRequestStatistics.java b/services/core/java/com/android/server/location/LocationRequestStatistics.java index dcdf48ba08d2..e629b428d864 100644 --- a/services/core/java/com/android/server/location/LocationRequestStatistics.java +++ b/services/core/java/com/android/server/location/LocationRequestStatistics.java @@ -16,6 +16,7 @@ package com.android.server.location; +import android.annotation.NonNull; import android.annotation.Nullable; import android.os.SystemClock; import android.util.Log; @@ -25,6 +26,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.Objects; @@ -121,14 +123,30 @@ public class LocationRequestStatistics { this.mProviderName = providerName; } + @NonNull + @Override + public String toString() { + return mProviderName + ": " + mPackageName + + (mFeatureId == null ? "" : ": " + mFeatureId); + } + + /** + * Sort by provider, then package, then feature + */ @Override public int compareTo(PackageProviderKey other) { final int providerCompare = mProviderName.compareTo(other.mProviderName); if (providerCompare != 0) { return providerCompare; - } else { - return mProviderName.compareTo(other.mProviderName); } + + final int packageCompare = mPackageName.compareTo(other.mPackageName); + if (packageCompare != 0) { + return packageCompare; + } + + return Objects.compare(mFeatureId, other.mFeatureId, Comparator + .nullsFirst(String::compareTo)); } @Override diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index 3cf22c85f924..54958d347096 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.media.MediaRoute2Info; +import android.text.TextUtils; import android.util.Slog; import android.util.SparseBooleanArray; @@ -210,7 +211,11 @@ class BluetoothRouteProvider { newBtRoute.btDevice = device; // Current / Max volume will be set when connected. // TODO: Is there any BT device which has fixed volume? - newBtRoute.route = new MediaRoute2Info.Builder(device.getAddress(), device.getName()) + String deviceName = device.getName(); + if (TextUtils.isEmpty(deviceName)) { + deviceName = mContext.getResources().getText(R.string.unknownName).toString(); + } + newBtRoute.route = new MediaRoute2Info.Builder(device.getAddress(), deviceName) .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) .setDescription(mContext.getResources().getText( diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java index a5de90c93aab..a435f1e16b80 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java @@ -315,9 +315,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider return; } - sessionInfo = new RoutingSessionInfo.Builder(sessionInfo) - .setProviderId(getUniqueId()) - .build(); + sessionInfo = updateSessionInfo(sessionInfo); boolean duplicateSessionAlreadyExists = false; synchronized (mLock) { @@ -348,9 +346,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider return; } - sessionInfo = new RoutingSessionInfo.Builder(sessionInfo) - .setProviderId(getUniqueId()) - .build(); + sessionInfo = updateSessionInfo(sessionInfo); boolean found = false; synchronized (mLock) { @@ -380,9 +376,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider return; } - sessionInfo = new RoutingSessionInfo.Builder(sessionInfo) - .setProviderId(getUniqueId()) - .build(); + sessionInfo = updateSessionInfo(sessionInfo); boolean found = false; synchronized (mLock) { @@ -403,6 +397,13 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider mCallback.onSessionReleased(this, sessionInfo); } + private RoutingSessionInfo updateSessionInfo(RoutingSessionInfo sessionInfo) { + return new RoutingSessionInfo.Builder(sessionInfo) + .setOwnerPackageName(mComponentName.getPackageName()) + .setProviderId(getUniqueId()) + .build(); + } + private void onRequestFailed(Connection connection, long requestId, int reason) { if (mActiveConnection != connection) { return; diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index ec941c8aea59..3283fd9b2c51 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -799,7 +799,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { writePolicyAL(); } - enableFirewallChainUL(FIREWALL_CHAIN_STANDBY, true); setRestrictBackgroundUL(mLoadedRestrictBackground, "init_service"); updateRulesForGlobalChangeAL(false); updateNotificationsNL(); @@ -871,6 +870,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { new NetworkRequest.Builder().build(), mNetworkCallback); mAppStandby.addListener(new NetPolicyAppIdleStateChangeListener()); + synchronized (mUidRulesFirstLock) { + updateRulesForAppIdleParoleUL(); + } // Listen for subscriber changes mContext.getSystemService(SubscriptionManager.class).addOnSubscriptionsChangedListener( @@ -3893,6 +3895,39 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } /** + * Toggle the firewall standby chain and inform listeners if the uid rules have effectively + * changed. + */ + @GuardedBy("mUidRulesFirstLock") + private void updateRulesForAppIdleParoleUL() { + final boolean paroled = mAppStandby.isInParole(); + final boolean enableChain = !paroled; + enableFirewallChainUL(FIREWALL_CHAIN_STANDBY, enableChain); + + int ruleCount = mUidFirewallStandbyRules.size(); + for (int i = 0; i < ruleCount; i++) { + final int uid = mUidFirewallStandbyRules.keyAt(i); + int oldRules = mUidRules.get(uid); + if (enableChain) { + // Chain wasn't enabled before and the other power-related + // chains are whitelists, so we can clear the + // MASK_ALL_NETWORKS part of the rules and re-inform listeners if + // the effective rules result in blocking network access. + oldRules &= MASK_METERED_NETWORKS; + } else { + // Skip if it had no restrictions to begin with + if ((oldRules & MASK_ALL_NETWORKS) == 0) continue; + } + final int newUidRules = updateRulesForPowerRestrictionsUL(uid, oldRules, paroled); + if (newUidRules == RULE_NONE) { + mUidRules.delete(uid); + } else { + mUidRules.put(uid, newUidRules); + } + } + } + + /** * Update rules that might be changed by {@link #mRestrictBackground}, * {@link #mRestrictPower}, or {@link #mDeviceIdleMode} value. */ @@ -4347,7 +4382,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void updateRulesForPowerRestrictionsUL(int uid) { final int oldUidRules = mUidRules.get(uid, RULE_NONE); - final int newUidRules = updateRulesForPowerRestrictionsUL(uid, oldUidRules); + final int newUidRules = updateRulesForPowerRestrictionsUL(uid, oldUidRules, false); if (newUidRules == RULE_NONE) { mUidRules.delete(uid); @@ -4361,28 +4396,30 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * * @param uid the uid of the app to update rules for * @param oldUidRules the current rules for the uid, in order to determine if there's a change + * @param paroled whether to ignore idle state of apps and only look at other restrictions * * @return the new computed rules for the uid */ - private int updateRulesForPowerRestrictionsUL(int uid, int oldUidRules) { + private int updateRulesForPowerRestrictionsUL(int uid, int oldUidRules, boolean paroled) { if (Trace.isTagEnabled(Trace.TRACE_TAG_NETWORK)) { Trace.traceBegin(Trace.TRACE_TAG_NETWORK, - "updateRulesForPowerRestrictionsUL: " + uid + "/" + oldUidRules); + "updateRulesForPowerRestrictionsUL: " + uid + "/" + oldUidRules + "/" + + (paroled ? "P" : "-")); } try { - return updateRulesForPowerRestrictionsULInner(uid, oldUidRules); + return updateRulesForPowerRestrictionsULInner(uid, oldUidRules, paroled); } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } } - private int updateRulesForPowerRestrictionsULInner(int uid, int oldUidRules) { + private int updateRulesForPowerRestrictionsULInner(int uid, int oldUidRules, boolean paroled) { if (!isUidValidForBlacklistRules(uid)) { if (LOGD) Slog.d(TAG, "no need to update restrict power rules for uid " + uid); return RULE_NONE; } - final boolean isIdle = isUidIdle(uid); + final boolean isIdle = !paroled && isUidIdle(uid); final boolean restrictMode = isIdle || mRestrictPower || mDeviceIdleMode; final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid); @@ -4452,6 +4489,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } catch (NameNotFoundException nnfe) { } } + + @Override + public void onParoleStateChanged(boolean isParoleOn) { + synchronized (mUidRulesFirstLock) { + mLogger.paroleStateChanged(isParoleOn); + updateRulesForAppIdleParoleUL(); + } + } } private void dispatchUidRulesChanged(INetworkPolicyListener listener, int uid, int uidRules) { diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 1951fc071d3a..adf017633c29 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -178,6 +178,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // Perform polling, persist network, and register the global alert again. private static final int MSG_PERFORM_POLL_REGISTER_ALERT = 2; private static final int MSG_UPDATE_IFACES = 3; + // A message for broadcasting ACTION_NETWORK_STATS_UPDATED in handler thread to prevent + // deadlock. + private static final int MSG_BROADCAST_NETWORK_STATS_UPDATED = 4; /** Flags to control detail level of poll event. */ private static final int FLAG_PERSIST_NETWORK = 0x1; @@ -386,6 +389,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub { registerGlobalAlert(); break; } + case MSG_BROADCAST_NETWORK_STATS_UPDATED: { + final Intent updatedIntent = new Intent(ACTION_NETWORK_STATS_UPDATED); + updatedIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + mContext.sendBroadcastAsUser(updatedIntent, UserHandle.ALL, + READ_NETWORK_USAGE_HISTORY); + break; + } } } } @@ -1513,10 +1523,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } // finally, dispatch updated event to any listeners - final Intent updatedIntent = new Intent(ACTION_NETWORK_STATS_UPDATED); - updatedIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - mContext.sendBroadcastAsUser(updatedIntent, UserHandle.ALL, - READ_NETWORK_USAGE_HISTORY); + mHandler.sendMessage(mHandler.obtainMessage(MSG_BROADCAST_NETWORK_STATS_UPDATED)); Trace.traceEnd(TRACE_TAG_NETWORK); } diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index 8e3de1598275..a9fa2b1bd491 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -1382,13 +1382,21 @@ public final class NotificationRecord { */ public boolean isConversation() { Notification notification = getNotification(); - if (mChannel.isDemoted() - || !Notification.MessagingStyle.class.equals(notification.getNotificationStyle())) { + if (!Notification.MessagingStyle.class.equals(notification.getNotificationStyle())) { + // very common; don't bother logging + return false; + } + if (mChannel.isDemoted()) { return false; } if (mIsNotConversationOverride) { return false; } + if (mTargetSdkVersion >= Build.VERSION_CODES.R + && Notification.MessagingStyle.class.equals(notification.getNotificationStyle()) + && mShortcutInfo == null) { + return false; + } return true; } diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 92c145275ac8..aafd261f7d9f 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -30,9 +30,9 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; +import android.content.pm.PackageParser; import android.content.pm.PackageParser.PackageParserException; import android.content.pm.parsing.PackageInfoWithoutStateUtils; -import android.content.pm.parsing.ParsingPackageUtils; import android.os.Binder; import android.os.Environment; import android.os.RemoteException; @@ -50,7 +50,6 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.pm.parsing.PackageParser2; import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.parsing.pkg.ParsedPackage; import com.android.server.utils.TimingsTraceAndSlog; import com.google.android.collect.Lists; @@ -491,7 +490,7 @@ public abstract class ApexManager { for (ApexInfo ai : allPkgs) { File apexFile = new File(ai.modulePath); - parallelPackageParser.submit(apexFile, 0); + parallelPackageParser.submit(apexFile, PackageParser.PARSE_COLLECT_CERTIFICATES); parsingApexInfo.put(apexFile, ai); } @@ -504,18 +503,8 @@ public abstract class ApexManager { ApexInfo ai = parsingApexInfo.get(parseResult.scanFile); if (throwable == null) { - // Unfortunately, ParallelPackageParser won't collect certificates for us. We - // need to manually collect them here. - ParsedPackage pp = parseResult.parsedPackage; - try { - pp.setSigningDetails( - ParsingPackageUtils.getSigningDetails(pp, false)); - } catch (PackageParserException e) { - throw new IllegalStateException( - "Unable to collect certificates for " + ai.modulePath, e); - } final PackageInfo packageInfo = PackageInfoWithoutStateUtils.generate( - pp, ai, flags); + parseResult.parsedPackage, ai, flags); if (packageInfo == null) { throw new IllegalStateException("Unable to generate package info: " + ai.modulePath); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 3367cd556b2b..5b5f334803e5 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -676,7 +676,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements session = new PackageInstallerSession(mInternalCallback, mContext, mPm, this, mInstallThread.getLooper(), mStagingManager, sessionId, userId, callingUid, installSource, params, createdMillis, - stageDir, stageCid, null, false, false, false, null, SessionInfo.INVALID_ID, + stageDir, stageCid, null, false, false, false, false, null, SessionInfo.INVALID_ID, false, false, false, SessionInfo.STAGED_SESSION_NO_ERROR, ""); synchronized (mSessions) { @@ -830,7 +830,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { final PackageInstallerSession session = mSessions.get(sessionId); - return session != null + return (session != null && !(session.isStaged() && session.isDestroyed())) ? session.generateInfoForCaller(true /*withIcon*/, Binder.getCallingUid()) : null; } @@ -851,7 +851,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements synchronized (mSessions) { for (int i = 0; i < mSessions.size(); i++) { final PackageInstallerSession session = mSessions.valueAt(i); - if (session.userId == userId && !session.hasParentSessionId()) { + if (session.userId == userId && !session.hasParentSessionId() + && !(session.isStaged() && session.isDestroyed())) { result.add(session.generateInfoForCaller(false, callingUid)); } } @@ -1269,7 +1270,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public void onStagedSessionChanged(PackageInstallerSession session) { session.markUpdated(); writeSessionsAsync(); - if (mOkToSendBroadcasts) { + if (mOkToSendBroadcasts && !session.isDestroyed()) { // we don't scrub the data here as this is sent only to the installer several // privileged system packages mPm.sendSessionUpdatedBroadcast( diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index d3f377e135cb..e0d057a8d7f3 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -190,6 +190,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private static final String ATTR_SESSION_STAGE_CID = "sessionStageCid"; private static final String ATTR_PREPARED = "prepared"; private static final String ATTR_COMMITTED = "committed"; + private static final String ATTR_DESTROYED = "destroyed"; private static final String ATTR_SEALED = "sealed"; private static final String ATTR_MULTI_PACKAGE = "multiPackage"; private static final String ATTR_PARENT_SESSION_ID = "parentSessionId"; @@ -533,7 +534,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { int sessionId, int userId, int installerUid, @NonNull InstallSource installSource, SessionParams params, long createdMillis, File stageDir, String stageCid, InstallationFile[] files, boolean prepared, - boolean committed, boolean sealed, + boolean committed, boolean destroyed, boolean sealed, @Nullable int[] childSessionIds, int parentSessionId, boolean isReady, boolean isFailed, boolean isApplied, int stagedSessionErrorCode, String stagedSessionErrorMessage) { @@ -579,6 +580,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mPrepared = prepared; mCommitted = committed; + mDestroyed = destroyed; mStagedSessionReady = isReady; mStagedSessionFailed = isFailed; mStagedSessionApplied = isApplied; @@ -713,6 +715,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } + /** {@hide} */ + boolean isDestroyed() { + synchronized (mLock) { + return mDestroyed; + } + } + /** Returns true if a staged session has reached a final state and can be forgotten about */ public boolean isStagedAndInTerminalState() { synchronized (mLock) { @@ -1068,6 +1077,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } /** + * Check if the caller is the owner of this session. Otherwise throw a + * {@link SecurityException}. + */ + @GuardedBy("mLock") + private void assertCallerIsOwnerOrRootOrSystemLocked() { + final int callingUid = Binder.getCallingUid(); + if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid + && callingUid != Process.SYSTEM_UID) { + throw new SecurityException("Session does not belong to uid " + callingUid); + } + } + + /** * If anybody is reading or writing data of the session, throw an {@link SecurityException}. */ @GuardedBy("mLock") @@ -2552,7 +2574,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { + mParentSessionId + " and may not be abandoned directly."); } synchronized (mLock) { - assertCallerIsOwnerOrRootLocked(); + if (params.isStaged && mDestroyed) { + // If a user abandons staged session in an unsafe state, then system will try to + // abandon the destroyed staged session when it is safe on behalf of the user. + assertCallerIsOwnerOrRootOrSystemLocked(); + } else { + assertCallerIsOwnerOrRootLocked(); + } if (isStagedAndInTerminalState()) { // We keep the session in the database if it's in a finalized state. It will be @@ -2562,11 +2590,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } if (mCommitted && params.isStaged) { - synchronized (mLock) { - mDestroyed = true; + mDestroyed = true; + if (!mStagingManager.abortCommittedSessionLocked(this)) { + // Do not clean up the staged session from system. It is not safe yet. + mCallback.onStagedSessionChanged(this); + return; } - mStagingManager.abortCommittedSession(this); - cleanStageDir(); } @@ -2926,6 +2955,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { /** {@hide} */ void setStagedSessionReady() { synchronized (mLock) { + if (mDestroyed) return; // Do not allow destroyed staged session to change state mStagedSessionReady = true; mStagedSessionApplied = false; mStagedSessionFailed = false; @@ -2939,6 +2969,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { void setStagedSessionFailed(@StagedSessionErrorCode int errorCode, String errorMessage) { synchronized (mLock) { + if (mDestroyed) return; // Do not allow destroyed staged session to change state mStagedSessionReady = false; mStagedSessionApplied = false; mStagedSessionFailed = true; @@ -2953,6 +2984,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { /** {@hide} */ void setStagedSessionApplied() { synchronized (mLock) { + if (mDestroyed) return; // Do not allow destroyed staged session to change state mStagedSessionReady = false; mStagedSessionApplied = true; mStagedSessionFailed = false; @@ -3197,7 +3229,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { */ void write(@NonNull XmlSerializer out, @NonNull File sessionsDir) throws IOException { synchronized (mLock) { - if (mDestroyed) { + if (mDestroyed && !params.isStaged) { return; } @@ -3223,6 +3255,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } writeBooleanAttribute(out, ATTR_PREPARED, isPrepared()); writeBooleanAttribute(out, ATTR_COMMITTED, isCommitted()); + writeBooleanAttribute(out, ATTR_DESTROYED, isDestroyed()); writeBooleanAttribute(out, ATTR_SEALED, isSealed()); writeBooleanAttribute(out, ATTR_MULTI_PACKAGE, params.isMultiPackage); @@ -3352,6 +3385,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final String stageCid = readStringAttribute(in, ATTR_SESSION_STAGE_CID); final boolean prepared = readBooleanAttribute(in, ATTR_PREPARED, true); final boolean committed = readBooleanAttribute(in, ATTR_COMMITTED); + final boolean destroyed = readBooleanAttribute(in, ATTR_DESTROYED); final boolean sealed = readBooleanAttribute(in, ATTR_SEALED); final int parentSessionId = readIntAttribute(in, ATTR_PARENT_SESSION_ID, SessionInfo.INVALID_ID); @@ -3473,7 +3507,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return new PackageInstallerSession(callback, context, pm, sessionProvider, installerThread, stagingManager, sessionId, userId, installerUid, installSource, params, createdMillis, stageDir, stageCid, fileArray, - prepared, committed, sealed, childSessionIdsArray, parentSessionId, + prepared, committed, destroyed, sealed, childSessionIdsArray, parentSessionId, isReady, isFailed, isApplied, stagedSessionErrorCode, stagedSessionErrorMessage); } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f31dbbf077bb..bde9d5735960 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5966,25 +5966,7 @@ public class PackageManagerService extends IPackageManager.Stub || shouldFilterApplicationLocked(ps2, callingUid, callingUserId)) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - SigningDetails p1SigningDetails = p1.getSigningDetails(); - SigningDetails p2SigningDetails = p2.getSigningDetails(); - int result = compareSignatures(p1SigningDetails.signatures, - p2SigningDetails.signatures); - // To support backwards compatibility with clients of this API expecting pre-key - // rotation results if either of the packages has a signing lineage the oldest signer - // in the lineage is used for signature verification. - if (result != PackageManager.SIGNATURE_MATCH && ( - p1SigningDetails.hasPastSigningCertificates() - || p2SigningDetails.hasPastSigningCertificates())) { - Signature[] p1Signatures = p1SigningDetails.hasPastSigningCertificates() - ? new Signature[]{p1SigningDetails.pastSigningCertificates[0]} - : p1SigningDetails.signatures; - Signature[] p2Signatures = p2SigningDetails.hasPastSigningCertificates() - ? new Signature[]{p2SigningDetails.pastSigningCertificates[0]} - : p2SigningDetails.signatures; - result = compareSignatures(p1Signatures, p2Signatures); - } - return result; + return checkSignaturesInternal(p1.getSigningDetails(), p2.getSigningDetails()); } } @@ -5998,21 +5980,21 @@ public class PackageManagerService extends IPackageManager.Stub final int appId2 = UserHandle.getAppId(uid2); // reader synchronized (mLock) { - Signature[] s1; - Signature[] s2; + SigningDetails p1SigningDetails; + SigningDetails p2SigningDetails; Object obj = mSettings.getSettingLPr(appId1); if (obj != null) { if (obj instanceof SharedUserSetting) { if (isCallerInstantApp) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - s1 = ((SharedUserSetting)obj).signatures.mSigningDetails.signatures; + p1SigningDetails = ((SharedUserSetting) obj).signatures.mSigningDetails; } else if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - s1 = ps.signatures.mSigningDetails.signatures; + p1SigningDetails = ps.signatures.mSigningDetails; } else { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } @@ -6025,21 +6007,51 @@ public class PackageManagerService extends IPackageManager.Stub if (isCallerInstantApp) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - s2 = ((SharedUserSetting)obj).signatures.mSigningDetails.signatures; + p2SigningDetails = ((SharedUserSetting) obj).signatures.mSigningDetails; } else if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - s2 = ps.signatures.mSigningDetails.signatures; + p2SigningDetails = ps.signatures.mSigningDetails; } else { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } } else { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } - return compareSignatures(s1, s2); + return checkSignaturesInternal(p1SigningDetails, p2SigningDetails); + } + } + + private int checkSignaturesInternal(SigningDetails p1SigningDetails, + SigningDetails p2SigningDetails) { + if (p1SigningDetails == null) { + return p2SigningDetails == null + ? PackageManager.SIGNATURE_NEITHER_SIGNED + : PackageManager.SIGNATURE_FIRST_NOT_SIGNED; } + if (p2SigningDetails == null) { + return PackageManager.SIGNATURE_SECOND_NOT_SIGNED; + } + int result = compareSignatures(p1SigningDetails.signatures, p2SigningDetails.signatures); + if (result == PackageManager.SIGNATURE_MATCH) { + return result; + } + // To support backwards compatibility with clients of this API expecting pre-key + // rotation results if either of the packages has a signing lineage the oldest signer + // in the lineage is used for signature verification. + if (p1SigningDetails.hasPastSigningCertificates() + || p2SigningDetails.hasPastSigningCertificates()) { + Signature[] p1Signatures = p1SigningDetails.hasPastSigningCertificates() + ? new Signature[]{p1SigningDetails.pastSigningCertificates[0]} + : p1SigningDetails.signatures; + Signature[] p2Signatures = p2SigningDetails.hasPastSigningCertificates() + ? new Signature[]{p2SigningDetails.pastSigningCertificates[0]} + : p2SigningDetails.signatures; + result = compareSignatures(p1Signatures, p2Signatures); + } + return result; } @Override diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java index 9a297d601a6b..a83fa32ec9a9 100644 --- a/services/core/java/com/android/server/pm/StagingManager.java +++ b/services/core/java/com/android/server/pm/StagingManager.java @@ -61,6 +61,7 @@ import android.text.TextUtils; import android.util.IntArray; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.apk.ApkSignatureVerifier; @@ -137,6 +138,9 @@ public class StagingManager { synchronized (mStagedSessions) { for (int i = 0; i < mStagedSessions.size(); i++) { final PackageInstallerSession stagedSession = mStagedSessions.valueAt(i); + if (stagedSession.isDestroyed()) { + continue; + } result.add(stagedSession.generateInfoForCaller(false /*icon*/, callingUid)); } } @@ -202,7 +206,7 @@ public class StagingManager { final IntArray childSessionIds = new IntArray(); if (session.isMultiPackage()) { for (int id : session.getChildSessionIds()) { - if (isApexSession(mStagedSessions.get(id))) { + if (isApexSession(getStagedSession(id))) { childSessionIds.add(id); } } @@ -797,6 +801,8 @@ public class StagingManager { + session.sessionId + " [" + errorMessage + "]"); session.setStagedSessionFailed( SessionInfo.STAGED_SESSION_VERIFICATION_FAILED, errorMessage); + mPreRebootVerificationHandler.onPreRebootVerificationComplete( + session.sessionId); return; } mPreRebootVerificationHandler.notifyPreRebootVerification_Apk_Complete( @@ -880,7 +886,8 @@ public class StagingManager { synchronized (mStagedSessions) { for (int i = 0; i < mStagedSessions.size(); i++) { final PackageInstallerSession stagedSession = mStagedSessions.valueAt(i); - if (!stagedSession.isCommitted() || stagedSession.isStagedAndInTerminalState()) { + if (!stagedSession.isCommitted() || stagedSession.isStagedAndInTerminalState() + || stagedSession.isDestroyed()) { continue; } if (stagedSession.isMultiPackage()) { @@ -943,27 +950,68 @@ public class StagingManager { } } - void abortCommittedSession(@NonNull PackageInstallerSession session) { + /** + * <p>Abort committed staged session + * + * <p>This method must be called while holding {@link PackageInstallerSession.mLock}. + * + * <p>The method returns {@code false} to indicate it is not safe to clean up the session from + * system yet. When it is safe, the method returns {@code true}. + * + * <p> When it is safe to clean up, {@link StagingManager} will call + * {@link PackageInstallerSession#abandon()} on the session again. + * + * @return {@code true} if it is safe to cleanup the session resources, otherwise {@code false}. + */ + boolean abortCommittedSessionLocked(@NonNull PackageInstallerSession session) { + int sessionId = session.sessionId; if (session.isStagedSessionApplied()) { - Slog.w(TAG, "Cannot abort applied session : " + session.sessionId); - return; + Slog.w(TAG, "Cannot abort applied session : " + sessionId); + return false; + } + if (!session.isDestroyed()) { + throw new IllegalStateException("Committed session must be destroyed before aborting it" + + " from StagingManager"); + } + if (getStagedSession(sessionId) == null) { + Slog.w(TAG, "Session " + sessionId + " has been abandoned already"); + return false; } - abortSession(session); - boolean hasApex = sessionContainsApex(session); - if (hasApex) { - ApexSessionInfo apexSession = mApexManager.getStagedSessionInfo(session.sessionId); - if (apexSession == null || isApexSessionFinalized(apexSession)) { - Slog.w(TAG, - "Cannot abort session " + session.sessionId - + " because it is not active or APEXD is not reachable"); - return; - } - try { - mApexManager.abortStagedSession(session.sessionId); - } catch (Exception ignore) { + // If pre-reboot verification is running, then return false. StagingManager will call + // abandon again when pre-reboot verification ends. + if (mPreRebootVerificationHandler.isVerificationRunning(sessionId)) { + Slog.w(TAG, "Session " + sessionId + " aborted before pre-reboot " + + "verification completed."); + return false; + } + + // A session could be marked ready once its pre-reboot verification ends + if (session.isStagedSessionReady()) { + if (sessionContainsApex(session)) { + try { + ApexSessionInfo apexSession = + mApexManager.getStagedSessionInfo(session.sessionId); + if (apexSession == null || isApexSessionFinalized(apexSession)) { + Slog.w(TAG, + "Cannot abort session " + session.sessionId + + " because it is not active."); + } else { + mApexManager.abortStagedSession(session.sessionId); + } + } catch (Exception e) { + // Failed to contact apexd service. The apex might still be staged. We can still + // safely cleanup the staged session since pre-reboot verification is complete. + // Also, cleaning up the stageDir prevents the apex from being activated. + Slog.w(TAG, "Could not contact apexd to abort staged session " + sessionId); + } } } + + // Session was successfully aborted from apexd (if required) and pre-reboot verification + // is also complete. It is now safe to clean up the session from system. + abortSession(session); + return true; } private boolean isApexSessionFinalized(ApexSessionInfo session) { @@ -1042,6 +1090,11 @@ public class StagingManager { // Final states, nothing to do. return; } + if (session.isDestroyed()) { + // Device rebooted before abandoned session was cleaned up. + session.abandon(); + return; + } if (!session.isStagedSessionReady()) { // The framework got restarted before the pre-reboot verification could complete, // restart the verification. @@ -1124,10 +1177,20 @@ public class StagingManager { } } + private PackageInstallerSession getStagedSession(int sessionId) { + PackageInstallerSession session; + synchronized (mStagedSessions) { + session = mStagedSessions.get(sessionId); + } + return session; + } + private final class PreRebootVerificationHandler extends Handler { // Hold session ids before handler gets ready to do the verification. private IntArray mPendingSessionIds; private boolean mIsReady; + @GuardedBy("mVerificationRunning") + private final SparseBooleanArray mVerificationRunning = new SparseBooleanArray(); PreRebootVerificationHandler(Looper looper) { super(looper); @@ -1155,13 +1218,15 @@ public class StagingManager { @Override public void handleMessage(Message msg) { final int sessionId = msg.arg1; - final PackageInstallerSession session; - synchronized (mStagedSessions) { - session = mStagedSessions.get(sessionId); - } - // Maybe session was aborted before pre-reboot verification was complete + final PackageInstallerSession session = getStagedSession(sessionId); if (session == null) { - Slog.d(TAG, "Stopping pre-reboot verification for sessionId: " + sessionId); + Slog.wtf(TAG, "Session disappeared in the middle of pre-reboot verification: " + + sessionId); + return; + } + if (session.isDestroyed()) { + // No point in running verification on a destroyed session + onPreRebootVerificationComplete(sessionId); return; } switch (msg.what) { @@ -1200,9 +1265,40 @@ public class StagingManager { mPendingSessionIds.add(sessionId); return; } + + PackageInstallerSession session = getStagedSession(sessionId); + synchronized (mVerificationRunning) { + // Do not start verification on a session that has been abandoned + if (session == null || session.isDestroyed()) { + return; + } + Slog.d(TAG, "Starting preRebootVerification for session " + sessionId); + mVerificationRunning.put(sessionId, true); + } obtainMessage(MSG_PRE_REBOOT_VERIFICATION_START, sessionId, 0).sendToTarget(); } + // Things to do when pre-reboot verification completes for a particular sessionId + private void onPreRebootVerificationComplete(int sessionId) { + // Remove it from mVerificationRunning so that verification is considered complete + synchronized (mVerificationRunning) { + Slog.d(TAG, "Stopping preRebootVerification for session " + sessionId); + mVerificationRunning.delete(sessionId); + } + // Check if the session was destroyed while pre-reboot verification was running. If so, + // abandon it again. + PackageInstallerSession session = getStagedSession(sessionId); + if (session != null && session.isDestroyed()) { + session.abandon(); + } + } + + private boolean isVerificationRunning(int sessionId) { + synchronized (mVerificationRunning) { + return mVerificationRunning.get(sessionId); + } + } + private void notifyPreRebootVerification_Start_Complete(int sessionId) { obtainMessage(MSG_PRE_REBOOT_VERIFICATION_APEX, sessionId, 0).sendToTarget(); } @@ -1221,8 +1317,6 @@ public class StagingManager { * See {@link PreRebootVerificationHandler} to see all nodes of pre reboot verification */ private void handlePreRebootVerification_Start(@NonNull PackageInstallerSession session) { - Slog.d(TAG, "Starting preRebootVerification for session " + session.sessionId); - if ((session.params.installFlags & PackageManager.INSTALL_ENABLE_ROLLBACK) != 0) { // If rollback is enabled for this session, we call through to the RollbackManager // with the list of sessions it must enable rollback for. Note that @@ -1269,6 +1363,7 @@ public class StagingManager { } } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage()); + onPreRebootVerificationComplete(session.sessionId); return; } @@ -1301,6 +1396,7 @@ public class StagingManager { // TODO(b/118865310): abort the session on apexd. } catch (PackageManagerException e) { session.setStagedSessionFailed(e.error, e.getMessage()); + onPreRebootVerificationComplete(session.sessionId); } } @@ -1323,9 +1419,18 @@ public class StagingManager { Slog.e(TAG, "Failed to get hold of StorageManager", e); session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, "Failed to get hold of StorageManager"); + onPreRebootVerificationComplete(session.sessionId); return; } + // Stop pre-reboot verification before marking session ready. From this point on, if we + // abandon the session then it will be cleaned up immediately. If session is abandoned + // after this point, then even if for some reason system tries to install the session + // or activate its apex, there won't be any files to work with as they will be cleaned + // up by the system as part of abandonment. If session is abandoned before this point, + // then the session is already destroyed and cannot be marked ready anymore. + onPreRebootVerificationComplete(session.sessionId); + // Proactively mark session as ready before calling apexd. Although this call order // looks counter-intuitive, this is the easiest way to ensure that session won't end up // in the inconsistent state: @@ -1337,15 +1442,16 @@ public class StagingManager { // only apex part of the train will be applied, leaving device in an inconsistent state. Slog.d(TAG, "Marking session " + session.sessionId + " as ready"); session.setStagedSessionReady(); - final boolean hasApex = sessionContainsApex(session); - if (!hasApex) { - // Session doesn't contain apex, nothing to do. - return; - } - try { - mApexManager.markStagedSessionReady(session.sessionId); - } catch (PackageManagerException e) { - session.setStagedSessionFailed(e.error, e.getMessage()); + if (session.isStagedSessionReady()) { + final boolean hasApex = sessionContainsApex(session); + if (hasApex) { + try { + mApexManager.markStagedSessionReady(session.sessionId); + } catch (PackageManagerException e) { + session.setStagedSessionFailed(e.error, e.getMessage()); + return; + } + } } } } diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING index eb79b6ec652a..d3cd1a90b0b6 100644 --- a/services/core/java/com/android/server/pm/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/TEST_MAPPING @@ -37,6 +37,9 @@ }, { "include-filter": "android.content.pm.cts.PackageManagerShellCommandIncrementalTest" + }, + { + "include-filter": "android.content.pm.cts.PackageManagerTest" } ] }, diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index e6af86e52035..16d96d9a5574 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4516,8 +4516,8 @@ public class UserManagerService extends IUserManager.Stub { switch(cmd) { case "list": return runList(pw, shell); - case "list-missing-system-packages": - return runListMissingSystemPackages(pw, shell); + case "report-system-user-package-whitelist-problems": + return runReportPackageWhitelistProblems(pw, shell); default: return shell.handleDefaultCommands(cmd); } @@ -4584,17 +4584,22 @@ public class UserManagerService extends IUserManager.Stub { } } - private int runListMissingSystemPackages(PrintWriter pw, Shell shell) { + private int runReportPackageWhitelistProblems(PrintWriter pw, Shell shell) { boolean verbose = false; - boolean force = false; + boolean criticalOnly = false; + int mode = UserSystemPackageInstaller.USER_TYPE_PACKAGE_WHITELIST_MODE_NONE; String opt; while ((opt = shell.getNextOption()) != null) { switch (opt) { case "-v": + case "--verbose": verbose = true; break; - case "--force": - force = true; + case "--critical-only": + criticalOnly = true; + break; + case "--mode": + mode = Integer.parseInt(shell.getNextArgRequired()); break; default: pw.println("Invalid option: " + opt); @@ -4602,8 +4607,12 @@ public class UserManagerService extends IUserManager.Stub { } } + Slog.d(LOG_TAG, "runReportPackageWhitelistProblems(): verbose=" + verbose + + ", criticalOnly=" + criticalOnly + + ", mode=" + UserSystemPackageInstaller.modeToString(mode)); + try (IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ")) { - mSystemPackageInstaller.dumpMissingSystemPackages(ipw, force, verbose); + mSystemPackageInstaller.dumpPackageWhitelistProblems(ipw, mode, verbose, criticalOnly); } return 0; } @@ -5176,13 +5185,18 @@ public class UserManagerService extends IUserManager.Stub { final PrintWriter pw = getOutPrintWriter(); pw.println("User manager (user) commands:"); pw.println(" help"); - pw.println(" Print this help text."); + pw.println(" Prints this help text."); pw.println(""); pw.println(" list [-v] [-all]"); pw.println(" Prints all users on the system."); - pw.println(" list-missing-system-packages [-v] [--force]"); - pw.println(" Prints all system packages that were not explicitly configured to be " - + "installed."); + pw.println(" report-system-user-package-whitelist-problems [-v | --verbose] " + + "[--critical-only] [--mode MODE]"); + pw.println(" Reports all issues on user-type package whitelist XML files. Options:"); + pw.println(" -v | --verbose : shows extra info, like number of issues"); + pw.println(" --critical-only: show only critical issues, excluding warnings"); + pw.println(" --mode MODE: shows what errors would be if device used mode MODE (where" + + " MODE is the whitelist mode integer as defined by " + + "config_userTypePackageWhitelistMode)"); } } diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index 0b6024a84f78..1fec8aa0a3ff 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -208,7 +208,6 @@ public class UserRestrictionsUtils { Sets.newArraySet( UserManager.DISALLOW_CONFIG_DATE_TIME, UserManager.DISALLOW_CAMERA, - UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_BLUETOOTH, UserManager.DISALLOW_BLUETOOTH_SHARING, UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java index cd1087f5fcd7..f8d039c349ff 100644 --- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java +++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java @@ -27,7 +27,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.Pair; +import android.util.DebugUtils; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; @@ -41,6 +41,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -111,14 +112,20 @@ class UserSystemPackageInstaller { * frameworks/base/core/res/res/values/config.xml */ static final String PACKAGE_WHITELIST_MODE_PROP = "persist.debug.user.package_whitelist_mode"; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE = 0x00; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE = 0x01; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_LOG = 0x02; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST = 0x04; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST_SYSTEM = 0x08; - static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IGNORE_OTA = 0x10; + + // NOTE: flags below are public so they can used by DebugUtils.flagsToString. And this class + // itself is package-protected, so it doesn't matter... + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE = 0x00; + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE = 0x01; + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_LOG = 0x02; + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST = 0x04; + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST_SYSTEM = 0x08; + public static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IGNORE_OTA = 0x10; static final int USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT = -1; + // Used by Shell command only + static final int USER_TYPE_PACKAGE_WHITELIST_MODE_NONE = -1000; + @IntDef(flag = true, prefix = "USER_TYPE_PACKAGE_WHITELIST_MODE_", value = { USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE, USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE, @@ -266,58 +273,56 @@ class UserSystemPackageInstaller { if (!isLogMode(mode) && !isEnforceMode(mode)) { return; } - final List<Pair<Boolean, String>> warnings = checkSystemPackagesWhitelistWarnings(mode); - final int size = warnings.size(); - if (size == 0) { - Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + mode + "): no warnings"); - return; + Slog.v(TAG, "Checking that all system packages are whitelisted."); + + // Check whether all whitelisted packages are indeed on the system. + final List<String> warnings = getPackagesWhitelistWarnings(); + final int numberWarnings = warnings.size(); + if (numberWarnings == 0) { + Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + modeToString(mode) + + ") has no warnings"); + } else { + Slog.w(TAG, "checkWhitelistedSystemPackages(mode=" + modeToString(mode) + + ") has " + numberWarnings + " warnings:"); + for (int i = 0; i < numberWarnings; i++) { + Slog.w(TAG, warnings.get(i)); + } } + // Check whether all system packages are indeed whitelisted. if (isImplicitWhitelistMode(mode) && !isLogMode(mode)) { - // Only shows whether all whitelisted packages are indeed on the system. - for (int i = 0; i < size; i++) { - final Pair<Boolean, String> pair = warnings.get(i); - final boolean isSevere = pair.first; - if (!isSevere) { - final String msg = pair.second; - Slog.w(TAG, msg); - } - } return; } - Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + mode + "): " + size + " warnings"); + final List<String> errors = getPackagesWhitelistErrors(mode); + final int numberErrors = errors.size(); + + if (numberErrors == 0) { + Slog.v(TAG, "checkWhitelistedSystemPackages(mode=" + modeToString(mode) + + ") has no errors"); + return; + } + Slog.e(TAG, "checkWhitelistedSystemPackages(mode=" + modeToString(mode) + ") has " + + numberErrors + " errors:"); + boolean doWtf = !isImplicitWhitelistMode(mode); - for (int i = 0; i < size; i++) { - final Pair<Boolean, String> pair = warnings.get(i); - final boolean isSevere = pair.first; - final String msg = pair.second; - if (isSevere) { - if (doWtf) { - Slog.wtf(TAG, msg); - } else { - Slog.e(TAG, msg); - } + for (int i = 0; i < numberErrors; i++) { + final String msg = errors.get(i); + if (doWtf) { + Slog.wtf(TAG, msg); } else { - Slog.w(TAG, msg); + Slog.e(TAG, msg); } } } - // TODO: method below was created to refactor the one-time logging logic so it can be used on - // dump / cmd as well. It could to be further refactored (for example, creating a new - // structure for the warnings so it doesn't need a Pair). /** - * Gets warnings for system user whitelisting. - * - * @return list of warnings, where {@code Pair.first} is the severity ({@code true} for WTF, - * {@code false} for WARN) and {@code Pair.second} the message. + * Gets packages that are listed in the whitelist XML but are not present on the system image. */ @NonNull - private List<Pair<Boolean, String>> checkSystemPackagesWhitelistWarnings( - @PackageWhitelistMode int mode) { + private List<String> getPackagesWhitelistWarnings() { final Set<String> allWhitelistedPackages = getWhitelistedSystemPackages(); - final List<Pair<Boolean, String>> warnings = new ArrayList<>(); + final List<String> warnings = new ArrayList<>(); final PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class); // Check whether all whitelisted packages are indeed on the system. @@ -326,25 +331,39 @@ class UserSystemPackageInstaller { for (String pkgName : allWhitelistedPackages) { final AndroidPackage pkg = pmInt.getPackage(pkgName); if (pkg == null) { - warnings.add(new Pair<>(false, String.format(notPresentFmt, pkgName))); + warnings.add(String.format(notPresentFmt, pkgName)); } else if (!pkg.isSystem()) { - warnings.add(new Pair<>(false, String.format(notSystemFmt, pkgName))); + warnings.add(String.format(notSystemFmt, pkgName)); } } + return warnings; + } + + /** + * Gets packages that are not listed in the whitelist XMLs when they should be. + */ + @NonNull + private List<String> getPackagesWhitelistErrors(@PackageWhitelistMode int mode) { + if ((!isEnforceMode(mode) || isImplicitWhitelistMode(mode)) && !isLogMode(mode)) { + return Collections.emptyList(); + } + + final List<String> errors = new ArrayList<>(); + final Set<String> allWhitelistedPackages = getWhitelistedSystemPackages(); + final PackageManagerInternal pmInt = LocalServices.getService(PackageManagerInternal.class); // Check whether all system packages are indeed whitelisted. final String logMessageFmt = "System package %s is not whitelisted using " + "'install-in-user-type' in SystemConfig for any user types!"; - final boolean isSevere = isEnforceMode(mode); pmInt.forEachPackage(pkg -> { if (!pkg.isSystem()) return; final String pkgName = pkg.getManifestPackageName(); if (!allWhitelistedPackages.contains(pkgName)) { - warnings.add(new Pair<>(isSevere, String.format(logMessageFmt, pkgName))); + errors.add(String.format(logMessageFmt, pkgName)); } }); - return warnings; + return errors; } /** Whether to only install system packages in new users for which they are whitelisted. */ @@ -420,10 +439,28 @@ class UserSystemPackageInstaller { if (runtimeMode != USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT) { return runtimeMode; } + return getDeviceDefaultWhitelistMode(); + } + + /** Gets the PackageWhitelistMode as defined by {@code config_userTypePackageWhitelistMode}. */ + private @PackageWhitelistMode int getDeviceDefaultWhitelistMode() { return Resources.getSystem() .getInteger(com.android.internal.R.integer.config_userTypePackageWhitelistMode); } + static @NonNull String modeToString(@PackageWhitelistMode int mode) { + // Must handle some types separately because they're not bitwise flags + switch (mode) { + case USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT: + return "DEVICE_DEFAULT"; + case USER_TYPE_PACKAGE_WHITELIST_MODE_NONE: + return "NONE"; + default: + return DebugUtils.flagsToString(UserSystemPackageInstaller.class, + "USER_TYPE_PACKAGE_WHITELIST_MODE_", mode); + } + } + /** * Gets the system packages names that should be installed on the given user. * See {@link #getInstallablePackagesForUserType(String)}. @@ -703,34 +740,44 @@ class UserSystemPackageInstaller { pw.decreaseIndent(); pw.decreaseIndent(); pw.increaseIndent(); - dumpMissingSystemPackages(pw, /* force= */ true, /* verbose= */ true); + dumpPackageWhitelistProblems(pw, mode, /* verbose= */ true, /* criticalOnly= */ false); pw.decreaseIndent(); } - void dumpMissingSystemPackages(IndentingPrintWriter pw, boolean force, boolean verbose) { - final int mode = getWhitelistMode(); - final boolean show = force || (isEnforceMode(mode) && !isImplicitWhitelistMode(mode)); - if (!show) return; + void dumpPackageWhitelistProblems(IndentingPrintWriter pw, @PackageWhitelistMode int mode, + boolean verbose, boolean criticalOnly) { + // Handle special cases first + if (mode == USER_TYPE_PACKAGE_WHITELIST_MODE_NONE) { + mode = getWhitelistMode(); + } else if (mode == USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT) { + mode = getDeviceDefaultWhitelistMode(); + } + Slog.v(TAG, "dumpPackageWhitelistProblems(): using mode " + modeToString(mode)); + + final List<String> errors = getPackagesWhitelistErrors(mode); + showIssues(pw, verbose, errors, "errors"); - final List<Pair<Boolean, String>> warnings = checkSystemPackagesWhitelistWarnings(mode); - final int size = warnings.size(); + if (criticalOnly) return; + final List<String> warnings = getPackagesWhitelistWarnings(); + showIssues(pw, verbose, warnings, "warnings"); + } + + private static void showIssues(IndentingPrintWriter pw, boolean verbose, List<String> issues, + String issueType) { + final int size = issues.size(); if (size == 0) { if (verbose) { - pw.println("All system packages are accounted for"); + pw.print("No "); pw.println(issueType); } return; } - if (verbose) { - pw.print(size); pw.println(" warnings for system user:"); + pw.print(size); pw.print(' '); pw.println(issueType); pw.increaseIndent(); } for (int i = 0; i < size; i++) { - final Pair<Boolean, String> pair = warnings.get(i); - final String lvl = pair.first ? "WTF" : "WARN"; - final String msg = pair.second; - pw.print(lvl); pw.print(": "); pw.println(msg); + pw.println(issues.get(i)); } if (verbose) { pw.decreaseIndent(); diff --git a/services/core/java/com/android/server/pm/UserTypeDetails.java b/services/core/java/com/android/server/pm/UserTypeDetails.java index 826cd3f75222..717737f831da 100644 --- a/services/core/java/com/android/server/pm/UserTypeDetails.java +++ b/services/core/java/com/android/server/pm/UserTypeDetails.java @@ -255,8 +255,27 @@ public final class UserTypeDetails { pw.print(prefix); pw.print("mDefaultUserInfoFlags: "); pw.println(UserInfo.flagsToString(mDefaultUserInfoPropertyFlags)); pw.print(prefix); pw.print("mLabel: "); pw.println(mLabel); - pw.print(prefix); pw.println("mDefaultRestrictions: "); - UserRestrictionsUtils.dumpRestrictions(pw, prefix + " ", mDefaultRestrictions); + + if (isSystem()) { + pw.print(prefix); pw.println("config_defaultFirstUserRestrictions: "); + try { + final Bundle restrictions = new Bundle(); + final String[] defaultFirstUserRestrictions = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_defaultFirstUserRestrictions); + for (String userRestriction : defaultFirstUserRestrictions) { + if (UserRestrictionsUtils.isValidRestriction(userRestriction)) { + restrictions.putBoolean(userRestriction, true); + } + } + UserRestrictionsUtils.dumpRestrictions(pw, prefix + " ", restrictions); + } catch (Resources.NotFoundException e) { + pw.print(prefix); pw.println(" none - resource not found"); + } + } else { + pw.print(prefix); pw.println("mDefaultRestrictions: "); + UserRestrictionsUtils.dumpRestrictions(pw, prefix + " ", mDefaultRestrictions); + } + pw.print(prefix); pw.print("mIconBadge: "); pw.println(mIconBadge); pw.print(prefix); pw.print("mBadgePlain: "); pw.println(mBadgePlain); pw.print(prefix); pw.print("mBadgeNoBackground: "); pw.println(mBadgeNoBackground); diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 9051d85b2140..8f3bf39d4fc5 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -408,6 +408,25 @@ public final class DefaultPermissionGrantPolicy { } grantRuntimePermissionsForSystemPackage(pm, userId, pkg); } + + // Grant READ_PHONE_STATE to all system apps that have READ_PRIVILEGED_PHONE_STATE + for (PackageInfo pkg : packages) { + if (pkg == null + || !doesPackageSupportRuntimePermissions(pkg) + || ArrayUtils.isEmpty(pkg.requestedPermissions) + || !pkg.applicationInfo.isPrivilegedApp()) { + continue; + } + for (String permission : pkg.requestedPermissions) { + if (Manifest.permission.READ_PRIVILEGED_PHONE_STATE.equals(permission)) { + grantRuntimePermissions(pm, pkg, + Collections.singleton(Manifest.permission.READ_PHONE_STATE), + true, // systemFixed + userId); + } + } + } + } @SafeVarargs diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index f17890334b6d..a1cc44adc704 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -149,6 +149,8 @@ import com.android.server.policy.SoftRestrictedPermissionPolicy; import libcore.util.EmptyArray; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -417,6 +419,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { LocalServices.addService(PermissionManagerInternal.class, localService); } + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + mContext.getSystemService(PermissionControllerManager.class).dump(fd, pw, args); + } + /** * Creates and returns an initialized, internal service for use by other components. * <p> @@ -1282,6 +1289,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName); final int callingUid = Binder.getCallingUid(); + final int packageUid = UserHandle.getUid(userId, pkg.getUid()); if (!checkAutoRevokeAccess(pkg, callingUid)) { return false; @@ -1289,7 +1297,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { if (mAppOpsManager .checkOpNoThrow(AppOpsManager.OP_AUTO_REVOKE_MANAGED_BY_INSTALLER, - callingUid, packageName) + packageUid, packageName) != MODE_ALLOWED) { // Whitelist user set - don't override return false; @@ -1298,7 +1306,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { final long identity = Binder.clearCallingIdentity(); try { mAppOpsManager.setMode(AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, - callingUid, packageName, + packageUid, packageName, whitelisted ? MODE_IGNORED : MODE_ALLOWED); } finally { Binder.restoreCallingIdentity(identity); @@ -1331,6 +1339,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { final AndroidPackage pkg = mPackageManagerInt.getPackage(packageName); final int callingUid = Binder.getCallingUid(); + final int packageUid = UserHandle.getUid(userId, pkg.getUid()); if (!checkAutoRevokeAccess(pkg, callingUid)) { return false; @@ -1339,7 +1348,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { final long identity = Binder.clearCallingIdentity(); try { return mAppOpsManager.checkOpNoThrow( - AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, callingUid, packageName) + AppOpsManager.OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED, packageUid, packageName) == MODE_IGNORED; } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index 341fadc3b577..8648a2392d9e 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -208,15 +208,21 @@ public final class PermissionPolicyService extends SystemService { for (int i = 0; i < appOpPermissionInfosSize; i++) { final PermissionInfo appOpPermissionInfo = appOpPermissionInfos.get(i); - final int appOpCode = AppOpsManager.permissionToOpCode(appOpPermissionInfo.name); - if (appOpCode != OP_NONE) { - mAppOpPermissions.add(appOpPermissionInfo.name); - - try { - appOpsService.startWatchingMode(appOpCode, null, mAppOpsCallback); - } catch (RemoteException e) { - Slog.wtf(LOG_TAG, "Cannot set up app-ops listener", e); - } + switch (appOpPermissionInfo.name) { + case android.Manifest.permission.ACCESS_NOTIFICATIONS: + case android.Manifest.permission.MANAGE_IPSEC_TUNNELS: + continue; + default: + final int appOpCode = AppOpsManager.permissionToOpCode( + appOpPermissionInfo.name); + if (appOpCode != OP_NONE) { + mAppOpPermissions.add(appOpPermissionInfo.name); + try { + appOpsService.startWatchingMode(appOpCode, null, mAppOpsCallback); + } catch (RemoteException e) { + Slog.wtf(LOG_TAG, "Cannot set up app-ops listener", e); + } + } } } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index b0c702f55821..3b4c4235d8a4 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -30,6 +30,7 @@ import static android.util.MathUtils.abs; import static android.util.MathUtils.constrain; import static com.android.internal.util.FrameworkStatsLog.ANNOTATION_ID_IS_UID; +import static com.android.internal.util.FrameworkStatsLog.ANNOTATION_ID_TRUNCATE_TIMESTAMP; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem; import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs; import static com.android.server.stats.pull.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs; @@ -755,6 +756,13 @@ public class StatsPullAtomService extends SystemService { stats.getValues(j, entry); StatsEvent.Builder e = StatsEvent.newBuilder(); e.setAtomId(atomTag); + switch (atomTag) { + case FrameworkStatsLog.MOBILE_BYTES_TRANSFER: + case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: + e.addBooleanAnnotation(ANNOTATION_ID_TRUNCATE_TIMESTAMP, true); + break; + default: + } e.writeInt(entry.uid); e.addBooleanAnnotation(ANNOTATION_ID_IS_UID, true); if (withFgbg) { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 289bf66e1add..4ba58bd259fc 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -665,12 +665,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void showAuthenticationDialog(Bundle bundle, IBiometricServiceReceiverInternal receiver, int biometricModality, boolean requireConfirmation, int userId, String opPackageName, - long operationId) { + long operationId, int sysUiSessionId) { enforceBiometricDialog(); if (mBar != null) { try { mBar.showAuthenticationDialog(bundle, receiver, biometricModality, - requireConfirmation, userId, opPackageName, operationId); + requireConfirmation, userId, opPackageName, operationId, sysUiSessionId); } catch (RemoteException ex) { } } diff --git a/services/core/java/com/android/server/uri/UriGrantsManagerService.java b/services/core/java/com/android/server/uri/UriGrantsManagerService.java index 6734ce76675d..72cdf4afb007 100644 --- a/services/core/java/com/android/server/uri/UriGrantsManagerService.java +++ b/services/core/java/com/android/server/uri/UriGrantsManagerService.java @@ -21,9 +21,8 @@ import static android.Manifest.permission.FORCE_PERSISTABLE_URI_PERMISSIONS; import static android.Manifest.permission.GET_APP_GRANTED_URI_PERMISSIONS; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; +import static android.content.Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION; import static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; -import static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION; -import static android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION; import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; @@ -1138,8 +1137,8 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub { targetHoldsPermission = false; } - final boolean basicGrant = (modeFlags & ~(FLAG_GRANT_READ_URI_PERMISSION - | FLAG_GRANT_WRITE_URI_PERMISSION)) == 0; + final boolean basicGrant = (modeFlags + & (FLAG_GRANT_PERSISTABLE_URI_PERMISSION | FLAG_GRANT_PREFIX_URI_PERMISSION)) == 0; if (basicGrant && targetHoldsPermission) { // When caller holds permission, and this is a simple permission // grant, we can skip generating any bookkeeping; when any advanced diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f05217c0b47a..f33e2eb6d578 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -97,7 +97,6 @@ import static android.view.Display.INVALID_DISPLAY; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; -import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -570,7 +569,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private final WindowState.UpdateReportedVisibilityResults mReportedVisibilityResults = new WindowState.UpdateReportedVisibilityResults(); - boolean mUseTransferredAnimation; + private boolean mUseTransferredAnimation; /** * @see #currentLaunchCanTurnScreenOn() @@ -1160,8 +1159,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else { mLastReportedMultiWindowMode = inMultiWindowMode; computeConfigurationAfterMultiWindowModeChange(); - ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, - true /* ignoreVisibility */); + // If the activity is in stopping or stopped state, for instance, it's in the + // split screen task and not the top one, the last configuration it should keep + // is the one before multi-window mode change. + final ActivityState state = getState(); + if (state != STOPPED && state != STOPPING) { + ensureActivityConfiguration(0 /* globalChanges */, PRESERVE_WINDOWS, + true /* ignoreVisibility */); + } } } } @@ -3366,12 +3371,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } setClientVisible(fromActivity.mClientVisible); - transferAnimation(fromActivity); + if (fromActivity.isAnimating()) { + transferAnimation(fromActivity); - // When transferring an animation, we no longer need to apply an animation to the - // the token we transfer the animation over. Thus, set this flag to indicate we've - // transferred the animation. - mUseTransferredAnimation = true; + // When transferring an animation, we no longer need to apply an animation to + // the token we transfer the animation over. Thus, set this flag to indicate + // we've transferred the animation. + mUseTransferredAnimation = true; + } mWmService.updateFocusedWindowLocked( UPDATE_FOCUS_WILL_PLACE_SURFACES, true /*updateInputWindows*/); @@ -4303,8 +4310,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * screenshot. */ boolean shouldUseAppThemeSnapshot() { - return mDisablePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0, - true /* topToBottom */); + return mDisablePreviewScreenshots || forAllWindows(w -> { + return mWmService.isSecureLocked(w); + }, true /* topToBottom */); } /** diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 4860a8ee3ea1..593e5e73a3b9 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -242,12 +242,6 @@ class ActivityStack extends Task { */ boolean mInResumeTopActivity = false; - private boolean mUpdateBoundsDeferred; - private boolean mUpdateBoundsDeferredCalled; - private boolean mUpdateDisplayedBoundsDeferredCalled; - private final Rect mDeferredBounds = new Rect(); - private final Rect mDeferredDisplayedBounds = new Rect(); - int mCurrentUser; /** For comparison with DisplayContent bounds. */ @@ -846,58 +840,6 @@ class ActivityStack extends Task { return getDisplayContent(); } - /** - * Defers updating the bounds of the stack. If the stack was resized/repositioned while - * deferring, the bounds will update in {@link #continueUpdateBounds()}. - */ - void deferUpdateBounds() { - if (!mUpdateBoundsDeferred) { - mUpdateBoundsDeferred = true; - mUpdateBoundsDeferredCalled = false; - } - } - - /** - * Continues updating bounds after updates have been deferred. If there was a resize attempt - * between {@link #deferUpdateBounds()} and {@link #continueUpdateBounds()}, the stack will - * be resized to that bounds. - */ - void continueUpdateBounds() { - if (mUpdateBoundsDeferred) { - mUpdateBoundsDeferred = false; - if (mUpdateBoundsDeferredCalled) { - setTaskBounds(mDeferredBounds); - setBounds(mDeferredBounds); - } - } - } - - private boolean updateBoundsAllowed(Rect bounds) { - if (!mUpdateBoundsDeferred) { - return true; - } - if (bounds != null) { - mDeferredBounds.set(bounds); - } else { - mDeferredBounds.setEmpty(); - } - mUpdateBoundsDeferredCalled = true; - return false; - } - - private boolean updateDisplayedBoundsAllowed(Rect bounds) { - if (!mUpdateBoundsDeferred) { - return true; - } - if (bounds != null) { - mDeferredDisplayedBounds.set(bounds); - } else { - mDeferredDisplayedBounds.setEmpty(); - } - mUpdateDisplayedBoundsDeferredCalled = true; - return false; - } - /** @return true if the stack can only contain one task */ boolean isSingleTaskInstance() { final DisplayContent display = getDisplay(); @@ -2687,10 +2629,6 @@ class ActivityStack extends Task { // TODO: Can only be called from special methods in ActivityStackSupervisor. // Need to consolidate those calls points into this resize method so anyone can call directly. void resize(Rect displayedBounds, boolean preserveWindows, boolean deferResume) { - if (!updateBoundsAllowed(displayedBounds)) { - return; - } - Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "stack.resize_" + getRootTaskId()); mAtmService.deferWindowLayout(); try { @@ -2730,10 +2668,6 @@ class ActivityStack extends Task { * basically resizes both stack and task bounds to the same bounds. */ private void setTaskBounds(Rect bounds) { - if (!updateBoundsAllowed(bounds)) { - return; - } - final PooledConsumer c = PooledLambda.obtainConsumer(ActivityStack::setTaskBounds, PooledLambda.__(Task.class), bounds); forAllLeafTasks(c, true /* traverseTopToBottom */); diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index ed2153960754..fb7ba62b5fd2 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -69,7 +69,6 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS import static com.android.server.wm.ActivityTaskManagerService.ANIMATE; import static com.android.server.wm.ActivityTaskManagerService.H.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_NONE; -import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONLY; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE; import static com.android.server.wm.RootWindowContainer.TAG_STATES; @@ -125,7 +124,6 @@ import android.os.UserManager; import android.os.WorkSource; import android.provider.MediaStore; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; @@ -364,11 +362,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { */ boolean mAppVisibilitiesChangedSinceLastPause; - /** - * Set of tasks that are in resizing mode during an app transition to fill the "void". - */ - private final ArraySet<Integer> mResizingTasksDuringAnimation = new ArraySet<>(); - private KeyguardController mKeyguardController; private PowerManager mPowerManager; @@ -1415,29 +1408,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { return mLaunchParamsController; } - private void deferUpdateRecentsHomeStackBounds() { - mRootWindowContainer.deferUpdateBounds(ACTIVITY_TYPE_RECENTS); - mRootWindowContainer.deferUpdateBounds(ACTIVITY_TYPE_HOME); - } - - private void continueUpdateRecentsHomeStackBounds() { - mRootWindowContainer.continueUpdateBounds(ACTIVITY_TYPE_RECENTS); - mRootWindowContainer.continueUpdateBounds(ACTIVITY_TYPE_HOME); - } - - void notifyAppTransitionDone() { - continueUpdateRecentsHomeStackBounds(); - for (int i = mResizingTasksDuringAnimation.size() - 1; i >= 0; i--) { - final int taskId = mResizingTasksDuringAnimation.valueAt(i); - final Task task = - mRootWindowContainer.anyTaskForId(taskId, MATCH_TASK_IN_STACKS_ONLY); - if (task != null) { - task.setTaskDockedResizing(false); - } - } - mResizingTasksDuringAnimation.clear(); - } - void setSplitScreenResizing(boolean resizing) { if (resizing == mDockedStackResizing) { return; @@ -2471,16 +2441,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } } - /** - * Puts a task into resizing mode during the next app transition. - * - * @param task The task to put into resizing mode - */ - void setResizingDuringAnimation(Task task) { - mResizingTasksDuringAnimation.add(task.mTaskId); - task.setTaskDockedResizing(true); - } - int startActivityFromRecents(int callingPid, int callingUid, int taskId, SafeActivityOptions options) { Task task = null; @@ -2508,27 +2468,12 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { mService.deferWindowLayout(); try { - if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { - // Defer updating the stack in which recents is until the app transition is done, to - // not run into issues where we still need to draw the task in recents but the - // docked stack is already created. - deferUpdateRecentsHomeStackBounds(); - // TODO(task-hierarchy): Remove when tiles are in hierarchy. - // Unset launching windowing mode to prevent creating split-screen-primary stack - // in RWC#anyTaskForId() below. - activityOptions.setLaunchWindowingMode(WINDOWING_MODE_UNDEFINED); - } - task = mRootWindowContainer.anyTaskForId(taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE, activityOptions, ON_TOP); if (task == null) { - continueUpdateRecentsHomeStackBounds(); mWindowManager.executeAppTransition(); throw new IllegalArgumentException( "startActivityFromRecents: Task " + taskId + " not found."); - } else if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - && task.getWindowingMode() != windowingMode) { - mService.moveTaskToSplitScreenPrimaryTask(task, true /* toTop */); } if (windowingMode != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { @@ -2577,12 +2522,6 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { false /* validateIncomingUser */, null /* originatingPendingIntent */, false /* allowBackgroundActivityStart */); } finally { - if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY && task != null) { - // If we are launching the task in the docked stack, put it into resizing mode so - // the window renders full-screen with the background filling the void. Also only - // call this at the end to make sure that tasks exists on the window manager side. - setResizingDuringAnimation(task); - } mService.continueWindowLayout(); } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 4181f4be30f7..d5df9068e81d 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -152,17 +152,6 @@ public abstract class ActivityTaskManagerInternal { IVoiceInteractor mInteractor); /** - * Callback for window manager to let activity manager know that the app transition was - * cancelled. - */ - public abstract void notifyAppTransitionCancelled(); - - /** - * Callback for window manager to let activity manager know that the app transition is finished. - */ - public abstract void notifyAppTransitionFinished(); - - /** * Returns the top activity from each of the currently visible stacks. The first entry will be * the focused activity. */ diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 6a8d5d905a00..36caeecbfec2 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6079,20 +6079,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public void notifyAppTransitionFinished() { - synchronized (mGlobalLock) { - mStackSupervisor.notifyAppTransitionDone(); - } - } - - @Override - public void notifyAppTransitionCancelled() { - synchronized (mGlobalLock) { - mStackSupervisor.notifyAppTransitionDone(); - } - } - - @Override public List<IBinder> getTopVisibleActivities() { synchronized (mGlobalLock) { return mRootWindowContainer.getTopVisibleActivities(); diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index 654ccc80f8a8..67fe9685fd2a 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -166,19 +166,13 @@ public class AppTransitionController { // done behind a dream window. final ArraySet<Integer> activityTypes = collectActivityTypes(mDisplayContent.mOpeningApps, mDisplayContent.mClosingApps, mDisplayContent.mChangingContainers); - final boolean allowAnimations = mDisplayContent.getDisplayPolicy().allowAppAnimationsLw(); - final ActivityRecord animLpActivity = allowAnimations - ? findAnimLayoutParamsToken(transit, activityTypes) - : null; - final ActivityRecord topOpeningApp = allowAnimations - ? getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */) - : null; - final ActivityRecord topClosingApp = allowAnimations - ? getTopApp(mDisplayContent.mClosingApps, false /* ignoreHidden */) - : null; - final ActivityRecord topChangingApp = allowAnimations - ? getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */) - : null; + final ActivityRecord animLpActivity = findAnimLayoutParamsToken(transit, activityTypes); + final ActivityRecord topOpeningApp = + getTopApp(mDisplayContent.mOpeningApps, false /* ignoreHidden */); + final ActivityRecord topClosingApp = + getTopApp(mDisplayContent.mClosingApps, false /* ignoreHidden */); + final ActivityRecord topChangingApp = + getTopApp(mDisplayContent.mChangingContainers, false /* ignoreHidden */); final WindowManager.LayoutParams animLp = getAnimLp(animLpActivity); overrideWithRemoteAnimationIfSet(animLpActivity, transit, activityTypes); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1f10c467e1e6..0f09752b6f34 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -54,7 +54,6 @@ import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; -import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; @@ -1620,9 +1619,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } } - // Announce rotation only if we will not animate as we already have the - // windows in final state. Otherwise, we make this call at the rotation end. - if (screenRotationAnimation == null && mWmService.mAccessibilityController != null) { + if (mWmService.mAccessibilityController != null) { mWmService.mAccessibilityController.onRotationChangedLocked(this); } } @@ -3707,8 +3704,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } boolean hasSecureWindowOnScreen() { - final WindowState win = getWindow( - w -> w.isOnScreen() && (w.mAttrs.flags & FLAG_SECURE) != 0); + final WindowState win = getWindow(w -> w.isOnScreen() && mWmService.isSecureLocked(w)); return win != null; } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 541be0a8b580..53b536cf712f 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -3154,16 +3154,6 @@ public class DisplayPolicy { return 0; } - /** - * Return true if it is okay to perform animations for an app transition - * that is about to occur. You may return false for this if, for example, - * the dream window is currently displayed so the switch should happen - * immediately. - */ - public boolean allowAppAnimationsLw() { - return !mShowingDream; - } - private void requestTransientBars(WindowState swipeTarget) { if (!mService.mPolicy.isUserSetupComplete()) { // Swipe-up for navigation bar is disabled during setup diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 56986c2e7e41..dfd44f549c49 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -166,11 +166,18 @@ class InsetsSourceProvider { return; } - mTmpRect.set(mWin.getFrameLw()); - if (mFrameProvider != null) { - mFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mTmpRect); + // Make sure we set the valid source frame only when server visible is true, because the + // frame may not yet determined that server side doesn't think the window is ready to + // visible. (i.e. No surface, pending insets that were given during layout, etc..) + if (mServerVisible) { + mTmpRect.set(mWin.getFrameLw()); + if (mFrameProvider != null) { + mFrameProvider.accept(mWin.getDisplayContent().mDisplayFrames, mWin, mTmpRect); + } else { + mTmpRect.inset(mWin.mGivenContentInsets); + } } else { - mTmpRect.inset(mWin.mGivenContentInsets); + mTmpRect.setEmpty(); } mSource.setFrame(mTmpRect); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 8b9e9fe132b7..9a30f1c8e11d 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2504,20 +2504,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return list; } - void deferUpdateBounds(int activityType) { - final ActivityStack stack = getStack(WINDOWING_MODE_UNDEFINED, activityType); - if (stack != null) { - stack.deferUpdateBounds(); - } - } - - void continueUpdateBounds(int activityType) { - final ActivityStack stack = getStack(WINDOWING_MODE_UNDEFINED, activityType); - if (stack != null) { - stack.continueUpdateBounds(); - } - } - @Override public void onDisplayAdded(int displayId) { if (DEBUG_STACK) Slog.v(TAG, "Display added displayId=" + displayId); diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 90936efe6715..14ab2e364a1b 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -732,13 +732,6 @@ class ScreenRotationAnimation { mService.mAnimator.mBulkUpdateParams |= WindowSurfacePlacer.SET_UPDATE_ROTATION; kill(); mService.updateRotation(false, false); - AccessibilityController accessibilityController = mService.mAccessibilityController; - - if (accessibilityController != null) { - // We just finished rotation animation which means we did not - // announce the rotation and waited for it to end, announce now. - accessibilityController.onRotationChangedLocked(mDisplayContent); - } } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 44a8daaba1b1..caa0ddbdc2ae 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -82,7 +82,6 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_TASKS import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.ActivityTaskManagerService.TAG_STACK; -import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.IdentifierProto.HASH_CODE; import static com.android.server.wm.IdentifierProto.TITLE; import static com.android.server.wm.IdentifierProto.USER_ID; @@ -2013,7 +2012,7 @@ class Task extends WindowContainer<WindowContainer> { } void updateSurfaceSize(SurfaceControl.Transaction transaction) { - if (mSurfaceControl == null || mCreatedByOrganizer) { + if (mSurfaceControl == null || isOrganized()) { return; } @@ -3059,15 +3058,6 @@ class Task extends WindowContainer<WindowContainer> { return mDragResizeMode; } - /** - * Puts this task into docked drag resizing mode. See {@link DragResizeMode}. - * - * @param resizing Whether to put the task into drag resize mode. - */ - public void setTaskDockedResizing(boolean resizing) { - setDragResizing(resizing, DRAG_RESIZE_MODE_DOCKED_DIVIDER); - } - void adjustBoundsForDisplayChangeIfNeeded(final DisplayContent displayContent) { if (displayContent == null) { return; diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java index 5f3c63352015..132d00ac91c1 100644 --- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -123,19 +123,20 @@ class WallpaperWindowToken extends WindowToken { } final WallpaperController wallpaperController = mDisplayContent.mWallpaperController; + final WindowState wallpaperTarget = wallpaperController.getWallpaperTarget(); - if (visible) { - final WindowState wallpaperTarget = wallpaperController.getWallpaperTarget(); + if (visible && wallpaperTarget != null) { final RecentsAnimationController recentsAnimationController = mWmService.getRecentsAnimationController(); - if (wallpaperTarget != null - && recentsAnimationController != null + if (recentsAnimationController != null && recentsAnimationController.isAnimatingTask(wallpaperTarget.getTask())) { // If the Recents animation is running, and the wallpaper target is the animating // task we want the wallpaper to be rotated in the same orientation as the // RecentsAnimation's target (e.g the launcher) recentsAnimationController.linkFixedRotationTransformIfNeeded(this); - } else if (wallpaperTarget != null + } else if ((wallpaperTarget.mActivityRecord == null + // Ignore invisible activity because it may be moving to background. + || wallpaperTarget.mActivityRecord.mVisibleRequested) && wallpaperTarget.mToken.hasFixedRotationTransform()) { // If the wallpaper target has a fixed rotation, we want the wallpaper to follow its // rotation diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 73126c8b6b6a..814fa7287646 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -196,6 +196,7 @@ import android.provider.DeviceConfig; import android.provider.Settings; import android.service.vr.IVrManager; import android.service.vr.IVrStateCallbacks; +import android.sysprop.SurfaceFlingerProperties; import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -305,7 +306,9 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; @@ -1064,12 +1067,10 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void onAppTransitionCancelledLocked(int transit) { - mAtmInternal.notifyAppTransitionCancelled(); } @Override public void onAppTransitionFinishedLocked(IBinder token) { - mAtmInternal.notifyAppTransitionFinished(); final ActivityRecord atoken = mRoot.getActivityRecord(token); if (atoken == null) { return; @@ -4694,6 +4695,11 @@ public class WindowManagerService extends IWindowManager.Stub } private static boolean queryWideColorGamutSupport() { + boolean defaultValue = false; + Optional<Boolean> hasWideColorProp = SurfaceFlingerProperties.has_wide_color_display(); + if (hasWideColorProp.isPresent()) { + return hasWideColorProp.get(); + } try { ISurfaceFlingerConfigs surfaceFlinger = ISurfaceFlingerConfigs.getService(); OptionalBool hasWideColor = surfaceFlinger.hasWideColorDisplay(); @@ -4702,11 +4708,18 @@ public class WindowManagerService extends IWindowManager.Stub } } catch (RemoteException e) { // Ignore, we're in big trouble if we can't talk to SurfaceFlinger's config store + } catch (NoSuchElementException e) { + return defaultValue; } return false; } private static boolean queryHdrSupport() { + boolean defaultValue = false; + Optional<Boolean> hasHdrProp = SurfaceFlingerProperties.has_HDR_display(); + if (hasHdrProp.isPresent()) { + return hasHdrProp.get(); + } try { ISurfaceFlingerConfigs surfaceFlinger = ISurfaceFlingerConfigs.getService(); OptionalBool hasHdr = surfaceFlinger.hasHDRDisplay(); @@ -4715,6 +4728,8 @@ public class WindowManagerService extends IWindowManager.Stub } } catch (RemoteException e) { // Ignore, we're in big trouble if we can't talk to SurfaceFlinger's config store + } catch (NoSuchElementException e) { + return defaultValue; } return false; } diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 0e83beed6b90..c570cf1d949f 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -846,6 +846,23 @@ class WindowStateAnimator { } } + private boolean shouldConsumeMainWindowSizeTransaction() { + // We only consume the transaction when the client is calling relayout + // because this is the only time we know the frameNumber will be valid + // due to the client renderer being paused. Put otherwise, only when + // mInRelayout is true can we guarantee the next frame will contain + // the most recent configuration. + if (!mWin.mInRelayout) return false; + // Since we can only do this for one window, we focus on the main application window + if (mAttrType != TYPE_BASE_APPLICATION) return false; + final Task task = mWin.getTask(); + if (task == null) return false; + if (task.getMainWindowSizeChangeTransaction() == null) return false; + // Likewise we only focus on the task root, since we can only use one window + if (!mWin.mActivityRecord.isRootOfTask()) return false; + return true; + } + void setSurfaceBoundariesLocked(final boolean recoveringMemory) { if (mSurfaceController == null) { return; @@ -886,8 +903,9 @@ class WindowStateAnimator { clipRect = mTmpClipRect; } - if (w.mInRelayout && (mAttrType == TYPE_BASE_APPLICATION) && (task != null) - && (task.getMainWindowSizeChangeTransaction() != null)) { + if (shouldConsumeMainWindowSizeTransaction()) { + task.getSurfaceControl().deferTransactionUntil(mWin.getClientViewRootSurface(), + mWin.getFrameNumber()); mSurfaceController.deferTransactionUntil(mWin.getClientViewRootSurface(), mWin.getFrameNumber()); SurfaceControl.mergeToGlobalTransaction(task.getMainWindowSizeChangeTransaction()); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 9bc5d34c11af..20139451e4b9 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -237,27 +237,28 @@ public: /* --- InputDispatcherPolicyInterface implementation --- */ virtual void notifySwitch(nsecs_t when, uint32_t switchValues, uint32_t switchMask, - uint32_t policyFlags); + uint32_t policyFlags) override; virtual void notifyConfigurationChanged(nsecs_t when); - virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, - const sp<IBinder>& token, - const std::string& reason); + virtual nsecs_t notifyAnr(const sp<InputApplicationHandle>& inputApplicationHandle, + const sp<IBinder>& token, const std::string& reason) override; virtual void notifyInputChannelBroken(const sp<IBinder>& token); - virtual void notifyFocusChanged(const sp<IBinder>& oldToken, const sp<IBinder>& newToken); - virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags); - virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig); - virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags); + virtual void notifyFocusChanged(const sp<IBinder>& oldToken, + const sp<IBinder>& newToken) override; + virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) override; + virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) override; + virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, + uint32_t& policyFlags) override; virtual void interceptMotionBeforeQueueing(const int32_t displayId, nsecs_t when, - uint32_t& policyFlags); - virtual nsecs_t interceptKeyBeforeDispatching( - const sp<IBinder>& token, - const KeyEvent* keyEvent, uint32_t policyFlags); - virtual bool dispatchUnhandledKey(const sp<IBinder>& token, - const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); - virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); - virtual bool checkInjectEventsPermissionNonReentrant( - int32_t injectorPid, int32_t injectorUid); - virtual void onPointerDownOutsideFocus(const sp<IBinder>& touchedToken); + uint32_t& policyFlags) override; + virtual nsecs_t interceptKeyBeforeDispatching(const sp<IBinder>& token, + const KeyEvent* keyEvent, + uint32_t policyFlags) override; + virtual bool dispatchUnhandledKey(const sp<IBinder>& token, const KeyEvent* keyEvent, + uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) override; + virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) override; + virtual bool checkInjectEventsPermissionNonReentrant(int32_t injectorPid, + int32_t injectorUid) override; + virtual void onPointerDownOutsideFocus(const sp<IBinder>& touchedToken) override; /* --- PointerControllerPolicyInterface implementation --- */ @@ -692,9 +693,8 @@ static jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, return handle->getInputApplicationHandleObjLocalRef(env); } - -nsecs_t NativeInputManager::notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle, - const sp<IBinder>& token, const std::string& reason) { +nsecs_t NativeInputManager::notifyAnr(const sp<InputApplicationHandle>& inputApplicationHandle, + const sp<IBinder>& token, const std::string& reason) { #if DEBUG_INPUT_DISPATCHER_POLICY ALOGD("notifyANR"); #endif @@ -1453,9 +1453,13 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */, return INPUT_EVENT_INJECTION_FAILED; } - return (jint) im->getInputManager()->getDispatcher()->injectInputEvent( - & keyEvent, injectorPid, injectorUid, syncMode, timeoutMillis, - uint32_t(policyFlags)); + const int32_t result = + im->getInputManager()->getDispatcher()->injectInputEvent(&keyEvent, injectorPid, + injectorUid, syncMode, + std::chrono::milliseconds( + timeoutMillis), + uint32_t(policyFlags)); + return static_cast<jint>(result); } else if (env->IsInstanceOf(inputEventObj, gMotionEventClassInfo.clazz)) { const MotionEvent* motionEvent = android_view_MotionEvent_getNativePtr(env, inputEventObj); if (!motionEvent) { @@ -1463,9 +1467,13 @@ static jint nativeInjectInputEvent(JNIEnv* env, jclass /* clazz */, return INPUT_EVENT_INJECTION_FAILED; } - return (jint) im->getInputManager()->getDispatcher()->injectInputEvent( - motionEvent, injectorPid, injectorUid, syncMode, timeoutMillis, - uint32_t(policyFlags)); + const int32_t result = + (jint)im->getInputManager() + ->getDispatcher() + ->injectInputEvent(motionEvent, injectorPid, injectorUid, syncMode, + std::chrono::milliseconds(timeoutMillis), + uint32_t(policyFlags)); + return static_cast<jint>(result); } else { jniThrowRuntimeException(env, "Invalid input event type."); return INPUT_EVENT_INJECTION_FAILED; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 3323fa4b53e3..966694ad346c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4567,9 +4567,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } if (isProfileOwner(adminReceiver, userHandle)) { if (isProfileOwnerOfOrganizationOwnedDevice(userHandle)) { + UserHandle parentUserHandle = UserHandle.of(getProfileParentId(userHandle)); mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE, - false, - UserHandle.of(getProfileParentId(userHandle))); + false, parentUserHandle); + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, + false, parentUserHandle); } final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle, /* parent */ false); @@ -7213,6 +7215,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mUserManager.setUserRestriction( UserManager.DISALLOW_REMOVE_MANAGED_PROFILE, false, UserHandle.SYSTEM); + mUserManager.setUserRestriction( + UserManager.DISALLOW_ADD_USER, false, UserHandle.SYSTEM); // Device-wide policies set by the profile owner need to be cleaned up here. mLockPatternUtils.setDeviceOwnerInfo(null); @@ -13825,6 +13829,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE, true, parentUser); + mUserManager.setUserRestriction(UserManager.DISALLOW_ADD_USER, true, + parentUser); }); // markProfileOwnerOfOrganizationOwnedDevice will trigger writing of the profile owner diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index c3c215730e4c..a9dc92fca971 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -266,6 +266,7 @@ IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_v mIncFs(sm.getIncFs()), mAppOpsManager(sm.getAppOpsManager()), mJni(sm.getJni()), + mLooper(sm.getLooper()), mIncrementalDir(rootDir) { if (!mVold) { LOG(FATAL) << "Vold service is unavailable"; @@ -276,12 +277,22 @@ IncrementalService::IncrementalService(ServiceManagerWrapper&& sm, std::string_v if (!mAppOpsManager) { LOG(FATAL) << "AppOpsManager is unavailable"; } + if (!mJni) { + LOG(FATAL) << "JNI is unavailable"; + } + if (!mLooper) { + LOG(FATAL) << "Looper is unavailable"; + } mJobQueue.reserve(16); mJobProcessor = std::thread([this]() { mJni->initializeForCurrentThread(); runJobProcessing(); }); + mCmdLooperThread = std::thread([this]() { + mJni->initializeForCurrentThread(); + runCmdLooper(); + }); const auto mountedRootNames = adoptMountedInstances(); mountExistingImages(mountedRootNames); @@ -294,6 +305,7 @@ IncrementalService::~IncrementalService() { } mJobCondition.notify_all(); mJobProcessor.join(); + mCmdLooperThread.join(); } static const char* toString(IncrementalService::BindKind kind) { @@ -1315,6 +1327,13 @@ bool IncrementalService::mountExistingImage(std::string_view root) { return true; } +void IncrementalService::runCmdLooper() { + constexpr auto kTimeoutMsecs = 1000; + while (mRunning.load(std::memory_order_relaxed)) { + mLooper->pollAll(kTimeoutMsecs); + } +} + IncrementalService::DataLoaderStubPtr IncrementalService::prepareDataLoader( IncFsMount& ifs, DataLoaderParamsParcel&& params, const DataLoaderStatusListener* externalListener) { @@ -1337,8 +1356,9 @@ void IncrementalService::prepareDataLoaderLocked(IncFsMount& ifs, DataLoaderPara fsControlParcel.incremental->log.reset(dup(ifs.control.logs())); fsControlParcel.service = new IncrementalServiceConnector(*this, ifs.mountId); - ifs.dataLoaderStub = new DataLoaderStub(*this, ifs.mountId, std::move(params), - std::move(fsControlParcel), externalListener); + ifs.dataLoaderStub = + new DataLoaderStub(*this, ifs.mountId, std::move(params), std::move(fsControlParcel), + externalListener, path::join(ifs.root, constants().mount)); } template <class Duration> @@ -1658,22 +1678,31 @@ void IncrementalService::onAppOpChanged(const std::string& packageName) { IncrementalService::DataLoaderStub::DataLoaderStub(IncrementalService& service, MountId id, DataLoaderParamsParcel&& params, FileSystemControlParcel&& control, - const DataLoaderStatusListener* externalListener) + const DataLoaderStatusListener* externalListener, + std::string&& healthPath) : mService(service), mId(id), mParams(std::move(params)), mControl(std::move(control)), - mListener(externalListener ? *externalListener : DataLoaderStatusListener()) { + mListener(externalListener ? *externalListener : DataLoaderStatusListener()), + mHealthPath(std::move(healthPath)) { + healthStatusOk(); } -IncrementalService::DataLoaderStub::~DataLoaderStub() = default; +IncrementalService::DataLoaderStub::~DataLoaderStub() { + if (mId != kInvalidStorageId) { + cleanupResources(); + } +} void IncrementalService::DataLoaderStub::cleanupResources() { requestDestroy(); auto now = Clock::now(); - std::unique_lock lock(mMutex); + + unregisterFromPendingReads(); + mParams = {}; mControl = {}; mStatusCondition.wait_until(lock, now + 60s, [this] { @@ -1710,21 +1739,19 @@ bool IncrementalService::DataLoaderStub::requestDestroy() { } bool IncrementalService::DataLoaderStub::setTargetStatus(int newStatus) { - int oldStatus, curStatus; { std::unique_lock lock(mMutex); - oldStatus = mTargetStatus; - curStatus = mCurrentStatus; setTargetStatusLocked(newStatus); } - LOG(DEBUG) << "Target status update for DataLoader " << mId << ": " << oldStatus << " -> " - << newStatus << " (current " << curStatus << ")"; return fsmStep(); } void IncrementalService::DataLoaderStub::setTargetStatusLocked(int status) { + auto oldStatus = mTargetStatus; mTargetStatus = status; mTargetStatusTs = Clock::now(); + LOG(DEBUG) << "Target status update for DataLoader " << mId << ": " << oldStatus << " -> " + << status << " (current " << mCurrentStatus << ")"; } bool IncrementalService::DataLoaderStub::bind() { @@ -1797,7 +1824,7 @@ bool IncrementalService::DataLoaderStub::fsmStep() { case IDataLoaderStatusListener::DATA_LOADER_STOPPED: return start(); } - // fallthrough + [[fallthrough]]; } case IDataLoaderStatusListener::DATA_LOADER_CREATED: switch (currentStatus) { @@ -1860,6 +1887,68 @@ binder::Status IncrementalService::DataLoaderStub::onStatusChanged(MountId mount return binder::Status::ok(); } +void IncrementalService::DataLoaderStub::healthStatusOk() { + LOG(DEBUG) << "healthStatusOk: " << mId; + std::unique_lock lock(mMutex); + registerForPendingReads(); +} + +void IncrementalService::DataLoaderStub::healthStatusReadsPending() { + LOG(DEBUG) << "healthStatusReadsPending: " << mId; + requestStart(); + + std::unique_lock lock(mMutex); + unregisterFromPendingReads(); +} + +void IncrementalService::DataLoaderStub::healthStatusBlocked() {} + +void IncrementalService::DataLoaderStub::healthStatusUnhealthy() {} + +void IncrementalService::DataLoaderStub::registerForPendingReads() { + auto pendingReadsFd = mHealthControl.pendingReads(); + if (pendingReadsFd < 0) { + mHealthControl = mService.mIncFs->openMount(mHealthPath); + pendingReadsFd = mHealthControl.pendingReads(); + if (pendingReadsFd < 0) { + LOG(ERROR) << "Failed to open health control for: " << mId << ", path: " << mHealthPath + << "(" << mHealthControl.cmd() << ":" << mHealthControl.pendingReads() << ":" + << mHealthControl.logs() << ")"; + return; + } + } + + mService.mLooper->addFd( + pendingReadsFd, android::Looper::POLL_CALLBACK, android::Looper::EVENT_INPUT, + [](int, int, void* data) -> int { + auto&& self = (DataLoaderStub*)data; + return self->onPendingReads(); + }, + this); + mService.mLooper->wake(); +} + +void IncrementalService::DataLoaderStub::unregisterFromPendingReads() { + const auto pendingReadsFd = mHealthControl.pendingReads(); + if (pendingReadsFd < 0) { + return; + } + + mService.mLooper->removeFd(pendingReadsFd); + mService.mLooper->wake(); + + mHealthControl = {}; +} + +int IncrementalService::DataLoaderStub::onPendingReads() { + if (!mService.mRunning.load(std::memory_order_relaxed)) { + return 0; + } + + healthStatusReadsPending(); + return 0; +} + void IncrementalService::DataLoaderStub::onDump(int fd) { dprintf(fd, " dataLoader: {\n"); dprintf(fd, " currentStatus: %d\n", mCurrentStatus); diff --git a/services/incremental/IncrementalService.h b/services/incremental/IncrementalService.h index cf310b15b6d9..f3fde2a413e8 100644 --- a/services/incremental/IncrementalService.h +++ b/services/incremental/IncrementalService.h @@ -18,6 +18,7 @@ #include <android/content/pm/BnDataLoaderStatusListener.h> #include <android/content/pm/DataLoaderParamsParcel.h> +#include <android/content/pm/FileSystemControlParcel.h> #include <android/content/pm/IDataLoaderStatusListener.h> #include <android/os/incremental/BnIncrementalServiceConnector.h> #include <binder/IAppOpsCallback.h> @@ -160,7 +161,7 @@ private: DataLoaderStub(IncrementalService& service, MountId id, content::pm::DataLoaderParamsParcel&& params, content::pm::FileSystemControlParcel&& control, - const DataLoaderStatusListener* externalListener); + const DataLoaderStatusListener* externalListener, std::string&& healthPath); ~DataLoaderStub(); // Cleans up the internal state and invalidates DataLoaderStub. Any subsequent calls will // result in an error. @@ -178,6 +179,10 @@ private: private: binder::Status onStatusChanged(MountId mount, int newStatus) final; + void registerForPendingReads(); + void unregisterFromPendingReads(); + int onPendingReads(); + bool isValid() const { return mId != kInvalidStorageId; } sp<content::pm::IDataLoader> getDataLoader(); @@ -191,6 +196,16 @@ private: bool fsmStep(); + // Watching for pending reads. + void healthStatusOk(); + // Pending reads detected, waiting for Xsecs to confirm blocked state. + void healthStatusReadsPending(); + // There are reads pending for X+secs, waiting for additional Ysecs to confirm unhealthy + // state. + void healthStatusBlocked(); + // There are reads pending for X+Ysecs, marking storage as unhealthy. + void healthStatusUnhealthy(); + IncrementalService& mService; std::mutex mMutex; @@ -203,6 +218,9 @@ private: int mCurrentStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED; int mTargetStatus = content::pm::IDataLoaderStatusListener::DATA_LOADER_DESTROYED; TimePoint mTargetStatusTs = {}; + + std::string mHealthPath; + incfs::UniqueControl mHealthControl; }; using DataLoaderStubPtr = sp<DataLoaderStub>; @@ -300,12 +318,15 @@ private: const incfs::FileId& libFileId, std::string_view targetLibPath, Clock::time_point scheduledTs); + void runCmdLooper(); + private: const std::unique_ptr<VoldServiceWrapper> mVold; const std::unique_ptr<DataLoaderManagerWrapper> mDataLoaderManager; const std::unique_ptr<IncFsWrapper> mIncFs; const std::unique_ptr<AppOpsManagerWrapper> mAppOpsManager; const std::unique_ptr<JniWrapper> mJni; + const std::unique_ptr<LooperWrapper> mLooper; const std::string mIncrementalDir; mutable std::mutex mLock; @@ -319,13 +340,16 @@ private: std::atomic_bool mSystemReady = false; StorageId mNextId = 0; + std::atomic_bool mRunning{true}; + using Job = std::function<void()>; std::unordered_map<MountId, std::vector<Job>> mJobQueue; MountId mPendingJobsMount = kInvalidStorageId; std::condition_variable mJobCondition; std::mutex mJobMutex; std::thread mJobProcessor; - bool mRunning = true; + + std::thread mCmdLooperThread; }; } // namespace android::incremental diff --git a/services/incremental/ServiceWrappers.cpp b/services/incremental/ServiceWrappers.cpp index 85f744152ea4..08fb486c8058 100644 --- a/services/incremental/ServiceWrappers.cpp +++ b/services/incremental/ServiceWrappers.cpp @@ -113,6 +113,23 @@ private: JavaVM* const mJvm; }; +class RealLooperWrapper final : public LooperWrapper { +public: + int addFd(int fd, int ident, int events, android::Looper_callbackFunc callback, + void* data) final { + return mLooper.addFd(fd, ident, events, callback, data); + } + int removeFd(int fd) final { return mLooper.removeFd(fd); } + void wake() final { return mLooper.wake(); } + int pollAll(int timeoutMillis) final { return mLooper.pollAll(timeoutMillis); } + +private: + struct Looper : public android::Looper { + Looper() : android::Looper(/*allowNonCallbacks=*/false) {} + ~Looper() {} + } mLooper; +}; + class RealIncFs : public IncFsWrapper { public: RealIncFs() = default; @@ -203,6 +220,10 @@ std::unique_ptr<JniWrapper> RealServiceManager::getJni() { return std::make_unique<RealJniWrapper>(mJvm); } +std::unique_ptr<LooperWrapper> RealServiceManager::getLooper() { + return std::make_unique<RealLooperWrapper>(); +} + static JavaVM* getJavaVm(JNIEnv* env) { CHECK(env); JavaVM* jvm = nullptr; diff --git a/services/incremental/ServiceWrappers.h b/services/incremental/ServiceWrappers.h index 37928308b506..abbf2f4c4424 100644 --- a/services/incremental/ServiceWrappers.h +++ b/services/incremental/ServiceWrappers.h @@ -26,6 +26,7 @@ #include <binder/Status.h> #include <incfs.h> #include <jni.h> +#include <utils/Looper.h> #include <memory> #include <span> @@ -106,6 +107,16 @@ public: virtual void initializeForCurrentThread() const = 0; }; +class LooperWrapper { +public: + virtual ~LooperWrapper() = default; + virtual int addFd(int fd, int ident, int events, android::Looper_callbackFunc callback, + void* data) = 0; + virtual int removeFd(int fd) = 0; + virtual void wake() = 0; + virtual int pollAll(int timeoutMillis) = 0; +}; + class ServiceManagerWrapper { public: virtual ~ServiceManagerWrapper() = default; @@ -114,6 +125,7 @@ public: virtual std::unique_ptr<IncFsWrapper> getIncFs() = 0; virtual std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() = 0; virtual std::unique_ptr<JniWrapper> getJni() = 0; + virtual std::unique_ptr<LooperWrapper> getLooper() = 0; }; // --- Real stuff --- @@ -127,6 +139,7 @@ public: std::unique_ptr<IncFsWrapper> getIncFs() final; std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final; std::unique_ptr<JniWrapper> getJni() final; + std::unique_ptr<LooperWrapper> getLooper() final; private: template <class INTERFACE> diff --git a/services/incremental/test/IncrementalServiceTest.cpp b/services/incremental/test/IncrementalServiceTest.cpp index 2205bfed15d1..325218dfa6a5 100644 --- a/services/incremental/test/IncrementalServiceTest.cpp +++ b/services/incremental/test/IncrementalServiceTest.cpp @@ -242,6 +242,9 @@ public: void setDataLoaderStatusDestroyed() { mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_DESTROYED); } + void setDataLoaderStatusUnavailable() { + mListener->onStatusChanged(mId, IDataLoaderStatusListener::DATA_LOADER_UNAVAILABLE); + } binder::Status unbindFromDataLoaderOk(int32_t id) { if (mDataLoader) { if (auto status = mDataLoader->destroy(id); !status.isOk()) { @@ -286,6 +289,14 @@ public: void makeFileFails() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(-1)); } void makeFileSuccess() { ON_CALL(*this, makeFile(_, _, _, _, _)).WillByDefault(Return(0)); } + void openMountSuccess() { + ON_CALL(*this, openMount(_)).WillByDefault(Invoke(this, &MockIncFs::openMountForHealth)); + } + + static constexpr auto kPendingReadsFd = 42; + Control openMountForHealth(std::string_view) { + return UniqueControl(IncFs_CreateControl(-1, kPendingReadsFd, -1)); + } RawMetadata getMountInfoMetadata(const Control& control, std::string_view path) { metadata::Mount m; @@ -346,7 +357,42 @@ class MockJniWrapper : public JniWrapper { public: MOCK_CONST_METHOD0(initializeForCurrentThread, void()); - MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(1); } + MockJniWrapper() { EXPECT_CALL(*this, initializeForCurrentThread()).Times(2); } +}; + +class MockLooperWrapper : public LooperWrapper { +public: + MOCK_METHOD5(addFd, int(int, int, int, android::Looper_callbackFunc, void*)); + MOCK_METHOD1(removeFd, int(int)); + MOCK_METHOD0(wake, void()); + MOCK_METHOD1(pollAll, int(int)); + + MockLooperWrapper() { + ON_CALL(*this, addFd(_, _, _, _, _)) + .WillByDefault(Invoke(this, &MockLooperWrapper::storeCallback)); + ON_CALL(*this, removeFd(_)).WillByDefault(Invoke(this, &MockLooperWrapper::clearCallback)); + ON_CALL(*this, pollAll(_)).WillByDefault(Invoke(this, &MockLooperWrapper::sleepFor)); + } + + int storeCallback(int, int, int, android::Looper_callbackFunc callback, void* data) { + mCallback = callback; + mCallbackData = data; + return 0; + } + + int clearCallback(int) { + mCallback = nullptr; + mCallbackData = nullptr; + return 0; + } + + int sleepFor(int timeoutMillis) { + std::this_thread::sleep_for(std::chrono::milliseconds(timeoutMillis)); + return 0; + } + + android::Looper_callbackFunc mCallback = nullptr; + void* mCallbackData = nullptr; }; class MockServiceManager : public ServiceManagerWrapper { @@ -355,12 +401,14 @@ public: std::unique_ptr<MockDataLoaderManager> dataLoaderManager, std::unique_ptr<MockIncFs> incfs, std::unique_ptr<MockAppOpsManager> appOpsManager, - std::unique_ptr<MockJniWrapper> jni) + std::unique_ptr<MockJniWrapper> jni, + std::unique_ptr<MockLooperWrapper> looper) : mVold(std::move(vold)), mDataLoaderManager(std::move(dataLoaderManager)), mIncFs(std::move(incfs)), mAppOpsManager(std::move(appOpsManager)), - mJni(std::move(jni)) {} + mJni(std::move(jni)), + mLooper(std::move(looper)) {} std::unique_ptr<VoldServiceWrapper> getVoldService() final { return std::move(mVold); } std::unique_ptr<DataLoaderManagerWrapper> getDataLoaderManager() final { return std::move(mDataLoaderManager); @@ -368,6 +416,7 @@ public: std::unique_ptr<IncFsWrapper> getIncFs() final { return std::move(mIncFs); } std::unique_ptr<AppOpsManagerWrapper> getAppOpsManager() final { return std::move(mAppOpsManager); } std::unique_ptr<JniWrapper> getJni() final { return std::move(mJni); } + std::unique_ptr<LooperWrapper> getLooper() final { return std::move(mLooper); } private: std::unique_ptr<MockVoldService> mVold; @@ -375,6 +424,7 @@ private: std::unique_ptr<MockIncFs> mIncFs; std::unique_ptr<MockAppOpsManager> mAppOpsManager; std::unique_ptr<MockJniWrapper> mJni; + std::unique_ptr<MockLooperWrapper> mLooper; }; // --- IncrementalServiceTest --- @@ -394,13 +444,16 @@ public: mAppOpsManager = appOps.get(); auto jni = std::make_unique<NiceMock<MockJniWrapper>>(); mJni = jni.get(); + auto looper = std::make_unique<NiceMock<MockLooperWrapper>>(); + mLooper = looper.get(); mIncrementalService = std::make_unique<IncrementalService>(MockServiceManager(std::move(vold), std::move( dataloaderManager), std::move(incFs), std::move(appOps), - std::move(jni)), + std::move(jni), + std::move(looper)), mRootDir.path); mDataLoaderParcel.packageName = "com.test"; mDataLoaderParcel.arguments = "uri"; @@ -430,12 +483,13 @@ public: } protected: - NiceMock<MockVoldService>* mVold; - NiceMock<MockIncFs>* mIncFs; - NiceMock<MockDataLoaderManager>* mDataLoaderManager; - NiceMock<MockAppOpsManager>* mAppOpsManager; - NiceMock<MockJniWrapper>* mJni; - NiceMock<MockDataLoader>* mDataLoader; + NiceMock<MockVoldService>* mVold = nullptr; + NiceMock<MockIncFs>* mIncFs = nullptr; + NiceMock<MockDataLoaderManager>* mDataLoaderManager = nullptr; + NiceMock<MockAppOpsManager>* mAppOpsManager = nullptr; + NiceMock<MockJniWrapper>* mJni = nullptr; + NiceMock<MockLooperWrapper>* mLooper = nullptr; + NiceMock<MockDataLoader>* mDataLoader = nullptr; std::unique_ptr<IncrementalService> mIncrementalService; TemporaryDir mRootDir; DataLoaderParamsParcel mDataLoaderParcel; @@ -593,6 +647,54 @@ TEST_F(IncrementalServiceTest, testStartDataLoaderPendingStart) { mDataLoaderManager->setDataLoaderStatusCreated(); } +TEST_F(IncrementalServiceTest, testStartDataLoaderCreateUnavailable) { + mVold->mountIncFsSuccess(); + mIncFs->makeFileSuccess(); + mVold->bindMountSuccess(); + mDataLoader->initializeCreateOkNoStatus(); + mDataLoaderManager->bindToDataLoaderSuccess(); + mDataLoaderManager->getDataLoaderSuccess(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(1); + EXPECT_CALL(*mDataLoader, start(_)).Times(0); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); + EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); + TemporaryDir tempDir; + int storageId = + mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, + IncrementalService::CreateOptions::CreateNew); + ASSERT_GE(storageId, 0); + mDataLoaderManager->setDataLoaderStatusUnavailable(); +} + +TEST_F(IncrementalServiceTest, testStartDataLoaderRecreateOnPendingReads) { + mVold->mountIncFsSuccess(); + mIncFs->makeFileSuccess(); + mIncFs->openMountSuccess(); + mVold->bindMountSuccess(); + mDataLoader->initializeCreateOkNoStatus(); + mDataLoaderManager->bindToDataLoaderSuccess(); + mDataLoaderManager->getDataLoaderSuccess(); + EXPECT_CALL(*mDataLoaderManager, bindToDataLoader(_, _, _, _)).Times(2); + EXPECT_CALL(*mDataLoaderManager, unbindFromDataLoader(_)).Times(1); + EXPECT_CALL(*mDataLoader, create(_, _, _, _)).Times(2); + EXPECT_CALL(*mDataLoader, start(_)).Times(0); + EXPECT_CALL(*mDataLoader, destroy(_)).Times(1); + EXPECT_CALL(*mVold, unmountIncFs(_)).Times(2); + EXPECT_CALL(*mLooper, addFd(MockIncFs::kPendingReadsFd, _, _, _, _)).Times(1); + EXPECT_CALL(*mLooper, removeFd(MockIncFs::kPendingReadsFd)).Times(1); + TemporaryDir tempDir; + int storageId = + mIncrementalService->createStorage(tempDir.path, std::move(mDataLoaderParcel), {}, + IncrementalService::CreateOptions::CreateNew); + ASSERT_GE(storageId, 0); + mDataLoaderManager->setDataLoaderStatusUnavailable(); + ASSERT_NE(nullptr, mLooper->mCallback); + ASSERT_NE(nullptr, mLooper->mCallbackData); + mLooper->mCallback(-1, -1, mLooper->mCallbackData); +} + TEST_F(IncrementalServiceTest, testSetIncFsMountOptionsSuccess) { mVold->mountIncFsSuccess(); mIncFs->makeFileSuccess(); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 0fc333f4b38c..fa3f33067e8e 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1891,6 +1891,10 @@ public final class SystemServer { || mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) { t.traceBegin("StartTvInputManager"); mSystemServiceManager.startService(TvInputManagerService.class); + t.traceEnd(); + } + + if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_TUNER)) { t.traceBegin("StartTunerResourceManager"); mSystemServiceManager.startService(TunerResourceManagerService.class); t.traceEnd(); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java index 2ce70b6f0889..b6cf2785d771 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityServiceConnectionTest.java @@ -129,8 +129,11 @@ public class AccessibilityServiceConnectionTest { public void bind_requestsContextToBindService() { mConnection.bindLocked(); verify(mMockContext).bindServiceAsUser(any(Intent.class), eq(mConnection), - eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE - | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS), any(UserHandle.class)); + eq(Context.BIND_AUTO_CREATE + | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE + | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS + | Context.BIND_INCLUDE_CAPABILITIES), + any(UserHandle.class)); } @Test diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java index d2925263125d..285caf34ae67 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -186,7 +186,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test @@ -269,7 +270,8 @@ public class BiometricServiceTest { eq(false) /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test @@ -407,7 +409,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); // Hardware authenticated final byte[] HAT = generateRandomHAT(); @@ -462,7 +465,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test @@ -610,7 +614,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, anyString(), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test @@ -711,7 +716,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test @@ -1207,7 +1213,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); // Requesting strong and credential, when credential is setup resetReceiver(); @@ -1227,7 +1234,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); // Un-downgrading the authenticator allows successful strong auth for (BiometricService.AuthenticatorWrapper wrapper : mBiometricService.mAuthenticators) { @@ -1250,7 +1258,8 @@ public class BiometricServiceTest { anyBoolean() /* requireConfirmation */, anyInt() /* userId */, eq(TEST_PACKAGE_NAME), - anyLong() /* sessionId */); + anyLong() /* sessionId */, + anyInt() /* sysUiSessionId */); } @Test(expected = IllegalStateException.class) diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 6b36bc591b78..ed40fe756ea1 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -1998,7 +1998,6 @@ public class DevicePolicyManagerTest extends DpmTestBase { private static final Set<String> PROFILE_OWNER_ORGANIZATION_OWNED_GLOBAL_RESTRICTIONS = Sets.newSet( UserManager.DISALLOW_CONFIG_DATE_TIME, - UserManager.DISALLOW_ADD_USER, UserManager.DISALLOW_BLUETOOTH_SHARING, UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, @@ -4005,6 +4004,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Any caller should be able to call this method. assertFalse(dpm.isOrganizationOwnedDeviceWithManagedProfile()); configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); + + verify(getServices().userManager).setUserRestriction( + eq(UserManager.DISALLOW_ADD_USER), + eq(true), + eq(UserHandle.of(UserHandle.USER_SYSTEM))); + assertTrue(dpm.isOrganizationOwnedDeviceWithManagedProfile()); // A random caller from another user should also be able to get the right result. @@ -4012,6 +4017,35 @@ public class DevicePolicyManagerTest extends DpmTestBase { assertTrue(dpm.isOrganizationOwnedDeviceWithManagedProfile()); } + public void testMarkOrganizationOwnedDevice_baseRestrictionsAdded() throws Exception { + addManagedProfile(admin1, DpmMockContext.CALLER_UID, admin1); + + configureProfileOwnerOfOrgOwnedDevice(admin1, CALLER_USER_HANDLE); + + // Base restriction DISALLOW_REMOVE_MANAGED_PROFILE added + verify(getServices().userManager).setUserRestriction( + eq(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE), + eq(true), + eq(UserHandle.of(UserHandle.USER_SYSTEM))); + + // Base restriction DISALLOW_ADD_USER added + verify(getServices().userManager).setUserRestriction( + eq(UserManager.DISALLOW_ADD_USER), + eq(true), + eq(UserHandle.of(UserHandle.USER_SYSTEM))); + + // Assert base restrictions cannot be added or removed by admin + assertExpectException(SecurityException.class, null, () -> + parentDpm.addUserRestriction(admin1, UserManager.DISALLOW_REMOVE_MANAGED_PROFILE)); + assertExpectException(SecurityException.class, null, () -> + parentDpm.clearUserRestriction(admin1, + UserManager.DISALLOW_REMOVE_MANAGED_PROFILE)); + assertExpectException(SecurityException.class, null, () -> + parentDpm.addUserRestriction(admin1, UserManager.DISALLOW_ADD_USER)); + assertExpectException(SecurityException.class, null, () -> + parentDpm.clearUserRestriction(admin1, UserManager.DISALLOW_ADD_USER)); + } + public void testSetTime() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java index d4edab44bae3..63d797e9b95c 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageInstallerSessionTest.java @@ -178,6 +178,7 @@ public class PackageInstallerSessionTest { /* files */ null, /* prepared */ true, /* committed */ true, + /* destroyed */ staged ? true : false, /* sealed */ false, // Setting to true would trigger some PM logic. /* childSessionIds */ childSessionIds != null ? childSessionIds : new int[0], /* parentSessionId */ parentSessionId, diff --git a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java index 0e48e7ed2682..e86399e1a631 100644 --- a/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/uri/UriGrantsManagerServiceTest.java @@ -171,7 +171,7 @@ public class UriGrantsManagerServiceTest { final Uri uri = Uri.parse("content://" + PKG_COMPLEX + "/"); { final Intent intent = new Intent(Intent.ACTION_VIEW, uri) - .addFlags(FLAG_READ); + .addFlags(FLAG_READ | Intent.FLAG_ACTIVITY_CLEAR_TASK); assertNull(mService.checkGrantUriPermissionFromIntent(UID_PRIMARY_COMPLEX, PKG_SOCIAL, intent, intent.getFlags(), null, USER_PRIMARY)); } diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 39062f017a73..48e22f6c685c 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -165,6 +165,7 @@ public class AppStandbyControllerTests { long mElapsedRealtime; boolean mIsAppIdleEnabled = true; boolean mIsCharging; + boolean mIsRestrictedBucketEnabled = true; List<String> mNonIdleWhitelistApps = new ArrayList<>(); boolean mDisplayOn; DisplayManager.DisplayListener mDisplayListener; @@ -212,6 +213,11 @@ public class AppStandbyControllerTests { } @Override + boolean isRestrictedBucketEnabled() { + return mIsRestrictedBucketEnabled; + } + + @Override File getDataSystemDirectory() { return new File(getContext().getFilesDir(), Long.toString(Math.randomLongInternal())); } @@ -366,29 +372,87 @@ public class AppStandbyControllerTests { mInjector.mElapsedRealtime, false)); } + private static class TestParoleListener extends AppIdleStateChangeListener { + private boolean mIsParoleOn = false; + private CountDownLatch mLatch; + private boolean mIsExpecting = false; + private boolean mExpectedParoleState; + + boolean getParoleState() { + synchronized (this) { + return mIsParoleOn; + } + } + + void rearmLatch(boolean expectedParoleState) { + synchronized (this) { + mLatch = new CountDownLatch(1); + mIsExpecting = true; + mExpectedParoleState = expectedParoleState; + } + } + + void awaitOnLatch(long time) throws Exception { + mLatch.await(time, TimeUnit.MILLISECONDS); + } + + @Override + public void onAppIdleStateChanged(String packageName, int userId, boolean idle, + int bucket, int reason) { + } + + @Override + public void onParoleStateChanged(boolean isParoleOn) { + synchronized (this) { + // Only record information if it is being looked for + if (mLatch != null && mLatch.getCount() > 0) { + mIsParoleOn = isParoleOn; + if (mIsExpecting && isParoleOn == mExpectedParoleState) { + mLatch.countDown(); + } + } + } + } + } + @Test public void testIsAppIdle_Charging() throws Exception { + TestParoleListener paroleListener = new TestParoleListener(); + mController.addListener(paroleListener); + setChargingState(mController, false); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); + assertFalse(mController.isInParole()); + paroleListener.rearmLatch(true); setChargingState(mController, true); + paroleListener.awaitOnLatch(2000); + assertTrue(paroleListener.getParoleState()); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); assertFalse(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertFalse(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); + assertTrue(mController.isInParole()); + paroleListener.rearmLatch(false); setChargingState(mController, false); + paroleListener.awaitOnLatch(2000); + assertFalse(paroleListener.getParoleState()); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); + assertFalse(mController.isInParole()); } @Test public void testIsAppIdle_Enabled() throws Exception { setChargingState(mController, false); + TestParoleListener paroleListener = new TestParoleListener(); + mController.addListener(paroleListener); + setAppIdleEnabled(mController, true); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, REASON_MAIN_FORCED_BY_SYSTEM); @@ -396,11 +460,17 @@ public class AppStandbyControllerTests { assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); + paroleListener.rearmLatch(false); setAppIdleEnabled(mController, false); + paroleListener.awaitOnLatch(2000); + assertTrue(paroleListener.mIsParoleOn); assertFalse(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertFalse(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); + paroleListener.rearmLatch(true); setAppIdleEnabled(mController, true); + paroleListener.awaitOnLatch(2000); + assertFalse(paroleListener.getParoleState()); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController, PACKAGE_1)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, 0)); assertTrue(mController.isAppIdleFiltered(PACKAGE_1, UID_1, USER_ID, false)); @@ -447,6 +517,10 @@ public class AppStandbyControllerTests { assertEquals(bucket, getStandbyBucket(mController, PACKAGE_1)); } + private void assertNotBucket(int bucket) { + assertNotEquals(bucket, getStandbyBucket(mController, PACKAGE_1)); + } + @Test public void testBuckets() throws Exception { assertTimeout(mController, 0, STANDBY_BUCKET_NEVER); @@ -882,6 +956,48 @@ public class AppStandbyControllerTests { } @Test + public void testRestrictedBucketDisabled() { + mInjector.mIsRestrictedBucketEnabled = false; + // Get the controller to read the new value. Capturing the ContentObserver isn't possible + // at the moment. + mController.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); + + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD; + + // Nothing should be able to put it into the RESTRICTED bucket. + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED, + REASON_MAIN_TIMEOUT); + assertNotBucket(STANDBY_BUCKET_RESTRICTED); + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED, + REASON_MAIN_PREDICTED); + assertNotBucket(STANDBY_BUCKET_RESTRICTED); + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED, + REASON_MAIN_FORCED_BY_SYSTEM); + assertNotBucket(STANDBY_BUCKET_RESTRICTED); + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED, + REASON_MAIN_FORCED_BY_USER); + assertNotBucket(STANDBY_BUCKET_RESTRICTED); + } + + @Test + public void testRestrictedBucket_EnabledToDisabled() { + reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); + mInjector.mElapsedRealtime += RESTRICTED_THRESHOLD; + mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RESTRICTED, + REASON_MAIN_FORCED_BY_SYSTEM); + assertBucket(STANDBY_BUCKET_RESTRICTED); + + mInjector.mIsRestrictedBucketEnabled = false; + // Get the controller to read the new value. Capturing the ContentObserver isn't possible + // at the moment. + mController.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); + + mController.checkIdleStates(USER_ID); + assertNotBucket(STANDBY_BUCKET_RESTRICTED); + } + + @Test public void testPredictionRaiseFromRestrictedTimeout_highBucket() { reportEvent(mController, USER_INTERACTION, mInjector.mElapsedRealtime, PACKAGE_1); diff --git a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java index df92b6ed95e8..69ef499749a9 100644 --- a/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/UiModeManagerServiceTest.java @@ -31,6 +31,7 @@ import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.PowerSaveState; import android.os.RemoteException; +import android.provider.Settings; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import com.android.server.twilight.TwilightManager; @@ -54,6 +55,7 @@ import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -144,7 +146,7 @@ public class UiModeManagerServiceTest extends UiServiceTestCase { addLocalService(PowerManagerInternal.class, mLocalPowerManager); addLocalService(TwilightManager.class, mTwilightManager); - mUiManagerService = new UiModeManagerService(mContext); + mUiManagerService = new UiModeManagerService(mContext, true); try { mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); } catch (SecurityException e) {/* ignore for permission denial */} diff --git a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java index 3c2d55058c3e..182bf949af1f 100644 --- a/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java +++ b/services/tests/uiservicestests/src/com/android/server/UiServiceTestCase.java @@ -41,6 +41,7 @@ public class UiServiceTestCase { protected static final String PKG_N_MR1 = "com.example.n_mr1"; protected static final String PKG_O = "com.example.o"; protected static final String PKG_P = "com.example.p"; + protected static final String PKG_R = "com.example.r"; @Rule public final TestableContext mContext = @@ -69,6 +70,8 @@ public class UiServiceTestCase { return Build.VERSION_CODES.O; case PKG_P: return Build.VERSION_CODES.P; + case PKG_R: + return Build.VERSION_CODES.R; default: return Build.VERSION_CODES.CUR_DEVELOPMENT; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index babe80e4b612..289933e5ecb2 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -250,6 +250,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { private static final int NOTIFICATION_LOCATION_UNKNOWN = 0; + private static final String VALID_CONVO_SHORTCUT_ID = "shortcut"; + @Mock private NotificationListeners mListeners; @Mock private NotificationAssistants mAssistants; @@ -471,6 +473,19 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mShortcutHelper.setLauncherApps(mLauncherApps); mShortcutHelper.setShortcutServiceInternal(mShortcutServiceInternal); + // Pretend the shortcut exists + List<ShortcutInfo> shortcutInfos = new ArrayList<>(); + ShortcutInfo info = mock(ShortcutInfo.class); + when(info.getPackage()).thenReturn(PKG); + when(info.getId()).thenReturn(VALID_CONVO_SHORTCUT_ID); + when(info.getUserId()).thenReturn(USER_SYSTEM); + when(info.isLongLived()).thenReturn(true); + when(info.isEnabled()).thenReturn(true); + shortcutInfos.add(info); + when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos); + when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(), + anyString(), anyInt(), any())).thenReturn(true); + // Set the testable bubble extractor RankingHelper rankingHelper = mService.getRankingHelper(); BubbleExtractor extractor = rankingHelper.findExtractor(BubbleExtractor.class); @@ -704,6 +719,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { ) .setActions(replyAction) .setSmallIcon(android.R.drawable.sym_def_app_icon) + .setShortcutId(VALID_CONVO_SHORTCUT_ID) .setGroupSummary(isSummary); if (groupKey != null) { nb.setGroup(groupKey); @@ -6100,7 +6116,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Test public void testNotificationBubbles_flagRemoved_whenShortcutRemoved() throws RemoteException { - final String shortcutId = "someshortcutId"; setUpPrefsForBubbles(PKG, mUid, true /* global */, BUBBLE_PREFERENCE_ALL /* app */, @@ -6111,27 +6126,16 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // Messaging notification with shortcut info Notification.BubbleMetadata metadata = - new Notification.BubbleMetadata.Builder(shortcutId).build(); + new Notification.BubbleMetadata.Builder(VALID_CONVO_SHORTCUT_ID).build(); Notification.Builder nb = getMessageStyleNotifBuilder(false /* addDefaultMetadata */, null /* groupKey */, false /* isSummary */); - nb.setShortcutId(shortcutId); + nb.setShortcutId(VALID_CONVO_SHORTCUT_ID); nb.setBubbleMetadata(metadata); StatusBarNotification sbn = new StatusBarNotification(PKG, PKG, 1, "tag", mUid, 0, nb.build(), new UserHandle(mUid), null, 0); NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel); - // Pretend the shortcut exists - List<ShortcutInfo> shortcutInfos = new ArrayList<>(); - ShortcutInfo info = mock(ShortcutInfo.class); - when(info.getPackage()).thenReturn(PKG); - when(info.getId()).thenReturn(shortcutId); - when(info.getUserId()).thenReturn(USER_SYSTEM); - when(info.isLongLived()).thenReturn(true); - when(info.isEnabled()).thenReturn(true); - shortcutInfos.add(info); - when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos); - when(mShortcutServiceInternal.isSharingShortcut(anyInt(), anyString(), anyString(), - anyString(), anyInt(), any())).thenReturn(true); + // Test: Send the bubble notification mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), @@ -6149,7 +6153,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // Make sure the shortcut is cached. verify(mShortcutServiceInternal).cacheShortcuts( - anyInt(), any(), eq(PKG), eq(Collections.singletonList(shortcutId)), + anyInt(), any(), eq(PKG), eq(Collections.singletonList(VALID_CONVO_SHORTCUT_ID)), eq(USER_SYSTEM)); // Test: Remove the shortcut @@ -6613,6 +6617,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { convo2.setNotificationChannel(channel2); convos.add(convo2); when(mPreferencesHelper.getConversations(anyString(), anyInt())).thenReturn(convos); + when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null); List<ConversationChannelWrapper> conversations = mBinderService.getConversationsForPackage(PKG_P, mUid).getList(); @@ -6640,6 +6645,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { NotificationRecord nr = generateMessageBubbleNotifRecord(mTestNotificationChannel, "testRecordMessages_invalidMsg"); + when(mLauncherApps.getShortcuts(any(), any())).thenReturn(null); mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); waitForIdle(); @@ -6660,17 +6666,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { "testRecordMessages_validMsg", mUid, 0, nb.build(), new UserHandle(mUid), null, 0); NotificationRecord nr = new NotificationRecord(mContext, sbn, mTestNotificationChannel); - // Pretend the shortcut exists - List<ShortcutInfo> shortcutInfos = new ArrayList<>(); - ShortcutInfo info = mock(ShortcutInfo.class); - when(info.getPackage()).thenReturn(PKG); - when(info.getId()).thenReturn("id"); - when(info.getUserId()).thenReturn(USER_SYSTEM); - when(info.isLongLived()).thenReturn(true); - when(info.isEnabled()).thenReturn(true); - shortcutInfos.add(info); - when(mLauncherApps.getShortcuts(any(), any())).thenReturn(shortcutInfos); - mBinderService.enqueueNotificationWithTag(PKG, PKG, nr.getSbn().getTag(), nr.getSbn().getId(), nr.getSbn().getNotification(), nr.getSbn().getUserId()); waitForIdle(); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java index 9f593ce42741..b03596a35c32 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordTest.java @@ -39,7 +39,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IActivityManager; import android.app.Notification; @@ -90,7 +89,7 @@ public class NotificationRecordTest extends UiServiceTestCase { @Mock private PackageManager mPm; @Mock private ContentResolver mContentResolver; - private final String pkg = PKG_N_MR1; + private final String mPkg = PKG_O; private final int uid = 9583; private final int id1 = 1; private final String tag1 = "tag1"; @@ -198,10 +197,14 @@ public class NotificationRecordTest extends UiServiceTestCase { } Notification n = builder.build(); - return new StatusBarNotification(pkg, pkg, id1, tag1, uid, uid, n, mUser, null, uid); + return new StatusBarNotification(mPkg, mPkg, id1, tag1, uid, uid, n, mUser, null, uid); } private StatusBarNotification getMessagingStyleNotification() { + return getMessagingStyleNotification(mPkg); + } + + private StatusBarNotification getMessagingStyleNotification(String pkg) { final Builder builder = new Builder(mMockContext) .setContentTitle("foo") .setSmallIcon(android.R.drawable.sym_def_app_icon); @@ -658,7 +661,7 @@ public class NotificationRecordTest extends UiServiceTestCase { Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); - record.addAdjustment(new Adjustment(pkg, record.getKey(), signals, null, sbn.getUserId())); + record.addAdjustment(new Adjustment(mPkg, record.getKey(), signals, null, sbn.getUserId())); record.applyAdjustments(); @@ -687,7 +690,7 @@ public class NotificationRecordTest extends UiServiceTestCase { Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); - record.addAdjustment(new Adjustment(pkg, record.getKey(), signals, null, sbn.getUserId())); + record.addAdjustment(new Adjustment(mPkg, record.getKey(), signals, null, sbn.getUserId())); record.applyAdjustments(); assertEquals(USER_SENTIMENT_POSITIVE, record.getUserSentiment()); @@ -705,7 +708,7 @@ public class NotificationRecordTest extends UiServiceTestCase { Bundle signals = new Bundle(); signals.putInt(Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEGATIVE); - record.addAdjustment(new Adjustment(pkg, record.getKey(), signals, null, sbn.getUserId())); + record.addAdjustment(new Adjustment(mPkg, record.getKey(), signals, null, sbn.getUserId())); record.applyAdjustments(); @@ -1134,6 +1137,15 @@ public class NotificationRecordTest extends UiServiceTestCase { } @Test + public void testIsConversation_noShortcut_targetsR() { + StatusBarNotification sbn = getMessagingStyleNotification(PKG_R); + NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel); + record.setShortcutInfo(null); + + assertFalse(record.isConversation()); + } + + @Test public void testIsConversation_channelDemoted() { StatusBarNotification sbn = getMessagingStyleNotification(); channel.setDemoted(true); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java index cf3cfecbf65e..5c21853b1f59 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java @@ -31,10 +31,12 @@ import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_AFTER_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM; import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; @@ -59,6 +61,8 @@ import android.view.WindowManager; import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; +import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -365,6 +369,30 @@ public class AppWindowTokenTests extends WindowTestsBase { assertHasStartingWindow(activity2); } + @Test + public void testTransferStartingWindowCanAnimate() { + final ActivityRecord activity1 = createIsolatedTestActivityRecord(); + final ActivityRecord activity2 = createIsolatedTestActivityRecord(); + activity1.addStartingWindow(mPackageName, + android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, + false, false); + waitUntilHandlersIdle(); + activity2.addStartingWindow(mPackageName, + android.R.style.Theme, null, "Test", 0, 0, 0, 0, activity1.appToken.asBinder(), + true, true, false, true, false, false); + waitUntilHandlersIdle(); + assertNoStartingWindow(activity1); + assertHasStartingWindow(activity2); + + // Assert that bottom activity is allowed to do animation. + doReturn(true).when(activity2).okToAnimate(); + doReturn(true).when(activity2).isAnimating(); + final OnAnimationFinishedCallback onAnimationFinishedCallback = + mock(OnAnimationFinishedCallback.class); + assertTrue(activity2.applyAnimation(null, TRANSIT_ACTIVITY_OPEN, true, false, + onAnimationFinishedCallback)); + } + private ActivityRecord createIsolatedTestActivityRecord() { final ActivityStack taskStack = createTaskStackOnDisplay(mDisplayContent); final Task task = createTaskInStack(taskStack, 0 /* userId */); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 28ae36abbb5b..d605ab25bd57 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -38,13 +38,11 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; -import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; -import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; @@ -346,82 +344,6 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); } - // TODO(b/118118435): remove after migration - @Test - public void layoutWindowLw_appDrawsBarsLegacy() { - assumeTrue(ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL); - - mWindow.mAttrs.flags = - FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetBy(mWindow.getDisplayFrameLw(), 0, 0, 0, 0); - } - - // TODO(b/118118435): remove after migration - @Test - public void layoutWindowLw_appWontDrawBars() { - assumeTrue(ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL); - - mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, NAV_BAR_HEIGHT); - } - - // TODO(b/118118435): remove after migration - @Test - public void layoutWindowLw_appWontDrawBars_forceStatusAndNav() throws Exception { - assumeTrue(ViewRootImpl.sNewInsetsMode != ViewRootImpl.NEW_INSETS_MODE_FULL); - - mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; - mWindow.mAttrs.privateFlags = PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS; - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); - mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); - } - - // TODO(b/118118435): remove after migration (keyguard dialog is not special with the new logic) - @Test - public void layoutWindowLw_keyguardDialog_hideNav() { - mWindow.mAttrs.type = TYPE_KEYGUARD_DIALOG; - mWindow.mAttrs.flags = - FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; - mWindow.mAttrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; - mWindow.mAttrs.setFitInsetsTypes(0 /* types */); - addWindow(mWindow); - - mDisplayPolicy.beginLayoutLw(mFrames, 0 /* uiMode */); - mDisplayPolicy.layoutWindowLw(mWindow, null /* attached */, mFrames); - - assertInsetByTopBottom(mWindow.getParentFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getStableFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); - assertInsetByTopBottom(mWindow.getDecorFrame(), 0, 0); - assertInsetByTopBottom(mWindow.getDisplayFrameLw(), 0, 0); - } - @Test public void layoutWindowLw_withDisplayCutout() { addDisplayCutout(); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java index ca016761438b..9bf9ffed57be 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsSourceProviderTest.java @@ -16,8 +16,10 @@ package com.android.server.wm; +import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,12 +46,17 @@ public class InsetsSourceProviderTest extends WindowTestsBase { private InsetsSource mSource = new InsetsSource(ITYPE_STATUS_BAR); private InsetsSourceProvider mProvider; + private InsetsSource mImeSource = new InsetsSource(ITYPE_IME); + private InsetsSourceProvider mImeProvider; @Before public void setUp() throws Exception { mSource.setVisible(true); mProvider = new InsetsSourceProvider(mSource, mDisplayContent.getInsetsStateController(), mDisplayContent); + mProvider.setServerVisible(true); + mImeProvider = new InsetsSourceProvider(mImeSource, + mDisplayContent.getInsetsStateController(), mDisplayContent); } @Test @@ -166,6 +173,30 @@ public class InsetsSourceProviderTest extends WindowTestsBase { } @Test + public void testUpdateSourceFrameForIme() { + final WindowState inputMethod = createWindow(null, TYPE_INPUT_METHOD, "inputMethod"); + + inputMethod.getFrameLw().set(new Rect(0, 400, 500, 500)); + + mImeProvider.setWindow(inputMethod, null, null); + mImeProvider.setServerVisible(false); + mImeSource.setVisible(true); + mImeProvider.updateSourceFrame(); + assertEquals(new Rect(0, 0, 0, 0), mImeSource.getFrame()); + Insets insets = mImeSource.calculateInsets(new Rect(0, 0, 500, 500), + false /* ignoreVisibility */); + assertEquals(Insets.of(0, 0, 0, 0), insets); + + mImeProvider.setServerVisible(true); + mImeSource.setVisible(true); + mImeProvider.updateSourceFrame(); + assertEquals(inputMethod.getFrameLw(), mImeSource.getFrame()); + insets = mImeSource.calculateInsets(new Rect(0, 0, 500, 500), + false /* ignoreVisibility */); + assertEquals(Insets.of(0, 0, 0, 100), insets); + } + + @Test public void testInsetsModified() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index 520ac19b89a8..373f363e31ff 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -271,6 +271,29 @@ public class WallpaperControllerTests extends WindowTestsBase { assertEquals(WINDOWING_MODE_FULLSCREEN, token.getWindowingMode()); } + @Test + public void testFixedRotationRecentsAnimatingTask() { + final RecentsAnimationController recentsController = mock(RecentsAnimationController.class); + doReturn(true).when(recentsController).isWallpaperVisible(eq(mAppWindow)); + mWm.setRecentsAnimationController(recentsController); + + mAppWindow.mActivityRecord.applyFixedRotationTransform(mDisplayContent.getDisplayInfo(), + mDisplayContent.mDisplayFrames, mDisplayContent.getConfiguration()); + mAppWindow.mActivityRecord.mVisibleRequested = true; + mDisplayContent.mWallpaperController.adjustWallpaperWindows(); + + assertEquals(mAppWindow, mDisplayContent.mWallpaperController.getWallpaperTarget()); + // Wallpaper should link the transform of its target. + assertTrue(mAppWindow.mActivityRecord.hasFixedRotationTransform()); + + mAppWindow.mActivityRecord.finishFixedRotationTransform(); + // Invisible requested activity should not share its rotation transform. + mAppWindow.mActivityRecord.mVisibleRequested = false; + mDisplayContent.mWallpaperController.adjustWallpaperWindows(); + + assertFalse(mAppWindow.mActivityRecord.hasFixedRotationTransform()); + } + private WindowState createWallpaperTargetWindow(DisplayContent dc) { final ActivityRecord homeActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService) .setStack(dc.getDefaultTaskDisplayArea().getRootHomeTask()) diff --git a/services/usage/java/com/android/server/usage/IntervalStats.java b/services/usage/java/com/android/server/usage/IntervalStats.java index 5ee3b4859d54..fd462c2e6dc2 100644 --- a/services/usage/java/com/android/server/usage/IntervalStats.java +++ b/services/usage/java/com/android/server/usage/IntervalStats.java @@ -234,6 +234,10 @@ public class IntervalStats { event.mTaskRootClass = getCachedStringRef(stringPool.get( parser.readInt(IntervalStatsProto.Event.TASK_ROOT_CLASS_INDEX) - 1)); break; + case (int) IntervalStatsProto.Event.LOCUS_ID_INDEX: + event.mLocusId = getCachedStringRef(stringPool.get( + parser.readInt(IntervalStatsProto.Event.LOCUS_ID_INDEX) - 1)); + break; case ProtoInputStream.NO_MORE_FIELDS: // Handle default values for certain events types switch (event.mEventType) { @@ -252,6 +256,11 @@ public class IntervalStats { event.mNotificationChannelId = ""; } break; + case LOCUS_ID_SET: + if (event.mLocusId == null) { + event.mLocusId = ""; + } + break; } return event; } diff --git a/services/usage/java/com/android/server/usage/UsageStatsProto.java b/services/usage/java/com/android/server/usage/UsageStatsProto.java index 463fc378c27d..78b14779d6b3 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsProto.java +++ b/services/usage/java/com/android/server/usage/UsageStatsProto.java @@ -481,6 +481,13 @@ final class UsageStatsProto { } } break; + case UsageEvents.Event.LOCUS_ID_SET: + if (event.mLocusId != null) { + final int locusIdIndex = stats.mStringCache.indexOf(event.mLocusId); + if (locusIdIndex >= 0) { + proto.write(IntervalStatsProto.Event.LOCUS_ID_INDEX, locusIdIndex + 1); + } + } } proto.end(token); } diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index b7779fd40990..4e75b7354baa 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -1166,6 +1166,7 @@ class UserUsageStatsService { byte[] getBackupPayload(String key){ checkAndGetTimeLocked(); + persistActiveStats(); return mDatabase.getBackupPayload(key); } diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index a716b37f7efd..56cba1d3f913 100755 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -2102,12 +2102,12 @@ public abstract class ConnectionService extends Service { private void abort(String callId) { - Log.d(this, "abort %s", callId); + Log.i(this, "abort %s", callId); findConnectionForAction(callId, "abort").onAbort(); } private void answerVideo(String callId, int videoState) { - Log.d(this, "answerVideo %s", callId); + Log.i(this, "answerVideo %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "answer").onAnswer(videoState); } else { @@ -2116,7 +2116,7 @@ public abstract class ConnectionService extends Service { } private void answer(String callId) { - Log.d(this, "answer %s", callId); + Log.i(this, "answer %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "answer").onAnswer(); } else { @@ -2125,12 +2125,12 @@ public abstract class ConnectionService extends Service { } private void deflect(String callId, Uri address) { - Log.d(this, "deflect %s", callId); + Log.i(this, "deflect %s", callId); findConnectionForAction(callId, "deflect").onDeflect(address); } private void reject(String callId) { - Log.d(this, "reject %s", callId); + Log.i(this, "reject %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "reject").onReject(); } else { @@ -2139,34 +2139,34 @@ public abstract class ConnectionService extends Service { } private void reject(String callId, String rejectWithMessage) { - Log.d(this, "reject %s with message", callId); + Log.i(this, "reject %s with message", callId); findConnectionForAction(callId, "reject").onReject(rejectWithMessage); } private void reject(String callId, @android.telecom.Call.RejectReason int rejectReason) { - Log.d(this, "reject %s with reason %d", callId, rejectReason); + Log.i(this, "reject %s with reason %d", callId, rejectReason); findConnectionForAction(callId, "reject").onReject(rejectReason); } private void transfer(String callId, Uri number, boolean isConfirmationRequired) { - Log.d(this, "transfer %s", callId); + Log.i(this, "transfer %s", callId); findConnectionForAction(callId, "transfer").onTransfer(number, isConfirmationRequired); } private void consultativeTransfer(String callId, String otherCallId) { - Log.d(this, "consultativeTransfer %s", callId); + Log.i(this, "consultativeTransfer %s", callId); Connection connection1 = findConnectionForAction(callId, "consultativeTransfer"); Connection connection2 = findConnectionForAction(otherCallId, " consultativeTransfer"); connection1.onTransfer(connection2); } private void silence(String callId) { - Log.d(this, "silence %s", callId); + Log.i(this, "silence %s", callId); findConnectionForAction(callId, "silence").onSilence(); } private void disconnect(String callId) { - Log.d(this, "disconnect %s", callId); + Log.i(this, "disconnect %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "disconnect").onDisconnect(); } else { @@ -2175,7 +2175,7 @@ public abstract class ConnectionService extends Service { } private void hold(String callId) { - Log.d(this, "hold %s", callId); + Log.i(this, "hold %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "hold").onHold(); } else { @@ -2184,7 +2184,7 @@ public abstract class ConnectionService extends Service { } private void unhold(String callId) { - Log.d(this, "unhold %s", callId); + Log.i(this, "unhold %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "unhold").onUnhold(); } else { @@ -2193,7 +2193,7 @@ public abstract class ConnectionService extends Service { } private void onCallAudioStateChanged(String callId, CallAudioState callAudioState) { - Log.d(this, "onAudioStateChanged %s %s", callId, callAudioState); + Log.i(this, "onAudioStateChanged %s %s", callId, callAudioState); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "onCallAudioStateChanged").setCallAudioState( callAudioState); @@ -2204,7 +2204,7 @@ public abstract class ConnectionService extends Service { } private void playDtmfTone(String callId, char digit) { - Log.d(this, "playDtmfTone %s %c", callId, digit); + Log.i(this, "playDtmfTone %s %c", callId, digit); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "playDtmfTone").onPlayDtmfTone(digit); } else { @@ -2213,7 +2213,7 @@ public abstract class ConnectionService extends Service { } private void stopDtmfTone(String callId) { - Log.d(this, "stopDtmfTone %s", callId); + Log.i(this, "stopDtmfTone %s", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "stopDtmfTone").onStopDtmfTone(); } else { @@ -2222,7 +2222,7 @@ public abstract class ConnectionService extends Service { } private void conference(String callId1, String callId2) { - Log.d(this, "conference %s, %s", callId1, callId2); + Log.i(this, "conference %s, %s", callId1, callId2); // Attempt to get second connection or conference. Connection connection2 = findConnectionForAction(callId2, "conference"); @@ -2269,7 +2269,7 @@ public abstract class ConnectionService extends Service { } private void splitFromConference(String callId) { - Log.d(this, "splitFromConference(%s)", callId); + Log.i(this, "splitFromConference(%s)", callId); Connection connection = findConnectionForAction(callId, "splitFromConference"); if (connection == getNullConnection()) { @@ -2284,7 +2284,7 @@ public abstract class ConnectionService extends Service { } private void mergeConference(String callId) { - Log.d(this, "mergeConference(%s)", callId); + Log.i(this, "mergeConference(%s)", callId); Conference conference = findConferenceForAction(callId, "mergeConference"); if (conference != null) { conference.onMerge(); @@ -2292,7 +2292,7 @@ public abstract class ConnectionService extends Service { } private void swapConference(String callId) { - Log.d(this, "swapConference(%s)", callId); + Log.i(this, "swapConference(%s)", callId); Conference conference = findConferenceForAction(callId, "swapConference"); if (conference != null) { conference.onSwap(); @@ -2300,7 +2300,7 @@ public abstract class ConnectionService extends Service { } private void addConferenceParticipants(String callId, List<Uri> participants) { - Log.d(this, "addConferenceParticipants(%s)", callId); + Log.i(this, "addConferenceParticipants(%s)", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "addConferenceParticipants") .onAddConferenceParticipants(participants); @@ -2318,7 +2318,7 @@ public abstract class ConnectionService extends Service { * @param callId The ID of the call to pull. */ private void pullExternalCall(String callId) { - Log.d(this, "pullExternalCall(%s)", callId); + Log.i(this, "pullExternalCall(%s)", callId); Connection connection = findConnectionForAction(callId, "pullExternalCall"); if (connection != null) { connection.onPullExternalCall(); @@ -2335,7 +2335,7 @@ public abstract class ConnectionService extends Service { * @param extras Extras associated with the event. */ private void sendCallEvent(String callId, String event, Bundle extras) { - Log.d(this, "sendCallEvent(%s, %s)", callId, event); + Log.i(this, "sendCallEvent(%s, %s)", callId, event); Connection connection = findConnectionForAction(callId, "sendCallEvent"); if (connection != null) { connection.onCallEvent(event, extras); @@ -2348,7 +2348,7 @@ public abstract class ConnectionService extends Service { * @param callId The ID of the call which completed handover. */ private void notifyHandoverComplete(String callId) { - Log.d(this, "notifyHandoverComplete(%s)", callId); + Log.i(this, "notifyHandoverComplete(%s)", callId); Connection connection = findConnectionForAction(callId, "notifyHandoverComplete"); if (connection != null) { connection.onHandoverComplete(); @@ -2368,7 +2368,7 @@ public abstract class ConnectionService extends Service { * @param extras The new extras bundle. */ private void handleExtrasChanged(String callId, Bundle extras) { - Log.d(this, "handleExtrasChanged(%s, %s)", callId, extras); + Log.i(this, "handleExtrasChanged(%s, %s)", callId, extras); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "handleExtrasChanged").handleExtrasChanged(extras); } else if (mConferenceById.containsKey(callId)) { @@ -2377,7 +2377,7 @@ public abstract class ConnectionService extends Service { } private void startRtt(String callId, Connection.RttTextStream rttTextStream) { - Log.d(this, "startRtt(%s)", callId); + Log.i(this, "startRtt(%s)", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "startRtt").onStartRtt(rttTextStream); } else if (mConferenceById.containsKey(callId)) { @@ -2386,7 +2386,7 @@ public abstract class ConnectionService extends Service { } private void stopRtt(String callId) { - Log.d(this, "stopRtt(%s)", callId); + Log.i(this, "stopRtt(%s)", callId); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "stopRtt").onStopRtt(); } else if (mConferenceById.containsKey(callId)) { @@ -2395,7 +2395,7 @@ public abstract class ConnectionService extends Service { } private void handleRttUpgradeResponse(String callId, Connection.RttTextStream rttTextStream) { - Log.d(this, "handleRttUpgradeResponse(%s, %s)", callId, rttTextStream == null); + Log.i(this, "handleRttUpgradeResponse(%s, %s)", callId, rttTextStream == null); if (mConnectionById.containsKey(callId)) { findConnectionForAction(callId, "handleRttUpgradeResponse") .handleRttUpgradeResponse(rttTextStream); @@ -2405,7 +2405,7 @@ public abstract class ConnectionService extends Service { } private void onPostDialContinue(String callId, boolean proceed) { - Log.d(this, "onPostDialContinue(%s)", callId); + Log.i(this, "onPostDialContinue(%s)", callId); findConnectionForAction(callId, "stopDtmfTone").onPostDialContinue(proceed); } diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java index 4f6a9d6450f8..a90d0532b721 100644 --- a/telecomm/java/android/telecom/Log.java +++ b/telecomm/java/android/telecom/Log.java @@ -16,7 +16,9 @@ package android.telecom; +import android.annotation.NonNull; import android.compat.annotation.UnsupportedAppUsage; +import android.content.ComponentName; import android.content.Context; import android.net.Uri; import android.os.Build; @@ -29,8 +31,10 @@ import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; +import java.util.Arrays; import java.util.IllegalFormatException; import java.util.Locale; +import java.util.stream.Collectors; /** * Manages logging for the entire module. @@ -212,6 +216,16 @@ public class Log { return getSessionManager().getExternalSession(); } + /** + * Retrieves external session information, providing a context for the recipient of the session + * info where the external session came from. + * @param ownerInfo The external owner info. + * @return New {@link Session.Info} instance with owner info set. + */ + public static Session.Info getExternalSession(@NonNull String ownerInfo) { + return getSessionManager().getExternalSession(ownerInfo); + } + public static void cancelSubsession(Session subsession) { getSessionManager().cancelSubsession(subsession); } @@ -481,4 +495,34 @@ public class Log { } return String.format(Locale.US, "%s: %s%s", prefix, msg, sessionPostfix); } + + /** + * Generates an abbreviated version of the package name from a component. + * E.g. com.android.phone becomes cap + * @param componentName The component name to abbreviate. + * @return Abbreviation of empty string if component is null. + * @hide + */ + public static String getPackageAbbreviation(ComponentName componentName) { + if (componentName == null) { + return ""; + } + return getPackageAbbreviation(componentName.getPackageName()); + } + + /** + * Generates an abbreviated version of the package name. + * E.g. com.android.phone becomes cap + * @param packageName The packageName name to abbreviate. + * @return Abbreviation of empty string if package is null. + * @hide + */ + public static String getPackageAbbreviation(String packageName) { + if (packageName == null) { + return ""; + } + return Arrays.stream(packageName.split("\\.")) + .map(s -> s.substring(0,1)) + .collect(Collectors.joining("")); + } } diff --git a/telecomm/java/android/telecom/Logging/Session.java b/telecomm/java/android/telecom/Logging/Session.java index 8d3f4e1df8bc..4aa3614fa004 100644 --- a/telecomm/java/android/telecom/Logging/Session.java +++ b/telecomm/java/android/telecom/Logging/Session.java @@ -17,6 +17,7 @@ package android.telecom.Logging; import android.annotation.NonNull; +import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import android.telecom.Log; @@ -59,10 +60,12 @@ public class Session { public static class Info implements Parcelable { public final String sessionId; public final String methodPath; + public final String ownerInfo; - private Info(String id, String path) { + private Info(String id, String path, String owner) { sessionId = id; methodPath = path; + ownerInfo = owner; } public static Info getInfo (Session s) { @@ -70,7 +73,28 @@ public class Session { // not get multiple stacking external sessions (unless we have DEBUG level logging or // lower). return new Info(s.getFullSessionId(), s.getFullMethodPath( - !Log.DEBUG && s.isSessionExternal())); + !Log.DEBUG && s.isSessionExternal()), s.getOwnerInfo()); + } + + public static Info getExternalInfo(Session s, @Nullable String ownerInfo) { + // When creating session information for an existing session, the caller may pass in a + // context to be passed along to the recipient of the external session info. + // So, for example, if telecom has an active session with owner 'cad', and Telecom is + // calling into Telephony and providing external session info, it would pass in 'cast' + // as the owner info. This would result in Telephony seeing owner info 'cad/cast', + // which would make it very clear in the Telephony logs the chain of package calls which + // ultimately resulted in the logs. + String newInfo = ownerInfo != null && s.getOwnerInfo() != null + // If we've got both, concatenate them. + ? s.getOwnerInfo() + "/" + ownerInfo + // Otherwise use whichever is present. + : ownerInfo != null ? ownerInfo : s.getOwnerInfo(); + + // Create Info based on the truncated method path if the session is external, so we do + // not get multiple stacking external sessions (unless we have DEBUG level logging or + // lower). + return new Info(s.getFullSessionId(), s.getFullMethodPath( + !Log.DEBUG && s.isSessionExternal()), newInfo); } /** Responsible for creating Info objects for deserialized Parcels. */ @@ -80,7 +104,8 @@ public class Session { public Info createFromParcel(Parcel source) { String id = source.readString(); String methodName = source.readString(); - return new Info(id, methodName); + String ownerInfo = source.readString(); + return new Info(id, methodName, ownerInfo); } @Override @@ -100,6 +125,7 @@ public class Session { public void writeToParcel(Parcel destination, int flags) { destination.writeString(sessionId); destination.writeString(methodPath); + destination.writeString(ownerInfo); } } @@ -206,6 +232,14 @@ public class Session { return Info.getInfo(this); } + public Info getExternalInfo(@Nullable String ownerInfo) { + return Info.getExternalInfo(this, ownerInfo); + } + + public String getOwnerInfo() { + return mOwnerInfo; + } + @VisibleForTesting public String getSessionId() { return mSessionId; diff --git a/telecomm/java/android/telecom/Logging/SessionManager.java b/telecomm/java/android/telecom/Logging/SessionManager.java index ac300587cef8..67e5eabf54eb 100644 --- a/telecomm/java/android/telecom/Logging/SessionManager.java +++ b/telecomm/java/android/telecom/Logging/SessionManager.java @@ -16,6 +16,7 @@ package android.telecom.Logging; +import android.annotation.Nullable; import android.content.Context; import android.os.Handler; import android.os.Looper; @@ -180,7 +181,7 @@ public class SessionManager { Log.d(LOGGING_TAG, Session.START_EXTERNAL_SESSION); Session externalSession = new Session(Session.EXTERNAL_INDICATOR + sessionInfo.sessionId, sessionInfo.methodPath, System.currentTimeMillis(), - false /*isStartedFromActiveSession*/, null); + false /*isStartedFromActiveSession*/, sessionInfo.ownerInfo); externalSession.setIsExternal(true); // Mark the external session as already completed, since we have no way of knowing when // the external session actually has completed. @@ -224,7 +225,7 @@ public class SessionManager { // Start execution time of the session will be overwritten in continueSession(...). Session newSubsession = new Session(threadSession.getNextChildId(), threadSession.getShortMethodName(), System.currentTimeMillis(), - isStartedFromActiveSession, null); + isStartedFromActiveSession, threadSession.getOwnerInfo()); threadSession.addChild(newSubsession); newSubsession.setParentSession(threadSession); @@ -238,12 +239,18 @@ public class SessionManager { return newSubsession; } + public synchronized Session.Info getExternalSession() { + return getExternalSession(null /* ownerInfo */); + } + /** * Retrieve the information of the currently active Session. This information is parcelable and * is used to create an external Session ({@link #startExternalSession(Session.Info, String)}). * If there is no Session active, this method will return null. + * @param ownerInfo Owner information for the session. + * @return The session information */ - public synchronized Session.Info getExternalSession() { + public synchronized Session.Info getExternalSession(@Nullable String ownerInfo) { int threadId = getCallingThreadId(); Session threadSession = mSessionMapper.get(threadId); if (threadSession == null) { @@ -251,8 +258,7 @@ public class SessionManager { "active."); return null; } - - return threadSession.getInfo(); + return threadSession.getExternalInfo(ownerInfo); } /** diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java index 05480dc38a0d..df3362578680 100644 --- a/telecomm/java/android/telecom/RemoteConnection.java +++ b/telecomm/java/android/telecom/RemoteConnection.java @@ -30,13 +30,16 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; +import android.telecom.Logging.Session; import android.view.Surface; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; /** * A connection provided to a {@link ConnectionService} by another {@code ConnectionService} @@ -655,6 +658,7 @@ public final class RemoteConnection { private int mCallerDisplayNamePresentation; private RemoteConference mConference; private Bundle mExtras; + private String mCallingPackageAbbreviation; /** * @hide @@ -667,6 +671,13 @@ public final class RemoteConnection { mConnectionService = connectionService; mConnected = true; mState = Connection.STATE_INITIALIZING; + if (request != null && request.getExtras() != null + && request.getExtras().containsKey( + Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME)) { + String callingPackage = request.getExtras().getString( + Connection.EXTRA_REMOTE_CONNECTION_ORIGINATING_PACKAGE_NAME); + mCallingPackageAbbreviation = Log.getPackageAbbreviation(callingPackage); + } } /** @@ -705,6 +716,7 @@ public final class RemoteConnection { Bundle newExtras = new Bundle(); newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId); putExtras(newExtras); + mCallingPackageAbbreviation = Log.getPackageAbbreviation(callingPackage); } /** @@ -899,11 +911,15 @@ public final class RemoteConnection { * Instructs this {@code RemoteConnection} to abort. */ public void abort() { + Log.startSession("RC.a", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.abort(mConnectionId, null /*Session.Info*/); + mConnectionService.abort(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -911,11 +927,15 @@ public final class RemoteConnection { * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to answer. */ public void answer() { + Log.startSession("RC.an", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.answer(mConnectionId, null /*Session.Info*/); + mConnectionService.answer(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -925,11 +945,15 @@ public final class RemoteConnection { * @hide */ public void answer(int videoState) { + Log.startSession("RC.an2", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.answerVideo(mConnectionId, videoState, null /*Session.Info*/); + mConnectionService.answerVideo(mConnectionId, videoState, + Log.getExternalSession(mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -937,11 +961,15 @@ public final class RemoteConnection { * Instructs this {@link Connection#STATE_RINGING} {@code RemoteConnection} to reject. */ public void reject() { + Log.startSession("RC.r", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.reject(mConnectionId, null /*Session.Info*/); + mConnectionService.reject(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -949,11 +977,15 @@ public final class RemoteConnection { * Instructs this {@code RemoteConnection} to go on hold. */ public void hold() { + Log.startSession("RC.h", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.hold(mConnectionId, null /*Session.Info*/); + mConnectionService.hold(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -961,11 +993,15 @@ public final class RemoteConnection { * Instructs this {@link Connection#STATE_HOLDING} call to release from hold. */ public void unhold() { + Log.startSession("RC.u", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.unhold(mConnectionId, null /*Session.Info*/); + mConnectionService.unhold(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -973,11 +1009,15 @@ public final class RemoteConnection { * Instructs this {@code RemoteConnection} to disconnect. */ public void disconnect() { + Log.startSession("RC.d", getActiveOwnerInfo()); try { if (mConnected) { - mConnectionService.disconnect(mConnectionId, null /*Session.Info*/); + mConnectionService.disconnect(mConnectionId, Log.getExternalSession( + mCallingPackageAbbreviation)); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -991,11 +1031,14 @@ public final class RemoteConnection { * value must be one of {@code '0'} through {@code '9'}, {@code '*'} or {@code '#'}. */ public void playDtmfTone(char digit) { + Log.startSession("RC.pDT", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.playDtmfTone(mConnectionId, digit, null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1007,11 +1050,14 @@ public final class RemoteConnection { * currently playing, this method will do nothing. */ public void stopDtmfTone() { + Log.startSession("RC.sDT", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.stopDtmfTone(mConnectionId, null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1037,12 +1083,16 @@ public final class RemoteConnection { * @param proceed Whether or not to continue with the post-dial sequence. */ public void postDialContinue(boolean proceed) { + Log.startSession("RC.pDC", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.onPostDialContinue(mConnectionId, proceed, null /*Session.Info*/); } } catch (RemoteException ignored) { + // bliss + } finally { + Log.endSession(); } } @@ -1052,11 +1102,14 @@ public final class RemoteConnection { * See {@link Call#pullExternalCall()} for more information. */ public void pullExternalCall() { + Log.startSession("RC.pEC", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.pullExternalCall(mConnectionId, null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1079,12 +1132,15 @@ public final class RemoteConnection { * @param state The audio state of this {@code RemoteConnection}. */ public void setCallAudioState(CallAudioState state) { + Log.startSession("RC.sCAS", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.onCallAudioStateChanged(mConnectionId, state, null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1095,12 +1151,15 @@ public final class RemoteConnection { * @hide */ public void startRtt(@NonNull Connection.RttTextStream rttTextStream) { + Log.startSession("RC.sR", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.startRtt(mConnectionId, rttTextStream.getFdFromInCall(), rttTextStream.getFdToInCall(), null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1110,11 +1169,14 @@ public final class RemoteConnection { * @hide */ public void stopRtt() { + Log.startSession("RC.stR", getActiveOwnerInfo()); try { if (mConnected) { mConnectionService.stopRtt(mConnectionId, null /*Session.Info*/); } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1128,6 +1190,7 @@ public final class RemoteConnection { * the in-call app. */ public void sendRttUpgradeResponse(@Nullable Connection.RttTextStream rttTextStream) { + Log.startSession("RC.sRUR", getActiveOwnerInfo()); try { if (mConnected) { if (rttTextStream == null) { @@ -1140,6 +1203,8 @@ public final class RemoteConnection { } } } catch (RemoteException ignored) { + } finally { + Log.endSession(); } } @@ -1164,6 +1229,22 @@ public final class RemoteConnection { return mConference; } + /** + * Get the owner info for the currently active session. We want to make sure that any owner + * info from the original call into the connection manager gets retained so that the full + * context of the calls can be traced down to Telephony. + * Example: Telecom will provide owner info in it's external session info that indicates + * 'cast' as the calling owner. + * @return The active owner + */ + private String getActiveOwnerInfo() { + Session.Info info = Log.getExternalSession(); + if (info == null) { + return null; + } + return info.ownerInfo; + } + /** {@hide} */ String getId() { return mConnectionId; diff --git a/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java b/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java new file mode 100644 index 000000000000..6c6375586225 --- /dev/null +++ b/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.telephony; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.provider.Telephony; +import android.text.TextUtils; +import android.util.Log; + +/** + * This class provides utility functions related to CellBroadcast. + */ +public class CellBroadcastUtils { + private static final String TAG = "CellBroadcastUtils"; + private static final boolean VDBG = false; + + /** + * Utility method to query the default CBR's package name. + */ + public static String getDefaultCellBroadcastReceiverPackageName(Context context) { + PackageManager packageManager = context.getPackageManager(); + ResolveInfo resolveInfo = packageManager.resolveActivity( + new Intent(Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION), + PackageManager.MATCH_SYSTEM_ONLY); + String packageName; + + if (resolveInfo == null) { + Log.e(TAG, "getDefaultCellBroadcastReceiverPackageName: no package found"); + return null; + } + + packageName = resolveInfo.activityInfo.applicationInfo.packageName; + + if (VDBG) { + Log.d(TAG, "getDefaultCellBroadcastReceiverPackageName: found package: " + packageName); + } + + if (TextUtils.isEmpty(packageName) || packageManager.checkPermission( + android.Manifest.permission.READ_CELL_BROADCASTS, packageName) + == PackageManager.PERMISSION_DENIED) { + Log.e(TAG, "getDefaultCellBroadcastReceiverPackageName: returning null; " + + "permission check failed for : " + packageName); + return null; + } + + return packageName; + } +} diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index bf886c2f893f..3a3fb2826b74 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -1766,16 +1766,23 @@ class Linker { return 1; } - // Determine the package name under which to merge resources. - if (options_.rename_resources_package) { - context_->SetCompilationPackage(options_.rename_resources_package.value()); - } else if (Maybe<AppInfo> maybe_app_info = + // First extract the Package name without modifying it (via --rename-manifest-package). + if (Maybe<AppInfo> maybe_app_info = ExtractAppInfoFromManifest(manifest_xml.get(), context_->GetDiagnostics())) { - // Extract the package name from the manifest ignoring the value of --rename-manifest-package. const AppInfo& app_info = maybe_app_info.value(); context_->SetCompilationPackage(app_info.package); } + // Determine the package name under which to merge resources. + if (options_.rename_resources_package) { + if (!options_.custom_java_package) { + // Generate the R.java under the original package name instead of the package name specified + // through --rename-resources-package. + options_.custom_java_package = context_->GetCompilationPackage(); + } + context_->SetCompilationPackage(options_.rename_resources_package.value()); + } + // Now that the compilation package is set, load the dependencies. This will also extract // the Android framework's versionCode and versionName, if they exist. if (!LoadSymbolsFromIncludePaths()) { diff --git a/tools/stats_log_api_gen/java_writer.cpp b/tools/stats_log_api_gen/java_writer.cpp index 556cf5e12d01..f4c937c3f599 100644 --- a/tools/stats_log_api_gen/java_writer.cpp +++ b/tools/stats_log_api_gen/java_writer.cpp @@ -124,13 +124,7 @@ static int write_java_methods(FILE* out, const SignatureInfoMap& signatureInfoMa // Print method body. string indent(""); if (supportQ) { - // TODO(b/146235828): Use just SDK_INT check once it is incremented from - // Q. - fprintf(out, " if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q\n"); - fprintf(out, - " || (Build.VERSION.SDK_INT == " - "Build.VERSION_CODES.Q\n"); - fprintf(out, " && Build.VERSION.PREVIEW_SDK_INT > 0)) {\n"); + fprintf(out, " if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {\n"); indent = " "; } diff --git a/wifi/tests/AndroidTest.xml b/wifi/tests/AndroidTest.xml index ea5043ae5f65..34e2e3af9cda 100644 --- a/wifi/tests/AndroidTest.xml +++ b/wifi/tests/AndroidTest.xml @@ -30,9 +30,5 @@ <object type="module_controller" class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController"> <option name="mainline-module-package-name" value="com.google.android.wifi" /> - <!-- TODO(b/151836001): com.android.wifi doesn't guarantee it is a Mainline module since - it could still be OEM customized. Workaround so that this test will still run on - AOSP builds. --> - <option name="mainline-module-package-name" value="com.android.wifi" /> </object> </configuration> |