diff options
666 files changed, 13136 insertions, 7881 deletions
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java index bab2a859698c..231aaf2ca074 100644 --- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java +++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java @@ -232,7 +232,7 @@ public class StaticLayoutPerfTest { while (state.keepRunning()) { state.pauseTiming(); final MeasuredText text = new MeasuredText.Builder( - mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT) + mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT) .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE) .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) .build(); diff --git a/api/current.txt b/api/current.txt index 50579a44d15a..1ffba87773ac 100644 --- a/api/current.txt +++ b/api/current.txt @@ -902,6 +902,7 @@ package android { field public static final int maxLength = 16843104; // 0x1010160 field public static final int maxLevel = 16843186; // 0x10101b2 field public static final int maxLines = 16843091; // 0x1010153 + field public static final int maxLongVersionCode = 16844163; // 0x1010583 field public static final int maxRecents = 16843846; // 0x1010446 field public static final int maxRows = 16843059; // 0x1010133 field public static final int maxSdkVersion = 16843377; // 0x1010271 @@ -5710,7 +5711,8 @@ package android.app { field public static final java.lang.String ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED = "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; field public static final java.lang.String EXTRA_BLOCKED_STATE = "android.app.extra.BLOCKED_STATE"; - field public static final java.lang.String EXTRA_BLOCK_STATE_CHANGED_ID = "android.app.extra.BLOCK_STATE_CHANGED_ID"; + field public static final java.lang.String EXTRA_NOTIFICATION_CHANNEL_GROUP_ID = "android.app.extra.NOTIFICATION_CHANNEL_GROUP_ID"; + field public static final java.lang.String EXTRA_NOTIFICATION_CHANNEL_ID = "android.app.extra.NOTIFICATION_CHANNEL_ID"; field public static final int IMPORTANCE_DEFAULT = 3; // 0x3 field public static final int IMPORTANCE_HIGH = 4; // 0x4 field public static final int IMPORTANCE_LOW = 2; // 0x2 @@ -11616,15 +11618,15 @@ package android.content.res { public final class AssetManager implements java.lang.AutoCloseable { method public void close(); - method public final java.lang.String[] getLocales(); - method public final java.lang.String[] list(java.lang.String) throws java.io.IOException; - method public final java.io.InputStream open(java.lang.String) throws java.io.IOException; - method public final java.io.InputStream open(java.lang.String, int) throws java.io.IOException; - method public final android.content.res.AssetFileDescriptor openFd(java.lang.String) throws java.io.IOException; - method public final android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String) throws java.io.IOException; - method public final android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String) throws java.io.IOException; - method public final android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String) throws java.io.IOException; - method public final android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String) throws java.io.IOException; + method public java.lang.String[] getLocales(); + method public java.lang.String[] list(java.lang.String) throws java.io.IOException; + method public java.io.InputStream open(java.lang.String) throws java.io.IOException; + method public java.io.InputStream open(java.lang.String, int) throws java.io.IOException; + method public android.content.res.AssetFileDescriptor openFd(java.lang.String) throws java.io.IOException; + method public android.content.res.AssetFileDescriptor openNonAssetFd(java.lang.String) throws java.io.IOException; + method public android.content.res.AssetFileDescriptor openNonAssetFd(int, java.lang.String) throws java.io.IOException; + method public android.content.res.XmlResourceParser openXmlResourceParser(java.lang.String) throws java.io.IOException; + method public android.content.res.XmlResourceParser openXmlResourceParser(int, java.lang.String) throws java.io.IOException; field public static final int ACCESS_BUFFER = 3; // 0x3 field public static final int ACCESS_RANDOM = 1; // 0x1 field public static final int ACCESS_STREAMING = 2; // 0x2 @@ -16489,8 +16491,37 @@ package android.hardware.display { package android.hardware.fingerprint { public class FingerprintDialog { - method public void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback); - method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback); + method public void authenticate(android.hardware.fingerprint.FingerprintDialog.CryptoObject, android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback); + method public void authenticate(android.os.CancellationSignal, java.util.concurrent.Executor, android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback); + field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0 + field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3 + field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2 + field public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; // 0x1 + field public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; // 0x5 + field public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; // 0x4 + field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5 + field public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; // 0xc + field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1 + field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7 + field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9 + field public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; // 0xb + field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4 + field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3 + field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2 + field public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; // 0xa + field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8 + } + + public static abstract class FingerprintDialog.AuthenticationCallback { + ctor public FingerprintDialog.AuthenticationCallback(); + method public void onAuthenticationError(int, java.lang.CharSequence); + method public void onAuthenticationFailed(); + method public void onAuthenticationHelp(int, java.lang.CharSequence); + method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintDialog.AuthenticationResult); + } + + public static class FingerprintDialog.AuthenticationResult { + method public android.hardware.fingerprint.FingerprintDialog.CryptoObject getCryptoObject(); } public static class FingerprintDialog.Builder { @@ -16502,10 +16533,19 @@ package android.hardware.fingerprint { method public android.hardware.fingerprint.FingerprintDialog.Builder setTitle(java.lang.CharSequence); } - public class FingerprintManager { - method public void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, int, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, android.os.Handler); - method public boolean hasEnrolledFingerprints(); - method public boolean isHardwareDetected(); + public static final class FingerprintDialog.CryptoObject { + ctor public FingerprintDialog.CryptoObject(java.security.Signature); + ctor public FingerprintDialog.CryptoObject(javax.crypto.Cipher); + ctor public FingerprintDialog.CryptoObject(javax.crypto.Mac); + method public javax.crypto.Cipher getCipher(); + method public javax.crypto.Mac getMac(); + method public java.security.Signature getSignature(); + } + + public deprecated class FingerprintManager { + method public deprecated void authenticate(android.hardware.fingerprint.FingerprintManager.CryptoObject, android.os.CancellationSignal, int, android.hardware.fingerprint.FingerprintManager.AuthenticationCallback, android.os.Handler); + method public deprecated boolean hasEnrolledFingerprints(); + method public deprecated boolean isHardwareDetected(); field public static final int FINGERPRINT_ACQUIRED_GOOD = 0; // 0x0 field public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; // 0x3 field public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; // 0x2 @@ -16513,9 +16553,11 @@ package android.hardware.fingerprint { field public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; // 0x5 field public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; // 0x4 field public static final int FINGERPRINT_ERROR_CANCELED = 5; // 0x5 + field public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; // 0xc field public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; // 0x1 field public static final int FINGERPRINT_ERROR_LOCKOUT = 7; // 0x7 field public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; // 0x9 + field public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; // 0xb field public static final int FINGERPRINT_ERROR_NO_SPACE = 4; // 0x4 field public static final int FINGERPRINT_ERROR_TIMEOUT = 3; // 0x3 field public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; // 0x2 @@ -24518,7 +24560,7 @@ package android.media { field public static final int DIRECTIONALITY_HYPER_CARDIOID = 4; // 0x4 field public static final int DIRECTIONALITY_OMNI = 1; // 0x1 field public static final int DIRECTIONALITY_SUPER_CARDIOID = 5; // 0x5 - field public static final int DIRECTIONALITY_UNKNOW = 0; // 0x0 + field public static final int DIRECTIONALITY_UNKNOWN = 0; // 0x0 field public static final int LOCATION_MAINBODY = 1; // 0x1 field public static final int LOCATION_MAINBODY_MOVABLE = 2; // 0x2 field public static final int LOCATION_PERIPHERAL = 3; // 0x3 @@ -28606,10 +28648,14 @@ package android.nfc { field public static final java.lang.String ACTION_NDEF_DISCOVERED = "android.nfc.action.NDEF_DISCOVERED"; field public static final java.lang.String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED"; field public static final java.lang.String ACTION_TECH_DISCOVERED = "android.nfc.action.TECH_DISCOVERED"; + field public static final java.lang.String ACTION_TRANSACTION_DETECTED = "android.nfc.action.TRANSACTION_DETECTED"; field public static final java.lang.String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE"; + field public static final java.lang.String EXTRA_AID = "android.nfc.extra.AID"; + field public static final java.lang.String EXTRA_DATA = "android.nfc.extra.DATA"; field public static final java.lang.String EXTRA_ID = "android.nfc.extra.ID"; field public static final java.lang.String EXTRA_NDEF_MESSAGES = "android.nfc.extra.NDEF_MESSAGES"; field public static final java.lang.String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence"; + field public static final java.lang.String EXTRA_SE_NAME = "android.nfc.extra.SE_NAME"; field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG"; field public static final int FLAG_READER_NFC_A = 1; // 0x1 field public static final int FLAG_READER_NFC_B = 2; // 0x2 @@ -33075,7 +33121,7 @@ package android.os { field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials"; field public static final java.lang.String DISALLOW_CONFIG_DATE_TIME = "no_config_date_time"; field public static final java.lang.String DISALLOW_CONFIG_LOCALE = "no_config_locale"; - field public static final java.lang.String DISALLOW_CONFIG_LOCATION_MODE = "no_config_location_mode"; + field public static final java.lang.String DISALLOW_CONFIG_LOCATION = "no_config_location"; field public static final java.lang.String DISALLOW_CONFIG_MOBILE_NETWORKS = "no_config_mobile_networks"; field public static final java.lang.String DISALLOW_CONFIG_SCREEN_TIMEOUT = "no_config_screen_timeout"; field public static final java.lang.String DISALLOW_CONFIG_TETHERING = "no_config_tethering"; @@ -41766,10 +41812,10 @@ package android.telephony { method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler); method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler); method public int download(android.telephony.mbms.DownloadRequest); - method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo); method public java.io.File getTempFileRootDirectory(); method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(); method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler); + method public void requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo); method public void requestUpdateFileServices(java.util.List<java.lang.String>); method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest); method public void setTempFileRootDirectory(java.io.File); @@ -42698,6 +42744,7 @@ package android.telephony.mbms { public static class MbmsErrors.DownloadErrors { field public static final int ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT = 401; // 0x191 field public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; // 0x192 + field public static final int ERROR_UNKNOWN_FILE_INFO = 403; // 0x193 } public static class MbmsErrors.GeneralErrors { @@ -44931,6 +44978,7 @@ package android.util { field public static final int DENSITY_360 = 360; // 0x168 field public static final int DENSITY_400 = 400; // 0x190 field public static final int DENSITY_420 = 420; // 0x1a4 + field public static final int DENSITY_440 = 440; // 0x1b8 field public static final int DENSITY_560 = 560; // 0x230 field public static final int DENSITY_DEFAULT = 160; // 0xa0 field public static final int DENSITY_DEVICE_STABLE; @@ -47389,6 +47437,7 @@ package android.view { method public boolean isTextDirectionResolved(); method public boolean isVerticalFadingEdgeEnabled(); method public boolean isVerticalScrollBarEnabled(); + method public boolean isVisibleToUserForAutofill(int); method public void jumpDrawablesToCurrentState(); method public android.view.View keyboardNavigationClusterSearch(android.view.View, int); method public void layout(int, int, int, int); diff --git a/api/system-current.txt b/api/system-current.txt index ad71e7cbb278..70148d97e717 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -19,7 +19,6 @@ package android { field public static final java.lang.String BATTERY_STATS = "android.permission.BATTERY_STATS"; field public static final java.lang.String BIND_APPWIDGET = "android.permission.BIND_APPWIDGET"; field public static final deprecated java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE"; - field public static final java.lang.String BIND_DATA_SERVICE = "android.permission.BIND_DATA_SERVICE"; field public static final java.lang.String BIND_DIRECTORY_SEARCH = "android.permission.BIND_DIRECTORY_SEARCH"; field public static final java.lang.String BIND_IMS_SERVICE = "android.permission.BIND_IMS_SERVICE"; field public static final java.lang.String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET"; @@ -30,7 +29,9 @@ package android { field public static final java.lang.String BIND_RESOLVER_RANKER_SERVICE = "android.permission.BIND_RESOLVER_RANKER_SERVICE"; field public static final java.lang.String BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE = "android.permission.BIND_RUNTIME_PERMISSION_PRESENTER_SERVICE"; field public static final java.lang.String BIND_SETTINGS_SUGGESTIONS_SERVICE = "android.permission.BIND_SETTINGS_SUGGESTIONS_SERVICE"; + field public static final java.lang.String BIND_TELEPHONY_DATA_SERVICE = "android.permission.BIND_TELEPHONY_DATA_SERVICE"; field public static final java.lang.String BIND_TEXTCLASSIFIER_SERVICE = "android.permission.BIND_TEXTCLASSIFIER_SERVICE"; + field public static final java.lang.String BIND_TELEPHONY_NETWORK_SERVICE = "android.permission.BIND_TELEPHONY_NETWORK_SERVICE"; field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE"; field public static final java.lang.String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED"; @@ -774,6 +775,7 @@ package android.content { public abstract class Context { method public boolean bindServiceAsUser(android.content.Intent, android.content.ServiceConnection, int, android.os.UserHandle); method public abstract android.content.Context createCredentialProtectedStorageContext(); + method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract java.io.File getPreloadsFileCache(); method public abstract boolean isCredentialProtectedStorage(); method public abstract void sendBroadcast(android.content.Intent, java.lang.String, android.os.Bundle); @@ -2022,6 +2024,7 @@ package android.hardware.radio { method public int describeContents(); method public android.hardware.radio.RadioManager.BandDescriptor[] getBands(); method public int getClassId(); + method public java.util.Map<java.lang.String, java.lang.Integer> getDabFrequencyTable(); method public int getId(); method public java.lang.String getImplementor(); method public int getNumAudioSources(); @@ -4119,6 +4122,7 @@ package android.provider { public static final class Settings.Global extends android.provider.Settings.NameValueTable { method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean); method public static void resetToDefaults(android.content.ContentResolver, java.lang.String); + field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages"; field public static final java.lang.String OTA_DISABLE_AUTOMATIC_UPDATE = "ota_disable_automatic_update"; field public static final java.lang.String THEATER_MODE_ON = "theater_mode_on"; field public static final java.lang.String WEBVIEW_MULTIPROCESS = "webview_multiprocess"; @@ -5900,11 +5904,11 @@ package android.telephony.mbms.vendor { method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; method public void dispose(int) throws android.os.RemoteException; method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException; method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException; method public void onAppCallbackDied(int, int); method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback) throws android.os.RemoteException; + method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; method public int setTempFileRootDirectory(int, java.lang.String) throws android.os.RemoteException; diff --git a/api/test-current.txt b/api/test-current.txt index 92bf24db7f5a..ac4ce3b48b3d 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -183,10 +183,7 @@ package android.content { } public abstract class Context { - method public abstract int getUserId(); - } - - public class ContextWrapper extends android.content.Context { + method public android.os.UserHandle getUser(); method public int getUserId(); } @@ -752,11 +749,11 @@ package android.telephony.mbms.vendor { method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; method public void dispose(int) throws android.os.RemoteException; method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int getDownloadStatus(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException; method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException; method public void onAppCallbackDied(int, int); method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback) throws android.os.RemoteException; + method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; method public int setTempFileRootDirectory(int, java.lang.String) throws android.os.RemoteException; @@ -1056,6 +1053,14 @@ package android.view.autofill { } +package android.view.inputmethod { + + public final class InputMethodManager { + method public boolean isInputMethodPickerShown(); + } + +} + package android.widget { public abstract class AbsListView extends android.widget.AdapterView implements android.widget.Filter.FilterListener android.text.TextWatcher android.view.ViewTreeObserver.OnGlobalLayoutListener android.view.ViewTreeObserver.OnTouchModeChangeListener { diff --git a/cmds/dpm/src/com/android/commands/dpm/Dpm.java b/cmds/dpm/src/com/android/commands/dpm/Dpm.java index 47581e10e937..7c1a5557a1e9 100644 --- a/cmds/dpm/src/com/android/commands/dpm/Dpm.java +++ b/cmds/dpm/src/com/android/commands/dpm/Dpm.java @@ -46,6 +46,7 @@ public final class Dpm extends BaseCommand { private static final String COMMAND_SET_PROFILE_OWNER = "set-profile-owner"; private static final String COMMAND_REMOVE_ACTIVE_ADMIN = "remove-active-admin"; private static final String COMMAND_CLEAR_FREEZE_PERIOD_RECORD = "clear-freeze-period-record"; + private static final String COMMAND_FORCE_SECURITY_LOGS = "force-security-logs"; private IDevicePolicyManager mDevicePolicyManager; private int mUserId = UserHandle.USER_SYSTEM; @@ -76,11 +77,15 @@ public final class Dpm extends BaseCommand { "\n" + "dpm remove-active-admin: Disables an active admin, the admin must have declared" + " android:testOnly in the application in its manifest. This will also remove" + - " device and profile owners\n" + + " device and profile owners.\n" + "\n" + "dpm " + COMMAND_CLEAR_FREEZE_PERIOD_RECORD + ": clears framework-maintained " + "record of past freeze periods that the device went through. For use during " + - "feature development to prevent triggering restriction on setting freeze periods"); + "feature development to prevent triggering restriction on setting freeze " + + "periods.\n" + + "\n" + + "dpm " + COMMAND_FORCE_SECURITY_LOGS + ": makes all security logs available to " + + "the DPC and triggers DeviceAdminReceiver.onSecurityLogsAvailable() if needed."); } @Override @@ -109,11 +114,26 @@ public final class Dpm extends BaseCommand { case COMMAND_CLEAR_FREEZE_PERIOD_RECORD: runClearFreezePeriodRecord(); break; + case COMMAND_FORCE_SECURITY_LOGS: + runForceSecurityLogs(); + break; default: throw new IllegalArgumentException ("unknown command '" + command + "'"); } } + private void runForceSecurityLogs() throws RemoteException, InterruptedException { + while (true) { + final long toWait = mDevicePolicyManager.forceSecurityLogs(); + if (toWait == 0) { + break; + } + System.out.println("We have to wait for " + toWait + " milliseconds..."); + Thread.sleep(toWait); + } + System.out.println("Success"); + } + private void parseArgs(boolean canHaveName) { String opt; while ((opt = nextOption()) != null) { diff --git a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java index 360b2308b1c7..b76d6694ca2d 100644 --- a/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java +++ b/cmds/requestsync/src/com/android/commands/requestsync/RequestSync.java @@ -19,6 +19,7 @@ package com.android.commands.requestsync; import android.accounts.Account; import android.content.ContentResolver; +import android.content.SyncRequest; import android.os.Bundle; import java.net.URISyntaxException; @@ -28,12 +29,31 @@ public class RequestSync { private String[] mArgs; private int mNextArg; private String mCurArgData; + private boolean mIsForegroundRequest; enum Operation { REQUEST_SYNC { @Override void invoke(RequestSync caller) { - ContentResolver.requestSync(caller.mAccount, caller.mAuthority, caller.mExtras); + if (caller.mIsForegroundRequest) { + caller.mExtras.putBoolean( + ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC, true); + } else { + caller.mExtras.putBoolean( + ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC, true); + System.out.println( + "Making a sync request as a background app.\n" + + "Note: request may be throttled by App Standby.\n" + + "To override this behavior and run a sync immediately," + + " pass a -f option.\n"); + } + final SyncRequest request = + new SyncRequest.Builder() + .setSyncAdapter(caller.mAccount, caller.mAuthority) + .setExtras(caller.mExtras) + .syncOnce() + .build(); + ContentResolver.requestSync(request); } }, ADD_PERIODIC_SYNC { @@ -191,6 +211,10 @@ public class RequestSync { final String key = nextArgRequired(); final String value = nextArgRequired(); mExtras.putBoolean(key, Boolean.valueOf(value)); + + } else if (opt.equals("-f") || opt.equals("--foreground")) { + mIsForegroundRequest = true; + } else { System.err.println("Error: Unknown option: " + opt); showUsage(); @@ -267,6 +291,9 @@ public class RequestSync { " -n|--account-name <ACCOUNT-NAME>\n" + " -t|--account-type <ACCOUNT-TYPE>\n" + " -a|--authority <AUTHORITY>\n" + + " App-standby related options\n" + + "\n" + + " -f|--foreground (Exempt a sync from app standby)\n" + " ContentResolver extra options:\n" + " --is|--ignore-settings: Add SYNC_EXTRAS_IGNORE_SETTINGS\n" + " --ib|--ignore-backoff: Add SYNC_EXTRAS_IGNORE_BACKOFF\n" + diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 4e4145439e25..32da94f862c5 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -34,6 +34,7 @@ #include <private/android_filesystem_config.h> #include <utils/Looper.h> #include <utils/String16.h> +#include <statslog.h> #include <stdio.h> #include <stdlib.h> #include <sys/system_properties.h> @@ -235,6 +236,10 @@ status_t StatsService::command(FILE* in, FILE* out, FILE* err, Vector<String8>& if (!args[0].compare(String8("write-to-disk"))) { return cmd_write_data_to_disk(out); } + + if (!args[0].compare(String8("log-app-hook"))) { + return cmd_log_app_hook(out, args); + } } print_cmd_help(out); @@ -272,6 +277,15 @@ void StatsService::print_cmd_help(FILE* out) { fprintf(out, " Flushes all data on memory to disk.\n"); fprintf(out, "\n"); fprintf(out, "\n"); + fprintf(out, "usage: adb shell cmd stats log-app-hook [UID] LABEL STATE\n"); + fprintf(out, " Writes an AppHook event to the statslog buffer.\n"); + fprintf(out, " UID The uid to use. It is only possible to pass a UID\n"); + fprintf(out, " parameter on eng builds. If UID is omitted the calling\n"); + fprintf(out, " uid is used.\n"); + fprintf(out, " LABEL Integer in [0, 15], as per atoms.proto.\n"); + fprintf(out, " STATE Integer in [0, 3], as per atoms.proto.\n"); + fprintf(out, "\n"); + fprintf(out, "\n"); fprintf(out, "usage: adb shell cmd stats config remove [UID] [NAME]\n"); fprintf(out, "usage: adb shell cmd stats config update [UID] NAME\n"); fprintf(out, "\n"); @@ -523,6 +537,42 @@ status_t StatsService::cmd_write_data_to_disk(FILE* out) { return NO_ERROR; } +status_t StatsService::cmd_log_app_hook(FILE* out, const Vector<String8>& args) { + bool good = false; + int32_t uid; + int32_t label; + int32_t state; + const int argCount = args.size(); + if (argCount == 3) { + // Automatically pick the UID + uid = IPCThreadState::self()->getCallingUid(); + label = atoi(args[1].c_str()); + state = atoi(args[2].c_str()); + good = true; + } else if (argCount == 4) { + uid = atoi(args[1].c_str()); + // If it's a userdebug or eng build, then the shell user can impersonate other uids. + // Otherwise, the uid must match the actual caller's uid. + if (mEngBuild || (uid >= 0 && (uid_t)uid == IPCThreadState::self()->getCallingUid())) { + label = atoi(args[2].c_str()); + state = atoi(args[3].c_str()); + good = true; + } else { + fprintf(out, + "Selecting a UID for writing AppHook can only be dumped for other UIDs on eng" + " or userdebug builds.\n"); + } + } + if (good) { + fprintf(out, "Logging AppHook(%d, %d, %d) to statslog.\n", uid, label, state); + android::util::stats_write(android::util::APP_HOOK, uid, label, state); + } else { + print_cmd_help(out); + return UNKNOWN_ERROR; + } + return NO_ERROR; +} + status_t StatsService::cmd_print_pulled_metrics(FILE* out, const Vector<String8>& args) { int s = atoi(args[1].c_str()); vector<shared_ptr<LogEvent> > stats; diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index fd3ed1dbed72..109752b0295f 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -183,6 +183,11 @@ private: status_t cmd_write_data_to_disk(FILE* out); /** + * Write an AppHook event to the StatsLog buffer, as though StatsLog.write(APP_HOOK). + */ + status_t cmd_log_app_hook(FILE* out, const Vector<String8>& args); + + /** * Print contents of a pulled metrics source. */ status_t cmd_print_pulled_metrics(FILE* out, const Vector<String8>& args); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index b156d8dc54a4..ed570e76a3d1 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -95,6 +95,8 @@ message Atom { AppStartMemoryStateCaptured app_start_memory_state_captured = 55; ShutdownSequenceReported shutdown_sequence_reported = 56; BootSequenceReported boot_sequence_reported = 57; + DaveyOccurred davey_occurred = 58; + OverlayStateChanged overlay_state_changed = 59; // TODO: Reorder the numbering so that the most frequent occur events occur in the first 15. } @@ -723,6 +725,17 @@ message BootSequenceReported { } /** + * Logs the duration of a davey (jank of >=700ms) when it occurs + * + * Logged from: + * frameworks/base/libs/hwui/JankTracker.cpp + */ +message DaveyOccurred { + // Amount of time it took to render the frame. Should be >=700ms. + optional int64 jank_duration_ms = 1; +} + +/** * Logs phone signal strength changes. * * Logged from: @@ -967,6 +980,25 @@ message PictureInPictureStateChanged { } /** + * Logs overlay action + * Logged from: + * services/core/java/com/android/server/wm/Session.java + */ +message OverlayStateChanged { + optional int32 uid = 1; + + optional string package_name = 2; + + optional bool using_alert_window = 3; + + enum State { + ENTERED = 1; + EXITED = 2; + } + optional State state = 4; +} + +/** * Pulls bytes transferred via wifi (Sum of foreground and background usage). * * Pulled from: diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp index 9e72f5bd4b72..1dcd8534db79 100644 --- a/cmds/statsd/src/logd/LogEvent.cpp +++ b/cmds/statsd/src/logd/LogEvent.cpp @@ -62,13 +62,14 @@ void LogEvent::init() { const char* buffer; size_t len = android_log_write_list_buffer(mContext, &buffer); // turns to reader mode - mContext = create_android_log_parser(buffer, len); - init(mContext); - // destroy the context to save memory. - if (mContext) { + android_log_context contextForRead = create_android_log_parser(buffer, len); + if (contextForRead) { + init(contextForRead); + // destroy the context to save memory. // android_log_destroy will set mContext to NULL - android_log_destroy(&mContext); + android_log_destroy(&contextForRead); } + android_log_destroy(&mContext); } } @@ -188,6 +189,9 @@ void increaseField(Field *field, bool is_child) { * of the elements that are written to the log. */ void LogEvent::init(android_log_context context) { + if (!context) { + return; + } android_log_list_element elem; // TODO: The log is actually structured inside one list. This is convenient // because we'll be able to use it to put the attribution (WorkSource) block first diff --git a/cmds/statsd/src/matchers/matcher_util.cpp b/cmds/statsd/src/matchers/matcher_util.cpp index b6f440f2e348..fae91729fe4f 100644 --- a/cmds/statsd/src/matchers/matcher_util.cpp +++ b/cmds/statsd/src/matchers/matcher_util.cpp @@ -129,43 +129,60 @@ bool matchesNonRepeatedField(const UidMap& uidMap, const FieldValueMap& fieldMap } bool matched = false; switch (matcher.value_matcher_case()) { - case FieldValueMatcher::ValueMatcherCase::kEqBool: - // Logd does not support bool, it is int instead. - matched = ((ret.first->second.value_int() > 0) == matcher.eq_bool()); - break; - case FieldValueMatcher::ValueMatcherCase::kEqString: - { - if (IsAttributionUidField(*rootField)) { - const int uid = ret.first->second.value_int(); - std::set<string> packageNames = + case FieldValueMatcher::ValueMatcherCase::kEqBool: { + // Logd does not support bool, it is int instead. + matched = ((ret.first->second.value_int() > 0) == matcher.eq_bool()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kEqString: { + if (IsAttributionUidField(*rootField)) { + const int uid = ret.first->second.value_int(); + std::set<string> packageNames = uidMap.getAppNamesFromUid(uid, true /* normalize*/); - matched = packageNames.find(matcher.eq_string()) != packageNames.end(); - } else { - matched = (ret.first->second.value_str() == matcher.eq_string()); - } - } - break; - case FieldValueMatcher::ValueMatcherCase::kEqInt: - matched = (ret.first->second.value_int() == matcher.eq_int()); - break; - case FieldValueMatcher::ValueMatcherCase::kLtInt: - matched = (ret.first->second.value_int() < matcher.lt_int()); - break; - case FieldValueMatcher::ValueMatcherCase::kGtInt: - matched = (ret.first->second.value_int() > matcher.gt_int()); - break; - case FieldValueMatcher::ValueMatcherCase::kLtFloat: - matched = (ret.first->second.value_float() < matcher.lt_float()); - break; - case FieldValueMatcher::ValueMatcherCase::kGtFloat: - matched = (ret.first->second.value_float() > matcher.gt_float()); - break; - case FieldValueMatcher::ValueMatcherCase::kLteInt: - matched = (ret.first->second.value_int() <= matcher.lte_int()); - break; - case FieldValueMatcher::ValueMatcherCase::kGteInt: - matched = (ret.first->second.value_int() >= matcher.gte_int()); - break; + matched = packageNames.find(matcher.eq_string()) != packageNames.end(); + } else { + matched = (ret.first->second.value_str() == matcher.eq_string()); + } + break; + } + case FieldValueMatcher::ValueMatcherCase::kEqInt: { + int64_t val = ret.first->second.has_value_int() ? + ret.first->second.value_int() : ret.first->second.value_long(); + matched = (val == matcher.eq_int()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kLtInt: { + int64_t val = ret.first->second.has_value_int() ? + ret.first->second.value_int() : ret.first->second.value_long(); + matched = (val < matcher.lt_int()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kGtInt: { + int64_t val = ret.first->second.has_value_int() ? + ret.first->second.value_int() : ret.first->second.value_long(); + matched = (val > matcher.gt_int()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kLtFloat: { + matched = (ret.first->second.value_float() < matcher.lt_float()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kGtFloat: { + matched = (ret.first->second.value_float() > matcher.gt_float()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kLteInt: { + int64_t val = ret.first->second.has_value_int() ? + ret.first->second.value_int() : ret.first->second.value_long(); + matched = (val <= matcher.lte_int()); + break; + } + case FieldValueMatcher::ValueMatcherCase::kGteInt: { + int64_t val = ret.first->second.has_value_int() ? + ret.first->second.value_int() : ret.first->second.value_long(); + matched = (val >= matcher.gte_int()); + break; + } default: break; } diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index d0737de8acf3..417145c00e54 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -47,7 +47,7 @@ const int FIELD_ID_METRICS = 1; MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, const long timeBaseSec, sp<UidMap> uidMap) - : mConfigKey(key), mUidMap(uidMap) { + : mConfigKey(key), mUidMap(uidMap), mStatsdUid(getStatsdUid()) { mConfigValid = initStatsdConfig(key, config, *uidMap, timeBaseSec, mTagIds, mAllAtomMatchers, mAllConditionTrackers, mAllMetricProducers, mAllAnomalyTrackers, mConditionToMetricMap, @@ -61,6 +61,7 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, mAllowedUid.push_back(1000); mAllowedUid.push_back(0); + mAllowedUid.push_back(mStatsdUid); mAllowedLogSources.insert(mAllowedUid.begin(), mAllowedUid.end()); } else { for (const auto& source : config.allowed_log_source()) { @@ -189,26 +190,45 @@ void MetricsManager::onLogEvent(const LogEvent& event) { return; } - if (event.GetTagId() != android::util::APP_HOOK) { - std::lock_guard<std::mutex> lock(mAllowedLogSourcesMutex); - if (mAllowedLogSources.find(event.GetUid()) == mAllowedLogSources.end()) { - VLOG("log source %d not on the whitelist", event.GetUid()); + if (event.GetTagId() == android::util::APP_HOOK) { // Check that app hook fields are valid. + // TODO: Find a way to make these checks easier to maintain if the app hooks get changed. + status_t err = NO_ERROR; + + // Uid is 3rd from last field and must match the caller's uid, + // unless that caller is statsd itself (statsd is allowed to spoof uids). + long appHookUid = event.GetLong(event.size()-2, &err); + int32_t loggerUid = event.GetUid(); + if (err != NO_ERROR || (loggerUid != appHookUid && loggerUid != mStatsdUid)) { + VLOG("AppHook has invalid uid: claimed %ld but caller is %d", appHookUid, loggerUid); return; } - } else { // Check that app hook fields are valid. - // TODO: Find a way to make these checks easier to maintain if the app hooks get changed. // Label is 2nd from last field and must be from [0, 15]. - status_t err = NO_ERROR; - long label = event.GetLong(event.size()-1, &err); - if (err != NO_ERROR || label < 0 || label > 15) { - VLOG("App hook does not have valid label %ld", label); + long appHookLabel = event.GetLong(event.size()-1, &err); + if (err != NO_ERROR || appHookLabel < 0 || appHookLabel > 15) { + VLOG("AppHook does not have valid label %ld", appHookLabel); return; } + // The state must be from 0,3. This part of code must be manually updated. - long apphookState = event.GetLong(event.size(), &err); - if (err != NO_ERROR || apphookState < 0 || apphookState > 3) { - VLOG("App hook does not have valid state %ld", apphookState); + long appHookState = event.GetLong(event.size(), &err); + if (err != NO_ERROR || appHookState < 0 || appHookState > 3) { + VLOG("AppHook does not have valid state %ld", appHookState); + return; + } + } else if (event.GetTagId() == android::util::DAVEY_OCCURRED) { + // Daveys can be logged from any app since they are logged in libs/hwui/JankTracker.cpp. + // Check that the davey duration is reasonable. Max length check is for privacy. + status_t err = NO_ERROR; + long duration = event.GetLong(event.size(), &err); + if (err != NO_ERROR || duration > 100000) { + VLOG("Davey duration is unreasonably long: %ld", duration); + return; + } + } else { + std::lock_guard<std::mutex> lock(mAllowedLogSourcesMutex); + if (mAllowedLogSources.find(event.GetUid()) == mAllowedLogSources.end()) { + VLOG("log source %d not on the whitelist", event.GetUid()); return; } } @@ -313,6 +333,16 @@ size_t MetricsManager::byteSize() { return totalSize; } +int32_t MetricsManager::getStatsdUid() { + auto suit = UidMap::sAidToUidMapping.find("AID_STATSD"); + if (suit != UidMap::sAidToUidMapping.end()) { + return suit->second; + } else { + ALOGE("Statsd failed to find its own uid!"); + return -1; + } +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index d4b9102d5ddc..a1220f9ecd49 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -75,6 +75,9 @@ private: sp<UidMap> mUidMap; + // The uid of statsd. + const int32_t mStatsdUid; + bool mConfigValid = false; // The uid log sources from StatsdConfig. @@ -136,6 +139,9 @@ private: void initLogSourceWhiteList(); + // Fetches the uid of statsd from UidMap. + static int32_t getStatsdUid(); + // The metrics that don't need to be uploaded or even reported. std::set<int64_t> mNoReportMetricIds; diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto index 2ea79a64a5ea..3eaf7a17a3e2 100644 --- a/cmds/statsd/src/statsd_config.proto +++ b/cmds/statsd/src/statsd_config.proto @@ -64,7 +64,7 @@ message FieldValueMatcher { oneof value_matcher { bool eq_bool = 3; string eq_string = 4; - int32 eq_int = 5; + int64 eq_int = 5; int64 lt_int = 6; int64 gt_int = 7; diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index 05e51a478889..58936fcc4452 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -15,6 +15,7 @@ Landroid/app/ActivityManager;->isUserRunning(I)Z Landroid/app/ActivityManager;->mContext:Landroid/content/Context; Landroid/app/ActivityManagerNative;->getDefault()Landroid/app/IActivityManager; Landroid/app/ActivityManager;->PROCESS_STATE_TOP:I +Landroid/app/ActivityManager$RecentTaskInfo;->firstActiveTime:J Landroid/app/ActivityManager$RunningAppProcessInfo;->flags:I Landroid/app/ActivityManager$RunningAppProcessInfo;->processState:I Landroid/app/Activity;->mApplication:Landroid/app/Application; @@ -24,6 +25,7 @@ Landroid/app/Activity;->mResultData:Landroid/content/Intent; Landroid/app/Activity;->mToken:Landroid/os/IBinder; Landroid/app/Activity;->mWindow:Landroid/view/Window; Landroid/app/Activity;->mWindowManager:Landroid/view/WindowManager; +Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V Landroid/app/ActivityThread$ActivityClientRecord;->activityInfo:Landroid/content/pm/ActivityInfo; Landroid/app/ActivityThread$ActivityClientRecord;->token:Landroid/os/IBinder; Landroid/app/ActivityThread$AppBindData;->info:Landroid/app/LoadedApk; @@ -31,6 +33,7 @@ Landroid/app/ActivityThread$AppBindData;->instrumentationArgs:Landroid/os/Bundle Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; Landroid/app/ActivityThread;->currentApplication()Landroid/app/Application; Landroid/app/ActivityThread;->currentPackageName()Ljava/lang/String; +Landroid/app/ActivityThread;->currentProcessName()Ljava/lang/String; Landroid/app/ActivityThread;->getApplication()Landroid/app/Application; Landroid/app/ActivityThread;->getApplicationThread()Landroid/app/ActivityThread$ApplicationThread; Landroid/app/ActivityThread;->getHandler()Landroid/os/Handler; @@ -71,6 +74,9 @@ Landroid/app/ApplicationLoaders;->getDefault()Landroid/app/ApplicationLoaders; Landroid/app/ApplicationLoaders;->mLoaders:Landroid/util/ArrayMap; Landroid/app/Application;->mComponentCallbacks:Ljava/util/ArrayList; Landroid/app/Application;->mLoadedApk:Landroid/app/LoadedApk; +Landroid/app/ApplicationPackageManager;->deletePackage(Ljava/lang/String;Landroid/content/pm/IPackageDeleteObserver;I)V +Landroid/app/ApplicationPackageManager;->installExistingPackage(Ljava/lang/String;)I +Landroid/app/ApplicationPackageManager;->installExistingPackage(Ljava/lang/String;I)I Landroid/app/AppOpsManager;->checkOp(IILjava/lang/String;)I Landroid/app/AppOpsManager;->checkOpNoThrow(IILjava/lang/String;)I Landroid/app/AppOpsManager;->noteOp(I)I @@ -182,18 +188,24 @@ Landroid/content/Intent;->ACTION_ALARM_CHANGED:Ljava/lang/String; Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/IBinder;)Landroid/content/Intent; Landroid/content/pm/ApplicationInfo;->installLocation:I Landroid/content/pm/ApplicationInfo;->isForwardLocked()Z +Landroid/content/pm/ApplicationInfo;->isInstantApp()Z Landroid/content/pm/ApplicationInfo;->isPrivilegedApp()Z Landroid/content/pm/ApplicationInfo;->primaryCpuAbi:Ljava/lang/String; Landroid/content/pm/ApplicationInfo;->privateFlags:I +Landroid/content/pm/ApplicationInfo;->targetSandboxVersion:I Landroid/content/pm/IPackageManager;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo; Landroid/content/pm/IPackageManager;->setLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;ILandroid/content/IntentFilter;ILandroid/content/ComponentName;)V Landroid/content/pm/LauncherApps;->mPm:Landroid/content/pm/PackageManager; Landroid/content/pm/LauncherApps;->startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;I)V +Landroid/content/pm/PackageInstaller$SessionParams;->setGrantedRuntimePermissions([Ljava/lang/String;)V +Landroid/content/pm/PackageInstaller$SessionParams;->setInstallAsInstantApp(Z)V Landroid/content/pm/PackageManager;->freeStorageAndNotify(JLandroid/content/pm/IPackageDataObserver;)V Landroid/content/pm/PackageManager;->freeStorageAndNotify(Ljava/lang/String;JLandroid/content/pm/IPackageDataObserver;)V Landroid/content/pm/PackageManager;->freeStorage(JLandroid/content/IntentSender;)V Landroid/content/pm/PackageManager;->freeStorage(Ljava/lang/String;JLandroid/content/IntentSender;)V +Landroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo; Landroid/content/pm/PackageManager;->getPackageCandidateVolumes(Landroid/content/pm/ApplicationInfo;)Ljava/util/List; +Landroid/content/pm/PackageManager;->getPackageInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/PackageInfo; Landroid/content/pm/PackageManager;->getPackageSizeInfo(Ljava/lang/String;Landroid/content/pm/IPackageStatsObserver;)V Landroid/content/pm/PackageManager;->getResourcesForApplicationAsUser(Ljava/lang/String;I)Landroid/content/res/Resources; Landroid/content/pm/PackageManager;->movePackage(Ljava/lang/String;Landroid/os/storage/VolumeInfo;)I @@ -217,6 +229,7 @@ Landroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequenc Landroid/content/res/AssetManager;->loadResourceBagValue(IILandroid/util/TypedValue;Z)I Landroid/content/res/AssetManager;->loadResourceValue(ISLandroid/util/TypedValue;Z)I Landroid/content/res/AssetManager;->loadThemeAttributeValue(JILandroid/util/TypedValue;Z)I +Landroid/content/res/AssetManager;->mObject:J Landroid/content/res/AssetManager;->openNonAssetFdNative(ILjava/lang/String;[J)Landroid/os/ParcelFileDescriptor; Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream; Landroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;)Ljava/io/InputStream; @@ -276,6 +289,7 @@ Landroid/graphics/drawable/BitmapDrawable;->getTint()Landroid/content/res/ColorS Landroid/graphics/drawable/BitmapDrawable;->getTintMode()Landroid/graphics/PorterDuff$Mode; Landroid/graphics/drawable/BitmapDrawable;->setBitmap(Landroid/graphics/Bitmap;)V Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;->mConstantPadding:Landroid/graphics/Rect; +Landroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets; Landroid/graphics/drawable/DrawableContainer;->mDrawableContainerState:Landroid/graphics/drawable/DrawableContainer$DrawableContainerState; Landroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V Landroid/graphics/drawable/Drawable;->mCallback:Ljava/lang/ref/WeakReference; @@ -358,9 +372,25 @@ Landroid/net/ConnectivityManager;->isTetheringSupported()Z Landroid/net/ConnectivityManager;->mService:Landroid/net/IConnectivityManager; Landroid/net/ConnectivityManager;->requestRouteToHostAddress(ILjava/net/InetAddress;)Z Landroid/net/ConnectivityManager;->requestRouteToHost(II)Z +Landroid/net/INetworkStatsService$Stub$Proxy;->getMobileIfaces()[Ljava/lang/String; Landroid/net/LinkProperties;->setHttpProxy(Landroid/net/ProxyInfo;)V Landroid/net/NetworkPolicyManager;->mService:Landroid/net/INetworkPolicyManager; +Landroid/net/NetworkStats;->capacity:I +Landroid/net/NetworkStats;->defaultNetwork:[I +Landroid/net/NetworkStats;->iface:[Ljava/lang/String; +Landroid/net/NetworkStats;->metered:[I +Landroid/net/NetworkStats;->operations:[J +Landroid/net/NetworkStats;->roaming:[I +Landroid/net/NetworkStats;->rxBytes:[J +Landroid/net/NetworkStats;->rxPackets:[J +Landroid/net/NetworkStats;->set:[I +Landroid/net/NetworkStats;->size:I +Landroid/net/NetworkStats;->tag:[I +Landroid/net/NetworkStats;->txBytes:[J +Landroid/net/NetworkStats;->txPackets:[J +Landroid/net/NetworkStats;->uid:[I Landroid/net/SSLCertificateSocketFactory;->getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory; +Landroid/net/TrafficStats;->getStatsService()Landroid/net/INetworkStatsService; Landroid/net/wifi/p2p/WifiP2pGroup;->getNetworkId()I Landroid/net/wifi/p2p/WifiP2pGroupList;->getGroupList()Ljava/util/Collection; Landroid/net/wifi/p2p/WifiP2pManager;->deletePersistentGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;ILandroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V @@ -534,7 +564,9 @@ Landroid/os/UserManager;->getUserHandle()I Landroid/os/UserManager;->getUserHandle(I)I Landroid/os/UserManager;->getUserInfo(I)Landroid/content/pm/UserInfo; Landroid/os/UserManager;->getUserSerialNumber(I)I +Landroid/os/UserManager;->getUsers()Ljava/util/List; Landroid/os/UserManager;->hasBaseUserRestriction(Ljava/lang/String;Landroid/os/UserHandle;)Z +Landroid/os/UserManager;->isLinkedUser()Z Landroid/os/UserManager;->isUserUnlocked(I)Z Landroid/os/WorkSource;->add(ILjava/lang/String;)Z Landroid/os/WorkSource;->add(I)Z @@ -627,6 +659,7 @@ Landroid/telephony/SubscriptionManager;->getDefaultSmsPhoneId()I Landroid/telephony/SubscriptionManager;->getPhoneId(I)I Landroid/telephony/SubscriptionManager;->getSubId(I)[I Landroid/telephony/SubscriptionManager;->setDefaultSmsSubId(I)V +Landroid/telephony/TelephonyManager;->checkCarrierPrivilegesForPackage(Ljava/lang/String;)I Landroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager; Landroid/telephony/TelephonyManager;->getCurrentPhoneType()I Landroid/telephony/TelephonyManager;->getCurrentPhoneType(I)I @@ -636,10 +669,12 @@ Landroid/telephony/TelephonyManager;->getDefault()Landroid/telephony/TelephonyMa Landroid/telephony/TelephonyManager;->getITelephony()Lcom/android/internal/telephony/ITelephony; Landroid/telephony/TelephonyManager;->getLine1Number(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkClass(I)I +Landroid/telephony/TelephonyManager;->getNetworkCountryIso(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkOperator(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkOperatorName(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getNetworkType(I)I Landroid/telephony/TelephonyManager;->getSimOperator(I)Ljava/lang/String; +Landroid/telephony/TelephonyManager;->getSimOperatorName(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSimSerialNumber(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->getSubscriberId(I)Ljava/lang/String; Landroid/telephony/TelephonyManager;->isMultiSimEnabled()Z @@ -711,6 +746,14 @@ Landroid/view/SurfaceView;->mCallbacks:Ljava/util/ArrayList; Landroid/view/SurfaceView;->mFormat:I Landroid/view/SurfaceView;->mRequestedFormat:I Landroid/view/SurfaceView;->mSurfaceHolder:Landroid/view/SurfaceHolder; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker;-><init>(Landroid/content/Context;I)V +Landroid/view/textclassifier/logging/SmartSelectionEventTracker;->logEvent(Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;)V +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(III)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(II)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; +Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent; Landroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z Landroid/view/TextureView;->mLayer:Landroid/view/HardwareLayer; Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture; @@ -718,6 +761,7 @@ Landroid/view/TextureView;->mUpdateListener:Landroid/graphics/SurfaceTexture$OnF Landroid/view/TouchDelegate;->mDelegateTargeted:Z Landroid/view/VelocityTracker;->obtain(Ljava/lang/String;)Landroid/view/VelocityTracker; Landroid/view/View;->clearAccessibilityFocus()V +Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z Landroid/view/View;->computeOpaqueFlags()V Landroid/view/ViewConfiguration;->mFadingMarqueeEnabled:Z Landroid/view/ViewConfiguration;->sHasPermanentMenuKeySet:Z @@ -732,6 +776,7 @@ Landroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo; Landroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl; Landroid/view/ViewGroup;->FLAG_SUPPORT_STATIC_TRANSFORMATIONS:I Landroid/view/ViewGroup;->FLAG_USE_CHILD_DRAWING_ORDER:I +Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V Landroid/view/ViewGroup$MarginLayoutParams;->endMargin:I Landroid/view/ViewGroup$MarginLayoutParams;->startMargin:I Landroid/view/ViewGroup;->mChildren:[Landroid/view/View; @@ -810,6 +855,7 @@ Landroid/webkit/WebView;->emulateShiftHeld()V Landroid/webkit/WebView;->enablePlatformNotifications()V Landroid/webkit/WebViewFactory;->getLoadedPackageInfo()Landroid/content/pm/PackageInfo; Landroid/webkit/WebViewFactory;->getProvider()Landroid/webkit/WebViewFactoryProvider; +Landroid/webkit/WebViewFactory;->sPackageInfo:Landroid/content/pm/PackageInfo; Landroid/webkit/WebView;->getVisibleTitleHeight()I Landroid/webkit/WebView;->getWebViewProvider()Landroid/webkit/WebViewProvider; Landroid/webkit/WebView;->isPaused()Z @@ -939,6 +985,7 @@ Landroid/widget/Spinner;->mPopup:Landroid/widget/Spinner$SpinnerPopup; Landroid/widget/Switch;->mThumbDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/Switch;->mTrackDrawable:Landroid/graphics/drawable/Drawable; Landroid/widget/TabWidget;->setTabSelectionListener(Landroid/widget/TabWidget$OnTabSelectionChanged;)V +Landroid/widget/TextView;->assumeLayout()V Landroid/widget/TextView;->createEditorIfNeeded()V Landroid/widget/TextView;->mCursorDrawableRes:I Landroid/widget/TextView;->mCurTextColor:I @@ -977,6 +1024,8 @@ Lcom/android/internal/os/BatteryStatsImpl$Uid$Proc;->getUserTime(I)J Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getHandle()I Lcom/android/internal/os/BatteryStatsImpl$Uid$Sensor;->getSensorTime()Lcom/android/internal/os/BatteryStatsImpl$Timer; Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;->getWakeTime(I)Lcom/android/internal/os/BatteryStatsImpl$Timer; +Lcom/android/internal/os/FuseAppLoop;->onCommand(IJJJI[B)V +Lcom/android/internal/os/FuseAppLoop;->onOpen(JJ)[B Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;)D Lcom/android/internal/os/PowerProfile;->getAveragePower(Ljava/lang/String;I)D Lcom/android/internal/os/PowerProfile;->getBatteryCapacity()D @@ -1038,8 +1087,13 @@ Lcom/android/internal/view/menu/MenuItemImpl;->mIconResId:I Lcom/android/internal/view/menu/MenuItemImpl;->setMenuInfo(Landroid/view/ContextMenu$ContextMenuInfo;)V Lcom/android/okhttp/ConnectionPool;->maxIdleConnections:I Lcom/android/okhttp/ConnectionPool;->systemDefault:Lcom/android/okhttp/ConnectionPool; +Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B +Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String; Ldalvik/system/BaseDexClassLoader;->pathList:Ldalvik/system/DexPathList; +Ldalvik/system/CloseGuard;->get()Ldalvik/system/CloseGuard; +Ldalvik/system/CloseGuard;->open(Ljava/lang/String;)V +Ldalvik/system/CloseGuard;->warnIfOpen()V Ldalvik/system/DexFile;->mCookie:Ljava/lang/Object; Ldalvik/system/DexFile;->mFileName:Ljava/lang/String; Ldalvik/system/DexFile;->openDexFile(Ljava/lang/String;Ljava/lang/String;ILjava/lang/ClassLoader;[Ldalvik/system/DexPathList$Element;)Ljava/lang/Object; @@ -1050,6 +1104,7 @@ Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;)[Ldalvik/system/D Ldalvik/system/DexPathList;->makePathElements(Ljava/util/List;Ljava/io/File;Ljava/util/List;)[Ldalvik/system/DexPathList$Element; Ldalvik/system/DexPathList;->nativeLibraryDirectories:Ljava/util/List; Ldalvik/system/DexPathList;->nativeLibraryPathElements:[Ldalvik/system/DexPathList$NativeLibraryElement; +Ldalvik/system/DexPathList;->systemNativeLibraryDirectories:Ljava/util/List; Ldalvik/system/VMDebug;->dumpReferenceTables()V Ldalvik/system/VMRuntime;->clearGrowthLimit()V Ldalvik/system/VMRuntime;->getCurrentInstructionSet()Ljava/lang/String; @@ -1074,6 +1129,7 @@ Ljava/lang/Class;->dexCache:Ljava/lang/Object; Ljava/lang/Class;->dexClassDefIndex:I Ljava/lang/ClassLoader;->parent:Ljava/lang/ClassLoader; Ljava/lang/Daemons$Daemon;->stop()V +Ljava/lang/Daemons$Daemon;->thread:Ljava/lang/Thread; Ljava/lang/Daemons$FinalizerDaemon;->finalizingObject:Ljava/lang/Object; Ljava/lang/Daemons$FinalizerDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerDaemon; Ljava/lang/Daemons$FinalizerWatchdogDaemon;->INSTANCE:Ljava/lang/Daemons$FinalizerWatchdogDaemon; @@ -1092,6 +1148,8 @@ Ljava/net/InetAddress;->parseNumericAddress(Ljava/lang/String;)Ljava/net/InetAdd Ljava/net/Socket;->impl:Ljava/net/SocketImpl; Ljava/net/URI;->host:Ljava/lang/String; Ljava/nio/charset/CharsetEncoder;->canEncode(Ljava/nio/CharBuffer;)Z +Ljava/security/spec/ECParameterSpec;->getCurveName()Ljava/lang/String; +Ljava/security/spec/ECParameterSpec;->setCurveName(Ljava/lang/String;)V Ljava/util/ArrayList$SubList;->parent:Ljava/util/AbstractList; Ljava/util/ArrayList$SubList;->parentOffset:I Ljava/util/ArrayList$SubList;->size:I @@ -1101,5 +1159,6 @@ Ljava/util/concurrent/FutureTask;->callable:Ljava/util/concurrent/Callable; Ljava/util/Locale;->createConstant(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale; Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ssl/SSLServerSocketFactory; Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory; +Lorg/apache/http/conn/ssl/SSLSocketFactory;-><init>(Ljavax/net/ssl/SSLSocketFactory;)V Lorg/json/JSONArray;->values:Ljava/util/List; Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe; diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java index 06a9b0676d08..0b10a35b5d5e 100644 --- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java +++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java @@ -16,6 +16,7 @@ package android.accessibilityservice; +import android.annotation.IntDef; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; @@ -43,6 +44,8 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -346,6 +349,19 @@ public class AccessibilityServiceInfo implements Parcelable { */ public String[] packageNames; + + /** @hide */ + @IntDef(flag = true, prefix = { "FEEDBACK_" }, value = { + FEEDBACK_AUDIBLE, + FEEDBACK_GENERIC, + FEEDBACK_HAPTIC, + FEEDBACK_SPOKEN, + FEEDBACK_VISUAL, + FEEDBACK_BRAILLE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface FeedbackType {} + /** * The feedback type an {@link AccessibilityService} provides. * <p> @@ -358,6 +374,7 @@ public class AccessibilityServiceInfo implements Parcelable { * @see #FEEDBACK_VISUAL * @see #FEEDBACK_BRAILLE */ + @FeedbackType public int feedbackType; /** @@ -818,7 +835,8 @@ public class AccessibilityServiceInfo implements Parcelable { return stringBuilder.toString(); } - private static void appendFeedbackTypes(StringBuilder stringBuilder, int feedbackTypes) { + private static void appendFeedbackTypes(StringBuilder stringBuilder, + @FeedbackType int feedbackTypes) { stringBuilder.append("feedbackTypes:"); stringBuilder.append("["); while (feedbackTypes != 0) { diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 782733f552a6..5176d71ea67b 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -680,7 +680,7 @@ public class AccountManager { */ @NonNull public Account[] getAccountsByType(String type) { - return getAccountsByTypeAsUser(type, Process.myUserHandle()); + return getAccountsByTypeAsUser(type, mContext.getUser()); } /** @hide Same as {@link #getAccountsByType(String)} but for a specific user. */ @@ -2006,7 +2006,7 @@ public class AccountManager { final AccountManagerCallback<Bundle> callback, final Handler handler) { return confirmCredentialsAsUser(account, options, activity, callback, handler, - Process.myUserHandle()); + mContext.getUser()); } /** @@ -3208,7 +3208,7 @@ public class AccountManager { return finishSessionAsUser( sessionBundle, activity, - Process.myUserHandle(), + mContext.getUser(), callback, handler); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 04c44a3818a3..0bc510a13ba6 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -113,6 +113,7 @@ import android.view.Window.WindowControllerCallback; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; +import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillManager.AutofillClient; import android.view.autofill.AutofillPopupWindow; @@ -125,7 +126,6 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ToolbarActionBar; import com.android.internal.app.WindowDecorActionBar; -import com.android.internal.policy.DecorView; import com.android.internal.policy.PhoneWindow; import dalvik.system.VMRuntime; @@ -5832,7 +5832,7 @@ public class Activity extends ContextThemeWrapper ActivityManager.INTENT_SENDER_ACTIVITY_RESULT, packageName, mParent == null ? mToken : mParent.mToken, mEmbeddedID, requestCode, new Intent[] { data }, null, flags, null, - UserHandle.myUserId()); + getUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { // Empty @@ -5961,12 +5961,16 @@ public class Activity extends ContextThemeWrapper * * @return Returns the complete component name for this activity */ - @Override - public ComponentName getComponentName() - { + public ComponentName getComponentName() { return mComponent; } + /** @hide */ + @Override + public final ComponentName autofillClientGetComponentName() { + return getComponentName(); + } + /** * Retrieve a {@link SharedPreferences} object for accessing preferences * that are private to this activity. This simply calls the underlying @@ -6262,7 +6266,6 @@ public class Activity extends ContextThemeWrapper * * @param action the action to run on the UI thread */ - @Override public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); @@ -6271,6 +6274,12 @@ public class Activity extends ContextThemeWrapper } } + /** @hide */ + @Override + public final void autofillClientRunOnUiThread(Runnable action) { + runOnUiThread(action); + } + /** * Standard implementation of * {@link android.view.LayoutInflater.Factory#onCreateView} used when @@ -7076,6 +7085,18 @@ public class Activity extends ContextThemeWrapper mCurrentConfig = config; mWindow.setColorMode(info.colorMode); + + setAutofillCompatibilityEnabled(application.isAutofillCompatibilityEnabled()); + enableAutofillCompatibilityIfNeeded(); + } + + private void enableAutofillCompatibilityIfNeeded() { + if (isAutofillCompatibilityEnabled()) { + final AutofillManager afm = getSystemService(AutofillManager.class); + if (afm != null) { + afm.enableCompatibilityMode(); + } + } } /** @hide */ @@ -7572,7 +7593,7 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - final public void autofillCallbackAuthenticate(int authenticationId, IntentSender intent, + public final void autofillClientAuthenticate(int authenticationId, IntentSender intent, Intent fillInIntent) { try { startIntentSenderForResultInner(intent, AUTO_FILL_AUTH_WHO_PREFIX, @@ -7584,13 +7605,13 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - final public void autofillCallbackResetableStateAvailable() { + public final void autofillClientResetableStateAvailable() { mAutoFillResetNeeded = true; } /** @hide */ @Override - final public boolean autofillCallbackRequestShowFillUi(@NonNull View anchor, int width, + public final boolean autofillClientRequestShowFillUi(@NonNull View anchor, int width, int height, @Nullable Rect anchorBounds, IAutofillWindowPresenter presenter) { final boolean wasShowing; @@ -7607,7 +7628,7 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - final public boolean autofillCallbackRequestHideFillUi() { + public final boolean autofillClientRequestHideFillUi() { if (mAutofillPopupWindow == null) { return false; } @@ -7618,8 +7639,16 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - @NonNull public View[] findViewsByAutofillIdTraversal(@NonNull int[] viewIds) { - final View[] views = new View[viewIds.length]; + public final boolean autofillClientIsFillUiShowing() { + return mAutofillPopupWindow != null && mAutofillPopupWindow.isShowing(); + } + + /** @hide */ + @Override + @NonNull + public final View[] autofillClientFindViewsByAutofillIdTraversal( + @NonNull AutofillId[] autofillId) { + final View[] views = new View[autofillId.length]; final ArrayList<ViewRootImpl> roots = WindowManagerGlobal.getInstance().getRootViews(getActivityToken()); @@ -7627,10 +7656,11 @@ public class Activity extends ContextThemeWrapper final View rootView = roots.get(rootNum).getView(); if (rootView != null) { - for (int viewNum = 0; viewNum < viewIds.length; viewNum++) { + final int viewCount = autofillId.length; + for (int viewNum = 0; viewNum < viewCount; viewNum++) { if (views[viewNum] == null) { views[viewNum] = rootView.findViewByAutofillIdTraversal( - viewIds[viewNum]); + autofillId[viewNum].getViewId()); } } } @@ -7641,14 +7671,15 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - @Nullable public View findViewByAutofillIdTraversal(int viewId) { + @Nullable + public final View autofillClientFindViewByAutofillIdTraversal(AutofillId autofillId) { final ArrayList<ViewRootImpl> roots = WindowManagerGlobal.getInstance().getRootViews(getActivityToken()); for (int rootNum = 0; rootNum < roots.size(); rootNum++) { final View rootView = roots.get(rootNum).getView(); if (rootView != null) { - final View view = rootView.findViewByAutofillIdTraversal(viewId); + final View view = rootView.findViewByAutofillIdTraversal(autofillId.getViewId()); if (view != null) { return view; } @@ -7660,50 +7691,62 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - @NonNull public boolean[] getViewVisibility(@NonNull int[] viewIds) { - final boolean[] isVisible = new boolean[viewIds.length]; - final View views[] = findViewsByAutofillIdTraversal(viewIds); - - for (int i = 0; i < viewIds.length; i++) { - View view = views[i]; - if (view == null) { - isVisible[i] = false; - continue; - } - - isVisible[i] = true; - - // Check if the view is visible by checking all parents - while (true) { - if (view instanceof DecorView && view.getViewRootImpl() == view.getParent()) { - break; - } - - if (view.getVisibility() != View.VISIBLE) { - isVisible[i] = false; - break; + public final @NonNull boolean[] autofillClientGetViewVisibility( + @NonNull AutofillId[] autofillIds) { + final int autofillIdCount = autofillIds.length; + final boolean[] visible = new boolean[autofillIdCount]; + for (int i = 0; i < autofillIdCount; i++) { + final AutofillId autofillId = autofillIds[i]; + final View view = autofillClientFindViewByAutofillIdTraversal(autofillId); + if (view != null) { + if (!autofillId.isVirtual()) { + visible[i] = view.isVisibleToUser(); + } else { + visible[i] = view.isVisibleToUserForAutofill(autofillId.getVirtualChildId()); } + } + } + return visible; + } - if (view.getParent() instanceof View) { - view = (View) view.getParent(); - } else { - break; + /** @hide */ + public final @Nullable View autofillClientFindViewByAccessibilityIdTraversal(int viewId, + int windowId) { + final ArrayList<ViewRootImpl> roots = WindowManagerGlobal.getInstance() + .getRootViews(getActivityToken()); + for (int rootNum = 0; rootNum < roots.size(); rootNum++) { + final View rootView = roots.get(rootNum).getView(); + if (rootView != null && rootView.getAccessibilityWindowId() == windowId) { + final View view = rootView.findViewByAccessibilityIdTraversal(viewId); + if (view != null) { + return view; } } } + return null; + } - return isVisible; + /** @hide */ + @Override + public final @Nullable IBinder autofillClientGetActivityToken() { + return getActivityToken(); } /** @hide */ @Override - public boolean isVisibleForAutofill() { + public final boolean autofillClientIsVisibleForAutofill() { return !mStopped; } /** @hide */ @Override - public boolean isDisablingEnterExitEventForAutofill() { + public final boolean autofillIsCompatibilityModeEnabled() { + return isAutofillCompatibilityEnabled(); + } + + /** @hide */ + @Override + public final boolean isDisablingEnterExitEventForAutofill() { return mAutoFillIgnoreFirstResumePause || !mResumed; } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index e2ce8b177d2e..ae47a684f6ab 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1691,7 +1691,7 @@ public class ActivityManager { if (maxNum < 0) { throw new IllegalArgumentException("The requested number of tasks should be >= 0"); } - return getService().getRecentTasks(maxNum, flags, UserHandle.myUserId()).getList(); + return getService().getRecentTasks(maxNum, flags, mContext.getUserId()).getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2685,7 +2685,7 @@ public class ActivityManager { public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) { try { return getService().clearApplicationUserData(packageName, false, - observer, UserHandle.myUserId()); + observer, mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2724,7 +2724,7 @@ public class ActivityManager { try { @SuppressWarnings("unchecked") final ParceledListSlice<GrantedUriPermission> castedList = getService() - .getGrantedUriPermissions(packageName, UserHandle.myUserId()); + .getGrantedUriPermissions(packageName, mContext.getUserId()); return castedList; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -2743,7 +2743,7 @@ public class ActivityManager { public void clearGrantedUriPermissions(String packageName) { try { getService().clearGrantedUriPermissions(packageName, - UserHandle.myUserId()); + mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3528,7 +3528,7 @@ public class ActivityManager { public void killBackgroundProcesses(String packageName) { try { getService().killBackgroundProcesses(packageName, - UserHandle.myUserId()); + mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3586,7 +3586,7 @@ public class ActivityManager { @SystemApi @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String packageName) { - forceStopPackageAsUser(packageName, UserHandle.myUserId()); + forceStopPackageAsUser(packageName, mContext.getUserId()); } /** diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 42825f0ad8d4..3d088ff9e5c3 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -637,6 +637,8 @@ public final class ActivityThread extends ClientTransactionHandler { /** Initial values for {@link Profiler}. */ ProfilerInfo initProfilerInfo; + boolean autofillCompatibilityEnabled; + public String toString() { return "AppBindData{appInfo=" + appInfo + "}"; } @@ -863,7 +865,7 @@ public final class ActivityThread extends ClientTransactionHandler { boolean enableBinderTracking, boolean trackAllocation, boolean isRestrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map services, Bundle coreSettings, - String buildSerial) { + String buildSerial, boolean autofillCompatibilityEnabled) { if (services != null) { // Setup the service cache in the ServiceManager @@ -889,6 +891,7 @@ public final class ActivityThread extends ClientTransactionHandler { data.compatInfo = compatInfo; data.initProfilerInfo = profilerInfo; data.buildSerial = buildSerial; + data.autofillCompatibilityEnabled = autofillCompatibilityEnabled; sendMessage(H.BIND_APPLICATION, data); } @@ -5840,6 +5843,10 @@ public final class ActivityThread extends ClientTransactionHandler { // If the app is being launched for full backup or restore, bring it up in // a restricted environment with the base application class. app = data.info.makeApplication(data.restrictedBackupMode, null); + + // Propagate autofill compat state + app.setAutofillCompatibilityEnabled(data.autofillCompatibilityEnabled); + mInitialApplication = app; // don't bring up providers in restricted mode; they may depend on the diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index 382719b4a305..124f9338f781 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -178,6 +178,7 @@ public class AlarmManager { public static final int FLAG_IDLE_UNTIL = 1<<4; private final IAlarmManager mService; + private final Context mContext; private final String mPackageName; private final boolean mAlwaysExact; private final int mTargetSdkVersion; @@ -265,6 +266,7 @@ public class AlarmManager { AlarmManager(IAlarmManager service, Context ctx) { mService = service; + mContext = ctx; mPackageName = ctx.getPackageName(); mTargetSdkVersion = ctx.getApplicationInfo().targetSdkVersion; mAlwaysExact = (mTargetSdkVersion < Build.VERSION_CODES.KITKAT); @@ -1028,7 +1030,7 @@ public class AlarmManager { * @see #ACTION_NEXT_ALARM_CLOCK_CHANGED */ public AlarmClockInfo getNextAlarmClock() { - return getNextAlarmClock(UserHandle.myUserId()); + return getNextAlarmClock(mContext.getUserId()); } /** diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index e923fb217bea..4c9fb74c9c80 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1670,7 +1670,7 @@ public class AppOpsManager { /** @hide */ public void resetAllModes() { try { - mService.resetAllModes(UserHandle.myUserId(), null); + mService.resetAllModes(mContext.getUserId(), null); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index a13ac49bb553..81cbbcafe8c4 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -26,6 +26,7 @@ import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; +import android.view.autofill.AutofillManager; /** * Base class for maintaining global application state. You can provide your own @@ -299,4 +300,37 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } } + + /** @hide */ + @Override + public AutofillManager.AutofillClient getAutofillClient() { + final AutofillManager.AutofillClient client = super.getAutofillClient(); + if (client != null) { + return client; + } + // Okay, ppl use the application context when they should not. This breaks + // autofill among other things. We pick the focused activity since autofill + // interacts only with the currently focused activity and we need the fill + // client only if a call comes from the focused activity. Sigh... + final ActivityThread activityThread = ActivityThread.currentActivityThread(); + if (activityThread == null) { + return null; + } + final int activityCount = activityThread.mActivities.size(); + for (int i = 0; i < activityCount; i++) { + final ActivityThread.ActivityClientRecord record = + activityThread.mActivities.valueAt(i); + if (record == null) { + continue; + } + final Activity activity = record.activity; + if (activity == null) { + continue; + } + if (activity.getWindow().getDecorView().hasFocus()) { + return record.activity; + } + } + return null; + } }
\ No newline at end of file diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 6b0a2f90c38d..13117bcbc929 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -140,6 +140,11 @@ public class ApplicationPackageManager extends PackageManager { } @Override + public int getUserId() { + return mContext.getUserId(); + } + + @Override public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { return getPackageInfoAsUser(packageName, flags, mContext.getUserId()); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 6496110ac9c6..4a9b2bcb16ed 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -164,7 +164,7 @@ class ContextImpl extends Context { private final @Nullable IBinder mActivityToken; - private final @Nullable UserHandle mUser; + private final @NonNull UserHandle mUser; private final ApplicationContentResolver mContentResolver; @@ -187,6 +187,7 @@ class ContextImpl extends Context { private @Nullable String mSplitName = null; private AutofillClient mAutofillClient = null; + private boolean mIsAutofillCompatEnabled; private final Object mSync = new Object(); @@ -1565,8 +1566,7 @@ class ContextImpl extends Context { public boolean bindService(Intent service, ServiceConnection conn, int flags) { warnIfCallingFromSystemProcess(); - return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), - Process.myUserHandle()); + return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), getUser()); } /** @hide */ @@ -2038,8 +2038,7 @@ class ContextImpl extends Context { @Override public Context createPackageContext(String packageName, int flags) throws NameNotFoundException { - return createPackageContextAsUser(packageName, flags, - mUser != null ? mUser : Process.myUserHandle()); + return createPackageContextAsUser(packageName, flags, mUser); } @Override @@ -2235,6 +2234,12 @@ class ContextImpl extends Context { /** {@hide} */ @Override + public UserHandle getUser() { + return mUser; + } + + /** {@hide} */ + @Override public int getUserId() { return mUser.getIdentifier(); } @@ -2251,6 +2256,18 @@ class ContextImpl extends Context { mAutofillClient = client; } + /** @hide */ + @Override + public boolean isAutofillCompatibilityEnabled() { + return mIsAutofillCompatEnabled; + } + + /** @hide */ + @Override + public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) { + mIsAutofillCompatEnabled = autofillCompatEnabled; + } + static ContextImpl createSystemContext(ActivityThread mainThread) { LoadedApk packageInfo = new LoadedApk(mainThread); ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0, @@ -2382,7 +2399,7 @@ class ContextImpl extends Context { } } - mContentResolver = new ApplicationContentResolver(this, mainThread, user); + mContentResolver = new ApplicationContentResolver(this, mainThread); } void setResources(Resources r) { @@ -2498,13 +2515,10 @@ class ContextImpl extends Context { private static final class ApplicationContentResolver extends ContentResolver { private final ActivityThread mMainThread; - private final UserHandle mUser; - public ApplicationContentResolver( - Context context, ActivityThread mainThread, UserHandle user) { + public ApplicationContentResolver(Context context, ActivityThread mainThread) { super(context); mMainThread = Preconditions.checkNotNull(mainThread); - mUser = Preconditions.checkNotNull(user); } @Override @@ -2550,7 +2564,7 @@ class ContextImpl extends Context { /** @hide */ protected int resolveUserIdFromAuthority(String auth) { - return ContentProvider.getUserIdFromAuthority(auth, mUser.getIdentifier()); + return ContentProvider.getUserIdFromAuthority(auth, getUserId()); } } } diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index 893a41cc992b..9e99a78ccfbd 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -67,7 +67,7 @@ oneway interface IApplicationThread { int debugMode, boolean enableBinderTracking, boolean trackAllocation, boolean restrictedBackupMode, boolean persistent, in Configuration config, in CompatibilityInfo compatInfo, in Map services, - in Bundle coreSettings, in String buildSerial); + in Bundle coreSettings, in String buildSerial, boolean isAutofillCompatEnabled); void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs); void scheduleExit(); void scheduleServiceArgs(IBinder token, in ParceledListSlice args); diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 67f5a2e641ae..7f87814a5994 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -1679,7 +1679,7 @@ public class Instrumentation { public void execStartActivities(Context who, IBinder contextThread, IBinder token, Activity target, Intent[] intents, Bundle options) { execStartActivitiesAsUser(who, contextThread, token, target, intents, options, - UserHandle.myUserId()); + who.getUserId()); } /** diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index 553099f25516..4a3fcaf3e64e 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -407,7 +407,7 @@ public class KeyguardManager { * password. */ public boolean isDeviceLocked() { - return isDeviceLocked(UserHandle.myUserId()); + return isDeviceLocked(mContext.getUserId()); } /** @@ -432,7 +432,7 @@ public class KeyguardManager { * @return true if a PIN, pattern or password was set. */ public boolean isDeviceSecure() { - return isDeviceSecure(UserHandle.myUserId()); + return isDeviceSecure(mContext.getUserId()); } /** diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 49c03ab9cfac..538623f26a95 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -98,7 +98,7 @@ public class NotificationManager { * This broadcast is only sent to the app whose block state has changed. * * Input: nothing - * Output: nothing + * Output: {@link #EXTRA_BLOCKED_STATE} */ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_APP_BLOCK_STATE_CHANGED = @@ -113,24 +113,31 @@ public class NotificationManager { * This broadcast is only sent to the app that owns the channel that has changed. * * Input: nothing - * Output: {@link #EXTRA_BLOCK_STATE_CHANGED_ID} + * Output: {@link #EXTRA_NOTIFICATION_CHANNEL_ID} + * Output: {@link #EXTRA_BLOCKED_STATE} */ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED = "android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED"; /** - * Extra for {@link #ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED} or - * {@link #ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED} containing the id of the - * object which has a new blocked state. + * Extra for {@link #ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED} containing the id of the + * {@link NotificationChannel} which has a new blocked state. * - * The value will be the {@link NotificationChannel#getId()} of the channel for - * {@link #ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED} and - * the {@link NotificationChannelGroup#getId()} of the group for - * {@link #ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED}. + * The value will be the {@link NotificationChannel#getId()} of the channel. */ - public static final String EXTRA_BLOCK_STATE_CHANGED_ID = - "android.app.extra.BLOCK_STATE_CHANGED_ID"; + public static final String EXTRA_NOTIFICATION_CHANNEL_ID = + "android.app.extra.NOTIFICATION_CHANNEL_ID"; + + /** + * Extra for {@link #ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED} containing the id + * of the {@link NotificationChannelGroup} which has a new blocked state. + * + * The value will be the {@link NotificationChannelGroup#getId()} of the group. + */ + public static final String EXTRA_NOTIFICATION_CHANNEL_GROUP_ID = + "android.app.extra.NOTIFICATION_CHANNEL_GROUP_ID"; + /** * Extra for {@link #ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED} or @@ -142,7 +149,6 @@ public class NotificationManager { */ public static final String EXTRA_BLOCKED_STATE = "android.app.extra.BLOCKED_STATE"; - /** * Intent that is broadcast when a {@link NotificationChannelGroup} is * {@link NotificationChannelGroup#isBlocked() blocked} or unblocked. @@ -150,7 +156,8 @@ public class NotificationManager { * This broadcast is only sent to the app that owns the channel group that has changed. * * Input: nothing - * Output: {@link #EXTRA_BLOCK_STATE_CHANGED_ID} + * Output: {@link #EXTRA_NOTIFICATION_CHANNEL_GROUP_ID} + * Output: {@link #EXTRA_BLOCKED_STATE} */ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED = @@ -351,7 +358,7 @@ public class NotificationManager { */ public void notify(String tag, int id, Notification notification) { - notifyAsUser(tag, id, notification, new UserHandle(UserHandle.myUserId())); + notifyAsUser(tag, id, notification, mContext.getUser()); } /** @@ -412,7 +419,7 @@ public class NotificationManager { */ public void cancel(String tag, int id) { - cancelAsUser(tag, id, new UserHandle(UserHandle.myUserId())); + cancelAsUser(tag, id, mContext.getUser()); } /** @@ -440,7 +447,7 @@ public class NotificationManager { String pkg = mContext.getPackageName(); if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); try { - service.cancelAllNotifications(pkg, UserHandle.myUserId()); + service.cancelAllNotifications(pkg, mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1264,7 +1271,7 @@ public class NotificationManager { final String pkg = mContext.getPackageName(); try { final ParceledListSlice<StatusBarNotification> parceledList - = service.getAppActiveNotifications(pkg, UserHandle.myUserId()); + = service.getAppActiveNotifications(pkg, mContext.getUserId()); final List<StatusBarNotification> list = parceledList.getList(); return list.toArray(new StatusBarNotification[list.size()]); } catch (RemoteException e) { diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index d6429ae9e540..315259bdf388 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -345,7 +345,7 @@ public final class PendingIntent implements Parcelable { ActivityManager.INTENT_SENDER_ACTIVITY, packageName, null, null, requestCode, new Intent[] { intent }, resolvedType != null ? new String[] { resolvedType } : null, - flags, options, UserHandle.myUserId()); + flags, options, context.getUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -486,7 +486,7 @@ public final class PendingIntent implements Parcelable { ActivityManager.getService().getIntentSender( ActivityManager.INTENT_SENDER_ACTIVITY, packageName, null, null, requestCode, intents, resolvedTypes, flags, options, - UserHandle.myUserId()); + context.getUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -544,8 +544,7 @@ public final class PendingIntent implements Parcelable { */ public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, @Flags int flags) { - return getBroadcastAsUser(context, requestCode, intent, flags, - new UserHandle(UserHandle.myUserId())); + return getBroadcastAsUser(context, requestCode, intent, flags, context.getUser()); } /** @@ -644,7 +643,7 @@ public final class PendingIntent implements Parcelable { serviceKind, packageName, null, null, requestCode, new Intent[] { intent }, resolvedType != null ? new String[] { resolvedType } : null, - flags, null, UserHandle.myUserId()); + flags, null, context.getUserId()); return target != null ? new PendingIntent(target) : null; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 4310434c70be..87f32b2613bc 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -38,6 +38,7 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.IRestrictionsManager; import android.content.RestrictionsManager; +import android.content.pm.ApplicationInfo; import android.content.pm.CrossProfileApps; import android.content.pm.ICrossProfileApps; import android.content.pm.IShortcutService; @@ -724,8 +725,9 @@ final class SystemServiceRegistry { service = IPrintManager.Stub.asInterface(ServiceManager .getServiceOrThrow(Context.PRINT_SERVICE)); } - return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(), - UserHandle.getAppId(Process.myUid())); + final int userId = ctx.getUserId(); + final int appId = UserHandle.getAppId(ctx.getApplicationInfo().uid); + return new PrintManager(ctx.getOuterContext(), service, userId, appId); }}); registerService(Context.COMPANION_DEVICE_SERVICE, CompanionDeviceManager.class, @@ -780,12 +782,12 @@ final class SystemServiceRegistry { }}); registerService(Context.TV_INPUT_SERVICE, TvInputManager.class, - new StaticServiceFetcher<TvInputManager>() { + new CachedServiceFetcher<TvInputManager>() { @Override - public TvInputManager createService() throws ServiceNotFoundException { + public TvInputManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder iBinder = ServiceManager.getServiceOrThrow(Context.TV_INPUT_SERVICE); ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder); - return new TvInputManager(service, UserHandle.myUserId()); + return new TvInputManager(service, ctx.getUserId()); }}); registerService(Context.NETWORK_SCORE_SERVICE, NetworkScoreManager.class, diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java index ab5974777c9e..b99b32748dcd 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -230,7 +230,7 @@ public class TaskStackBuilder { * Context.startActivity(Intent, Bundle)} for more details. */ public void startActivities(Bundle options) { - startActivities(options, new UserHandle(UserHandle.myUserId())); + startActivities(options, mSourceContext.getUser()); } /** diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index f21746cdd275..19240e25bcd8 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -51,6 +51,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.DeadSystemException; +import android.os.FileUtils; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -1002,7 +1003,7 @@ public class WallpaperManager { Log.w(TAG, "WallpaperService not running"); throw new RuntimeException(new DeadSystemException()); } else { - return sGlobals.mService.getWallpaperInfo(UserHandle.myUserId()); + return sGlobals.mService.getWallpaperInfo(mContext.getUserId()); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -1150,7 +1151,7 @@ public class WallpaperManager { ParcelFileDescriptor fd = sGlobals.mService.setWallpaper( "res:" + resources.getResourceName(resid), mContext.getOpPackageName(), null, false, result, which, completion, - UserHandle.myUserId()); + mContext.getUserId()); if (fd != null) { FileOutputStream fos = null; boolean ok = false; @@ -1255,7 +1256,7 @@ public class WallpaperManager { boolean allowBackup, @SetWallpaperFlags int which) throws IOException { return setBitmap(fullImage, visibleCropHint, allowBackup, which, - UserHandle.myUserId()); + mContext.getUserId()); } /** @@ -1329,11 +1330,7 @@ public class WallpaperManager { private void copyStreamToWallpaperFile(InputStream data, FileOutputStream fos) throws IOException { - byte[] buffer = new byte[32768]; - int amt; - while ((amt=data.read(buffer)) > 0) { - fos.write(buffer, 0, amt); - } + FileUtils.copy(data, fos); } /** @@ -1406,7 +1403,7 @@ public class WallpaperManager { try { ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null, mContext.getOpPackageName(), visibleCropHint, allowBackup, - result, which, completion, UserHandle.myUserId()); + result, which, completion, mContext.getUserId()); if (fd != null) { FileOutputStream fos = null; try { @@ -1643,7 +1640,7 @@ public class WallpaperManager { @SystemApi @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(ComponentName name) { - return setWallpaperComponent(name, UserHandle.myUserId()); + return setWallpaperComponent(name, mContext.getUserId()); } /** diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index e190fd4cf6cd..8d161006be76 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -140,7 +140,7 @@ public class DevicePolicyManager { /** @hide test will override it. */ @VisibleForTesting protected int myUserId() { - return UserHandle.myUserId(); + return mContext.getUserId(); } /** @@ -5511,7 +5511,7 @@ public class DevicePolicyManager { @SystemApi public @Nullable ComponentName getProfileOwner() throws IllegalArgumentException { throwIfParentInstance("getProfileOwner"); - return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier()); + return getProfileOwnerAsUser(mContext.getUserId()); } /** @@ -5539,7 +5539,7 @@ public class DevicePolicyManager { public @Nullable String getProfileOwnerName() throws IllegalArgumentException { if (mService != null) { try { - return mService.getProfileOwnerName(Process.myUserHandle().getIdentifier()); + return mService.getProfileOwnerName(mContext.getUserId()); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } @@ -7682,6 +7682,7 @@ public class DevicePolicyManager { throw re.rethrowFromSystemServer(); } } + /** * Called by a device owner or profile owner of secondary users that is affiliated with the * device to disable the keyguard altogether. @@ -8320,6 +8321,22 @@ public class DevicePolicyManager { } /** + * Forces a batch of security logs to be fetched from logd and makes it available for DPC. + * Only callable by ADB. If throttled, returns time to wait in milliseconds, otherwise 0. + * @hide + */ + public long forceSecurityLogs() { + if (mService == null) { + return 0; + } + try { + return mService.forceSecurityLogs(); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** * Called by the system to obtain a {@link DevicePolicyManager} whose calls act on the parent * profile. * diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 5197de4cef9f..ef990071dbfd 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -349,6 +349,7 @@ interface IDevicePolicyManager { boolean isSecurityLoggingEnabled(in ComponentName admin); ParceledListSlice retrieveSecurityLogs(in ComponentName admin); ParceledListSlice retrievePreRebootSecurityLogs(in ComponentName admin); + long forceSecurityLogs(); boolean isUninstallInQueue(String packageName); void uninstallPackageWithActiveAdmins(String packageName); diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index 87f227129586..8f49bc177dcb 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -4,6 +4,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; import android.content.ComponentName; +import android.content.Context; import android.graphics.Matrix; import android.graphics.Rect; import android.net.Uri; @@ -500,9 +501,8 @@ public class AssistStructure implements Parcelable { ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false); if ((root.getWindowFlags() & WindowManager.LayoutParams.FLAG_SECURE) != 0) { if (forAutoFill) { - final int autofillFlags = (flags & FillRequest.FLAG_MANUAL_REQUEST) != 0 - ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0; - view.onProvideAutofillStructure(builder, autofillFlags); + final int viewFlags = resolveViewAutofillFlags(view.getContext(), flags); + view.onProvideAutofillStructure(builder, viewFlags); } else { // This is a secure window, so it doesn't want a screenshot, and that // means we should also not copy out its view hierarchy for Assist @@ -512,9 +512,8 @@ public class AssistStructure implements Parcelable { } } if (forAutoFill) { - final int autofillFlags = (flags & FillRequest.FLAG_MANUAL_REQUEST) != 0 - ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0; - view.dispatchProvideAutofillStructure(builder, autofillFlags); + final int viewFlags = resolveViewAutofillFlags(view.getContext(), flags); + view.dispatchProvideAutofillStructure(builder, viewFlags); } else { view.dispatchProvideStructure(builder); } @@ -532,6 +531,12 @@ public class AssistStructure implements Parcelable { mRoot = new ViewNode(reader, 0); } + int resolveViewAutofillFlags(Context context, int fillRequestFlags) { + return (fillRequestFlags & FillRequest.FLAG_MANUAL_REQUEST) != 0 + || context.isAutofillCompatibilityEnabled() + ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0; + } + void writeSelfToParcel(Parcel out, PooledStringWriter pwriter, float[] tmpMatrix) { out.writeInt(mX); out.writeInt(mY); diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl index 4461b16fe15c..38d9025cc82f 100644 --- a/core/java/android/app/slice/ISliceManager.aidl +++ b/core/java/android/app/slice/ISliceManager.aidl @@ -31,4 +31,7 @@ interface ISliceManager { SliceSpec[] getPinnedSpecs(in Uri uri, String pkg); int checkSlicePermission(in Uri uri, String pkg, int pid, int uid); void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices); + + byte[] getBackupPayload(int user); + void applyRestore(in byte[] payload, int user); } diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java index e5f3eae3ab5a..3f13fffb3857 100644 --- a/core/java/android/app/slice/SliceManager.java +++ b/core/java/android/app/slice/SliceManager.java @@ -20,9 +20,9 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; -import android.content.IContentProvider; import android.content.Intent; import android.content.pm.ResolveInfo; import android.net.Uri; @@ -193,10 +193,15 @@ public class SliceManager { * <p> * Pinned state is not persisted across reboots, so apps are expected to re-pin any slices * they still care about after a reboot. + * <p> + * This may only be called by apps that are the default launcher for the device + * or the default voice interaction service. Otherwise will throw {@link SecurityException}. * * @param uri The uri of the slice being pinned. * @param specs The list of supported {@link SliceSpec}s of the callback. * @see SliceProvider#onSlicePinned(Uri) + * @see Intent#ACTION_ASSIST + * @see Intent#CATEGORY_HOME */ public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) { try { @@ -211,10 +216,15 @@ public class SliceManager { * Remove a pin for a slice. * <p> * If the slice has no other pins/callbacks then the slice will be unpinned. + * <p> + * This may only be called by apps that are the default launcher for the device + * or the default voice interaction service. Otherwise will throw {@link SecurityException}. * * @param uri The uri of the slice being unpinned. * @see #pinSlice * @see SliceProvider#onSliceUnpinned(Uri) + * @see Intent#ACTION_ASSIST + * @see Intent#CATEGORY_HOME */ public void unpinSlice(@NonNull Uri uri) { try { @@ -262,17 +272,13 @@ public class SliceManager { */ public @NonNull Collection<Uri> getSliceDescendants(@NonNull Uri uri) { ContentResolver resolver = mContext.getContentResolver(); - IContentProvider provider = resolver.acquireProvider(uri); - try { + try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) { Bundle extras = new Bundle(); extras.putParcelable(SliceProvider.EXTRA_BIND_URI, uri); - final Bundle res = provider.call(resolver.getPackageName(), - SliceProvider.METHOD_GET_DESCENDANTS, null, extras); + final Bundle res = provider.call(SliceProvider.METHOD_GET_DESCENDANTS, null, extras); return res.getParcelableArrayList(SliceProvider.EXTRA_SLICE_DESCENDANTS); } catch (RemoteException e) { Log.e(TAG, "Unable to get slice descendants", e); - } finally { - resolver.releaseProvider(provider); } return Collections.emptyList(); } @@ -288,17 +294,15 @@ public class SliceManager { public @Nullable Slice bindSlice(@NonNull Uri uri, @NonNull List<SliceSpec> supportedSpecs) { Preconditions.checkNotNull(uri, "uri"); ContentResolver resolver = mContext.getContentResolver(); - IContentProvider provider = resolver.acquireProvider(uri); - if (provider == null) { - throw new IllegalArgumentException("Unknown URI " + uri); - } - try { + try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) { + if (provider == null) { + throw new IllegalArgumentException("Unknown URI " + uri); + } Bundle extras = new Bundle(); extras.putParcelable(SliceProvider.EXTRA_BIND_URI, uri); extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS, new ArrayList<>(supportedSpecs)); - final Bundle res = provider.call(mContext.getPackageName(), SliceProvider.METHOD_SLICE, - null, extras); + final Bundle res = provider.call(SliceProvider.METHOD_SLICE, null, extras); Bundle.setDefusable(res, true); if (res == null) { return null; @@ -308,8 +312,6 @@ public class SliceManager { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. return null; - } finally { - resolver.releaseProvider(provider); } } @@ -344,15 +346,13 @@ public class SliceManager { String authority = providers.get(0).providerInfo.authority; Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) .authority(authority).build(); - IContentProvider provider = resolver.acquireProvider(uri); - if (provider == null) { - throw new IllegalArgumentException("Unknown URI " + uri); - } - try { + try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) { + if (provider == null) { + throw new IllegalArgumentException("Unknown URI " + uri); + } Bundle extras = new Bundle(); extras.putParcelable(SliceProvider.EXTRA_INTENT, intent); - final Bundle res = provider.call(mContext.getPackageName(), - SliceProvider.METHOD_MAP_ONLY_INTENT, null, extras); + final Bundle res = provider.call(SliceProvider.METHOD_MAP_ONLY_INTENT, null, extras); if (res == null) { return null; } @@ -361,8 +361,6 @@ public class SliceManager { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. return null; - } finally { - resolver.releaseProvider(provider); } } @@ -399,17 +397,15 @@ public class SliceManager { String authority = providers.get(0).providerInfo.authority; Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) .authority(authority).build(); - IContentProvider provider = resolver.acquireProvider(uri); - if (provider == null) { - throw new IllegalArgumentException("Unknown URI " + uri); - } - try { + try (ContentProviderClient provider = resolver.acquireContentProviderClient(uri)) { + if (provider == null) { + throw new IllegalArgumentException("Unknown URI " + uri); + } Bundle extras = new Bundle(); extras.putParcelable(SliceProvider.EXTRA_INTENT, intent); extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS, new ArrayList<>(supportedSpecs)); - final Bundle res = provider.call(mContext.getPackageName(), - SliceProvider.METHOD_MAP_INTENT, null, extras); + final Bundle res = provider.call(SliceProvider.METHOD_MAP_INTENT, null, extras); if (res == null) { return null; } @@ -418,8 +414,6 @@ public class SliceManager { // Arbitrary and not worth documenting, as Activity // Manager will kill this process shortly anyway. return null; - } finally { - resolver.releaseProvider(provider); } } diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index edb6a74bbea4..cf359026105d 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -301,7 +301,7 @@ public final class UsageStatsManager { */ public boolean isAppInactive(String packageName) { try { - return mService.isAppInactive(packageName, UserHandle.myUserId()); + return mService.isAppInactive(packageName, mContext.getUserId()); } catch (RemoteException e) { // fall through and return default } @@ -313,7 +313,7 @@ public final class UsageStatsManager { */ public void setAppInactive(String packageName, boolean inactive) { try { - mService.setAppInactive(packageName, inactive, UserHandle.myUserId()); + mService.setAppInactive(packageName, inactive, mContext.getUserId()); } catch (RemoteException e) { // fall through } diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index a55bbdaea56f..a2c75a6c014c 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -459,10 +459,9 @@ public class AppWidgetManager { */ public static final String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider"; + private final Context mContext; private final String mPackageName; - private final IAppWidgetService mService; - private final DisplayMetrics mDisplayMetrics; /** @@ -481,6 +480,7 @@ public class AppWidgetManager { * @hide */ public AppWidgetManager(Context context, IAppWidgetService service) { + mContext = context; mPackageName = context.getOpPackageName(); mService = service; mDisplayMetrics = context.getResources().getDisplayMetrics(); @@ -845,7 +845,7 @@ public class AppWidgetManager { } if (profile == null) { - profile = Process.myUserHandle(); + profile = mContext.getUser(); } try { @@ -924,7 +924,7 @@ public class AppWidgetManager { if (mService == null) { return; } - bindAppWidgetIdIfAllowed(appWidgetId, Process.myUserHandle(), provider, options); + bindAppWidgetIdIfAllowed(appWidgetId, mContext.getUser(), provider, options); } /** @@ -944,7 +944,7 @@ public class AppWidgetManager { if (mService == null) { return false; } - return bindAppWidgetIdIfAllowed(appWidgetId, UserHandle.myUserId(), provider, null); + return bindAppWidgetIdIfAllowed(appWidgetId, mContext.getUserId(), provider, null); } /** @@ -968,7 +968,7 @@ public class AppWidgetManager { if (mService == null) { return false; } - return bindAppWidgetIdIfAllowed(appWidgetId, UserHandle.myUserId(), provider, options); + return bindAppWidgetIdIfAllowed(appWidgetId, mContext.getUserId(), provider, options); } /** @@ -1030,7 +1030,7 @@ public class AppWidgetManager { return false; } try { - return mService.hasBindAppWidgetPermission(packageName, UserHandle.myUserId()); + return mService.hasBindAppWidgetPermission(packageName, mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1050,7 +1050,7 @@ public class AppWidgetManager { if (mService == null) { return; } - setBindAppWidgetPermission(packageName, UserHandle.myUserId(), permission); + setBindAppWidgetPermission(packageName, mContext.getUserId(), permission); } /** diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java index b255a43cbe30..a2e714eb348a 100644 --- a/core/java/android/bluetooth/BluetoothA2dp.java +++ b/core/java/android/bluetooth/BluetoothA2dp.java @@ -262,7 +262,7 @@ public final class BluetoothA2dp implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth A2DP Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothA2dpSink.java b/core/java/android/bluetooth/BluetoothA2dpSink.java index faab000a8997..13f0aaf47f0c 100755 --- a/core/java/android/bluetooth/BluetoothA2dpSink.java +++ b/core/java/android/bluetooth/BluetoothA2dpSink.java @@ -182,7 +182,7 @@ public final class BluetoothA2dpSink implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth A2DP Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothAvrcpController.java b/core/java/android/bluetooth/BluetoothAvrcpController.java index 5f0e5d97447e..e7c8944788fd 100644 --- a/core/java/android/bluetooth/BluetoothAvrcpController.java +++ b/core/java/android/bluetooth/BluetoothAvrcpController.java @@ -138,7 +138,7 @@ public final class BluetoothAvrcpController implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth AVRCP Controller Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index a2af3422eaec..3df433643b00 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -1507,6 +1507,38 @@ public final class BluetoothGatt implements BluetoothProfile { } /** + * Request an LE connection parameter update. + * + * <p>This function will send an LE connection parameters update request to the remote device. + * + * @return true, if the request is send to the Bluetooth stack. + * @hide + */ + public boolean requestLeConnectionUpdate(int minConnectionInterval, + int maxConnectionInterval, + int slaveLatency, int supervisionTimeout) { + if (DBG) { + Log.d(TAG, "requestLeConnectionUpdate() - min=(" + minConnectionInterval + + ")" + (1.25 * minConnectionInterval) + + "msec, max=(" + maxConnectionInterval + ")" + + (1.25 * maxConnectionInterval) + "msec, latency=" + slaveLatency + + ", timeout=" + supervisionTimeout + "msec"); + } + if (mService == null || mClientIf == 0) return false; + + try { + mService.leConnectionUpdate(mClientIf, mDevice.getAddress(), + minConnectionInterval, maxConnectionInterval, + slaveLatency, supervisionTimeout); + } catch (RemoteException e) { + Log.e(TAG, "", e); + return false; + } + + return true; + } + + /** * Not supported - please use {@link BluetoothManager#getConnectedDevices(int)} * with {@link BluetoothProfile#GATT} as argument * diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java index 031287f5ee12..397b90656f3e 100644 --- a/core/java/android/bluetooth/BluetoothHeadsetClient.java +++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java @@ -427,7 +427,7 @@ public final class BluetoothHeadsetClient implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth Headset Client Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothHealth.java b/core/java/android/bluetooth/BluetoothHealth.java index 57a019755f8f..b967fb20f023 100644 --- a/core/java/android/bluetooth/BluetoothHealth.java +++ b/core/java/android/bluetooth/BluetoothHealth.java @@ -491,7 +491,7 @@ public final class BluetoothHealth implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth Health Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothHidDevice.java b/core/java/android/bluetooth/BluetoothHidDevice.java index 2fab305ba8bd..77ab7319046a 100644 --- a/core/java/android/bluetooth/BluetoothHidDevice.java +++ b/core/java/android/bluetooth/BluetoothHidDevice.java @@ -236,7 +236,7 @@ public final class BluetoothHidDevice implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth HID Device Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothHidHost.java b/core/java/android/bluetooth/BluetoothHidHost.java index 8ad0f9d064fd..0ca39f169a72 100644 --- a/core/java/android/bluetooth/BluetoothHidHost.java +++ b/core/java/android/bluetooth/BluetoothHidHost.java @@ -279,7 +279,7 @@ public final class BluetoothHidHost implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth HID Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothMap.java b/core/java/android/bluetooth/BluetoothMap.java index 5b55b23680c3..0fa1d5d6295f 100644 --- a/core/java/android/bluetooth/BluetoothMap.java +++ b/core/java/android/bluetooth/BluetoothMap.java @@ -109,7 +109,7 @@ public final class BluetoothMap implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth MAP Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothMapClient.java b/core/java/android/bluetooth/BluetoothMapClient.java index af3b662d6a49..4f21d936e562 100644 --- a/core/java/android/bluetooth/BluetoothMapClient.java +++ b/core/java/android/bluetooth/BluetoothMapClient.java @@ -125,7 +125,7 @@ public final class BluetoothMapClient implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth MAP MCE Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java index 866b06308354..9f401eb3cefc 100644 --- a/core/java/android/bluetooth/BluetoothPan.java +++ b/core/java/android/bluetooth/BluetoothPan.java @@ -147,7 +147,7 @@ public final class BluetoothPan implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth Pan Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothPbap.java b/core/java/android/bluetooth/BluetoothPbap.java index 794435457f25..c60e9e075c87 100644 --- a/core/java/android/bluetooth/BluetoothPbap.java +++ b/core/java/android/bluetooth/BluetoothPbap.java @@ -163,7 +163,7 @@ public class BluetoothPbap implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth Pbap Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java index 01b3f6e0e841..1446adc8b9c3 100644 --- a/core/java/android/bluetooth/BluetoothPbapClient.java +++ b/core/java/android/bluetooth/BluetoothPbapClient.java @@ -116,7 +116,7 @@ public final class BluetoothPbapClient implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth PBAP Client Service with " + intent); return false; } diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java index 48481620c97f..c51e39a74186 100644 --- a/core/java/android/bluetooth/BluetoothSap.java +++ b/core/java/android/bluetooth/BluetoothSap.java @@ -147,7 +147,7 @@ public final class BluetoothSap implements BluetoothProfile { ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); intent.setComponent(comp); if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, - android.os.Process.myUserHandle())) { + mContext.getUser())) { Log.e(TAG, "Could not bind to Bluetooth SAP Service with " + intent); return false; } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 8d2e141ae78f..22496a45d84d 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -166,6 +166,26 @@ public abstract class ContentResolver { public static final String SYNC_EXTRAS_DISALLOW_METERED = "allow_metered"; /** + * {@hide} Flag only used by the requestsync command to treat a request as if it was made by + * a foreground app. + * + * Only the system and the shell user can set it. + * + * This extra is "virtual". Once passed to the system server, it'll be removed from the bundle. + */ + public static final String SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC = "force_fg_sync"; + + /** + * {@hide} Flag only used by the requestsync command to treat a request as if it was made by + * a background app. + * + * Only the system and the shell user can set it. + * + * This extra is "virtual". Once passed to the system server, it'll be removed from the bundle. + */ + public static final String SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC = "force_bg_sync"; + + /** * Set by the SyncManager to request that the SyncAdapter initialize itself for * the given account/authority pair. One required initialization step is to * ensure that {@link #setIsSyncable(android.accounts.Account, String, int)} has been @@ -2435,13 +2455,7 @@ public abstract class ContentResolver { public static void addPeriodicSync(Account account, String authority, Bundle extras, long pollFrequency) { validateSyncExtrasBundle(extras); - if (extras.getBoolean(SYNC_EXTRAS_MANUAL, false) - || extras.getBoolean(SYNC_EXTRAS_DO_NOT_RETRY, false) - || extras.getBoolean(SYNC_EXTRAS_IGNORE_BACKOFF, false) - || extras.getBoolean(SYNC_EXTRAS_IGNORE_SETTINGS, false) - || extras.getBoolean(SYNC_EXTRAS_INITIALIZE, false) - || extras.getBoolean(SYNC_EXTRAS_FORCE, false) - || extras.getBoolean(SYNC_EXTRAS_EXPEDITED, false)) { + if (invalidPeriodicExtras(extras)) { throw new IllegalArgumentException("illegal extras were set"); } try { @@ -2999,6 +3013,11 @@ public abstract class ContentResolver { } /** @hide */ + public int getUserId() { + return mContext.getUserId(); + } + + /** @hide */ public Drawable getTypeDrawable(String mimeType) { return MimeIconUtils.loadMimeIcon(mContext, mimeType); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index f2eb4a0285a4..b85a3199881c 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -49,6 +49,7 @@ import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; @@ -4678,9 +4679,15 @@ public abstract class Context { * * @hide */ - public abstract Context createPackageContextAsUser( + @SystemApi + public Context createPackageContextAsUser( String packageName, @CreatePackageOptions int flags, UserHandle user) - throws PackageManager.NameNotFoundException; + throws PackageManager.NameNotFoundException { + if (Build.IS_ENG) { + throw new IllegalStateException("createPackageContextAsUser not overridden!"); + } + return this; + } /** * Creates a context given an {@link android.content.pm.ApplicationInfo}. @@ -4705,13 +4712,22 @@ public abstract class Context { throws PackageManager.NameNotFoundException; /** - * Get the userId associated with this context - * @return user id - * + * Get the user associated with this context + * @hide + */ + @TestApi + public UserHandle getUser() { + return android.os.Process.myUserHandle(); + } + + /** + * Get the user associated with this context * @hide */ @TestApi - public abstract @UserIdInt int getUserId(); + public @UserIdInt int getUserId() { + return android.os.UserHandle.myUserId(); + } /** * Return a new Context object for the current Context but whose resources @@ -4909,6 +4925,19 @@ public abstract class Context { } /** + * @hide + */ + public boolean isAutofillCompatibilityEnabled() { + return false; + } + + /** + * @hide + */ + public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) { + } + + /** * Throws an exception if the Context is using system resources, * which are non-runtime-overlay-themable and may show inconsistent UI. * @hide diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 8c1293e5b298..a788989a7578 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -994,4 +994,20 @@ public class ContextWrapper extends Context { public void setAutofillClient(AutofillClient client) { mBase.setAutofillClient(client); } + + /** + * @hide + */ + @Override + public boolean isAutofillCompatibilityEnabled() { + return mBase.isAutofillCompatibilityEnabled(); + } + + /** + * @hide + */ + @Override + public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) { + mBase.setAutofillCompatibilityEnabled(autofillCompatEnabled); + } } diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl index 0b16852246f8..8fddb99b35a8 100644 --- a/core/java/android/content/pm/IPackageInstallerSession.aidl +++ b/core/java/android/content/pm/IPackageInstallerSession.aidl @@ -26,9 +26,12 @@ interface IPackageInstallerSession { void addClientProgress(float progress); String[] getNames(); + ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes); ParcelFileDescriptor openRead(String name); + void write(String name, long offsetBytes, long lengthBytes, in ParcelFileDescriptor fd); + void removeSplit(String splitName); void close(); diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index df677d208d36..d0be6c854020 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -829,7 +829,19 @@ public class PackageInstaller { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } + } + /** {@hide} */ + public void write(@NonNull String name, long offsetBytes, long lengthBytes, + @NonNull ParcelFileDescriptor fd) throws IOException { + try { + mSession.write(name, offsetBytes, lengthBytes, fd); + } catch (RuntimeException e) { + ExceptionUtils.maybeUnwrapIOException(e); + throw e; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 0b4231fbc916..4e5f83579ebf 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2965,6 +2965,11 @@ public abstract class PackageManager { */ public static final int VERSION_CODE_HIGHEST = -1; + /** {@hide} */ + public int getUserId() { + return UserHandle.myUserId(); + } + /** * Retrieve overall information about an application package that is * installed on the system. @@ -5212,7 +5217,7 @@ public abstract class PackageManager { */ @Deprecated public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) { - getPackageSizeInfoAsUser(packageName, UserHandle.myUserId(), observer); + getPackageSizeInfoAsUser(packageName, getUserId(), observer); } /** diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 3f63d80f5864..fc2eba282352 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -277,7 +277,7 @@ public class ResolveInfo implements Parcelable { dr = pm.getDrawable(ci.packageName, iconResourceId, ai); } if (dr != null) { - return pm.getUserBadgedIcon(dr, new UserHandle(UserHandle.myUserId())); + return pm.getUserBadgedIcon(dr, new UserHandle(pm.getUserId())); } return ci.loadIcon(pm); } diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index 30222b74bdc1..25e0ccd8d551 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -770,6 +770,6 @@ public class ShortcutManager { /** @hide injection point */ @VisibleForTesting protected int injectMyUserId() { - return UserHandle.myUserId(); + return mContext.getUserId(); } } diff --git a/core/java/android/database/AbstractCursor.java b/core/java/android/database/AbstractCursor.java index fdb702f01e9d..76fa008799dd 100644 --- a/core/java/android/database/AbstractCursor.java +++ b/core/java/android/database/AbstractCursor.java @@ -395,7 +395,7 @@ public abstract class AbstractCursor implements CrossProcessCursor { */ @Override public void setNotificationUri(ContentResolver cr, Uri notifyUri) { - setNotificationUri(cr, notifyUri, UserHandle.myUserId()); + setNotificationUri(cr, notifyUri, cr.getUserId()); } /** @hide - set the notification uri but with an observer for a particular user's view */ diff --git a/core/java/android/hardware/biometrics/BiometricAuthenticator.java b/core/java/android/hardware/biometrics/BiometricAuthenticator.java new file mode 100644 index 000000000000..c811999ce304 --- /dev/null +++ b/core/java/android/hardware/biometrics/BiometricAuthenticator.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.biometrics; + +import android.annotation.CallbackExecutor; +import android.annotation.NonNull; +import android.os.CancellationSignal; +import android.os.Parcelable; + +import java.util.concurrent.Executor; + +/** + * This is the common interface that all biometric authentication classes should implement. + * @hide + */ +public interface BiometricAuthenticator { + + /** + * Container for biometric data + * @hide + */ + abstract class BiometricIdentifier implements Parcelable {} + + /** + * Container for callback data from {@link BiometricAuthenticator#authenticate( + * CancellationSignal, Executor, AuthenticationCallback)} and + * {@link BiometricAuthenticator#authenticate(CryptoObject, CancellationSignal, Executor, + * AuthenticationCallback)} + */ + class AuthenticationResult { + private BiometricIdentifier mIdentifier; + private CryptoObject mCryptoObject; + private int mUserId; + + /** + * @hide + */ + public AuthenticationResult() { } + + /** + * Authentication result + * @param crypto + * @param identifier + * @param userId + * @hide + */ + public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier, + int userId) { + mCryptoObject = crypto; + mIdentifier = identifier; + mUserId = userId; + } + + /** + * Obtain the crypto object associated with this transaction + * @return crypto object provided to {@link BiometricAuthenticator#authenticate( + * CryptoObject, CancellationSignal, Executor, AuthenticationCallback)} + */ + public CryptoObject getCryptoObject() { + return mCryptoObject; + } + + /** + * Obtain the biometric identifier associated with this operation. Applications are strongly + * discouraged from associating specific identifiers with specific applications or + * operations. + * @hide + */ + public BiometricIdentifier getId() { + return mIdentifier; + } + + /** + * Obtain the userId for which this biometric was authenticated. + * @hide + */ + public int getUserId() { + return mUserId; + } + }; + + /** + * Callback structure provided to {@link BiometricAuthenticator#authenticate(CancellationSignal, + * Executor, AuthenticationCallback)} or {@link BiometricAuthenticator#authenticate( + * CryptoObject, CancellationSignal, Executor, AuthenticationCallback)}. Users must provide + * an implementation of this for listening to biometric events. + */ + abstract class AuthenticationCallback { + /** + * Called when an unrecoverable error has been encountered and the operation is complete. + * No further actions will be made on this object. + * @param errorCode An integer identifying the error message + * @param errString A human-readable error string that can be shown on an UI + */ + public void onAuthenticationError(int errorCode, CharSequence errString) {} + + /** + * Called when a recoverable error has been encountered during authentication. The help + * string is provided to give the user guidance for what went wrong, such as "Sensor dirty, + * please clean it." + * @param helpCode An integer identifying the error message + * @param helpString A human-readable string that can be shown on an UI + */ + public void onAuthenticationHelp(int helpCode, CharSequence helpString) {} + + /** + * Called when a biometric is recognized. + * @param result An object containing authentication-related data + */ + public void onAuthenticationSucceeded(AuthenticationResult result) {} + + /** + * Called when a biometric is valid but not recognized. + */ + public void onAuthenticationFailed() {} + + /** + * Called when a biometric has been acquired, but hasn't been processed yet. + * @hide + */ + public void onAuthenticationAcquired(int acquireInfo) {} + }; + + /** + * This call warms up the hardware and starts scanning for valid biometrics. It terminates + * when {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)} is called or when {@link AuthenticationCallback#onAuthenticationSucceeded( + * AuthenticationResult)} is called, at which point the crypto object becomes invalid. This + * operation can be canceled by using the provided cancel object. The application wil receive + * authentication errors through {@link AuthenticationCallback}. Calling + * {@link BiometricAuthenticator#authenticate(CryptoObject, CancellationSignal, Executor, + * AuthenticationCallback)} while an existing authentication attempt is occurring will stop + * the previous client and start a new authentication. The interrupted client will receive a + * cancelled notification through {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)}. + * + * @throws IllegalArgumentException If any of the arguments are null + * + * @param crypto Object associated with the call + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events + */ + void authenticate(@NonNull CryptoObject crypto, + @NonNull CancellationSignal cancel, + @NonNull @CallbackExecutor Executor executor, + @NonNull AuthenticationCallback callback); + + /** + * This call warms up the hardware and starts scanning for valid biometrics. It terminates + * when {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)} is called or when {@link AuthenticationCallback#onAuthenticationSucceeded( + * AuthenticationResult)} is called. This operation can be canceled by using the provided cancel + * object. The application wil receive authentication errors through + * {@link AuthenticationCallback}. Calling {@link BiometricAuthenticator#authenticate( + * CryptoObject, CancellationSignal, Executor, AuthenticationCallback)} while an existing + * authentication attempt is occurring will stop the previous client and start a new + * authentication. The interrupted client will receive a cancelled notification through + * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}. + * + * @throws IllegalArgumentException If any of the arguments are null + * + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events + */ + void authenticate(@NonNull CancellationSignal cancel, + @NonNull @CallbackExecutor Executor executor, + @NonNull AuthenticationCallback callback); +} diff --git a/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java new file mode 100644 index 000000000000..638f525bfb10 --- /dev/null +++ b/core/java/android/hardware/biometrics/BiometricFingerprintConstants.java @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.biometrics; + +import android.hardware.fingerprint.FingerprintManager; + +/** + * Interface containing all of the fingerprint-specific constants. + * @hide + */ +public interface BiometricFingerprintConstants { + // + // Error messages from fingerprint hardware during initilization, enrollment, authentication or + // removal. Must agree with the list in fingerprint.h + // + + /** + * The hardware is unavailable. Try again later. + */ + public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; + + /** + * Error state returned when the sensor was unable to process the current image. + */ + public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; + + /** + * Error state returned when the current request has been running too long. This is intended to + * prevent programs from waiting for the fingerprint sensor indefinitely. The timeout is + * platform and sensor-specific, but is generally on the order of 30 seconds. + */ + public static final int FINGERPRINT_ERROR_TIMEOUT = 3; + + /** + * Error state returned for operations like enrollment; the operation cannot be completed + * because there's not enough storage remaining to complete the operation. + */ + public static final int FINGERPRINT_ERROR_NO_SPACE = 4; + + /** + * The operation was canceled because the fingerprint sensor is unavailable. For example, + * this may happen when the user is switched, the device is locked or another pending operation + * prevents or disables it. + */ + public static final int FINGERPRINT_ERROR_CANCELED = 5; + + /** + * The {@link FingerprintManager#remove} call failed. Typically this will happen when the + * provided fingerprint id was incorrect. + * + * @hide + */ + public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; + + /** + * The operation was canceled because the API is locked out due to too many attempts. + * This occurs after 5 failed attempts, and lasts for 30 seconds. + */ + public static final int FINGERPRINT_ERROR_LOCKOUT = 7; + + /** + * Hardware vendors may extend this list if there are conditions that do not fall under one of + * the above categories. Vendors are responsible for providing error strings for these errors. + * These messages are typically reserved for internal operations such as enrollment, but may be + * used to express vendor errors not covered by the ones in fingerprint.h. Applications are + * expected to show the error message string if they happen, but are advised not to rely on the + * message id since they will be device and vendor-specific + */ + public static final int FINGERPRINT_ERROR_VENDOR = 8; + + /** + * The operation was canceled because FINGERPRINT_ERROR_LOCKOUT occurred too many times. + * Fingerprint authentication is disabled until the user unlocks with strong authentication + * (PIN/Pattern/Password) + */ + public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; + + /** + * The user canceled the operation. Upon receiving this, applications should use alternate + * authentication (e.g. a password). The application should also provide the means to return + * to fingerprint authentication, such as a "use fingerprint" button. + */ + public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; + + /** + * The user does not have any fingerprints enrolled. + */ + public static final int FINGERPRINT_ERROR_NO_FINGERPRINTS = 11; + + /** + * The device does not have a fingerprint sensor. + */ + public static final int FINGERPRINT_ERROR_HW_NOT_PRESENT = 12; + + /** + * @hide + */ + public static final int FINGERPRINT_ERROR_VENDOR_BASE = 1000; + + // + // Image acquisition messages. Must agree with those in fingerprint.h + // + + /** + * The image acquired was good. + */ + public static final int FINGERPRINT_ACQUIRED_GOOD = 0; + + /** + * Only a partial fingerprint image was detected. During enrollment, the user should be + * informed on what needs to happen to resolve this problem, e.g. "press firmly on sensor." + */ + public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; + + /** + * The fingerprint image was too noisy to process due to a detected condition (i.e. dry skin) or + * a possibly dirty sensor (See {@link #FINGERPRINT_ACQUIRED_IMAGER_DIRTY}). + */ + public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; + + /** + * The fingerprint image was too noisy due to suspected or detected dirt on the sensor. + * For example, it's reasonable return this after multiple + * {@link #FINGERPRINT_ACQUIRED_INSUFFICIENT} or actual detection of dirt on the sensor + * (stuck pixels, swaths, etc.). The user is expected to take action to clean the sensor + * when this is returned. + */ + public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; + + /** + * The fingerprint image was unreadable due to lack of motion. This is most appropriate for + * linear array sensors that require a swipe motion. + */ + public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; + + /** + * The fingerprint image was incomplete due to quick motion. While mostly appropriate for + * linear array sensors, this could also happen if the finger was moved during acquisition. + * The user should be asked to move the finger slower (linear) or leave the finger on the sensor + * longer. + */ + public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; + + /** + * Hardware vendors may extend this list if there are conditions that do not fall under one of + * the above categories. Vendors are responsible for providing error strings for these errors. + * @hide + */ + public static final int FINGERPRINT_ACQUIRED_VENDOR = 6; + /** + * @hide + */ + public static final int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000; +} diff --git a/core/java/android/hardware/biometrics/CryptoObject.java b/core/java/android/hardware/biometrics/CryptoObject.java new file mode 100644 index 000000000000..496d9c57f252 --- /dev/null +++ b/core/java/android/hardware/biometrics/CryptoObject.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.biometrics; + +import android.annotation.NonNull; +import android.security.keystore.AndroidKeyStoreProvider; + +import java.security.Signature; + +import javax.crypto.Cipher; +import javax.crypto.Mac; + +/** + * A wrapper class for the crypto objects supported by FingerprintManager. Currently the + * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. + * @hide + */ +public class CryptoObject { + private final Object mCrypto; + + public CryptoObject(@NonNull Signature signature) { + mCrypto = signature; + } + + public CryptoObject(@NonNull Cipher cipher) { + mCrypto = cipher; + } + + public CryptoObject(@NonNull Mac mac) { + mCrypto = mac; + } + + /** + * Get {@link Signature} object. + * @return {@link Signature} object or null if this doesn't contain one. + */ + public Signature getSignature() { + return mCrypto instanceof Signature ? (Signature) mCrypto : null; + } + + /** + * Get {@link Cipher} object. + * @return {@link Cipher} object or null if this doesn't contain one. + */ + public Cipher getCipher() { + return mCrypto instanceof Cipher ? (Cipher) mCrypto : null; + } + + /** + * Get {@link Mac} object. + * @return {@link Mac} object or null if this doesn't contain one. + */ + public Mac getMac() { + return mCrypto instanceof Mac ? (Mac) mCrypto : null; + } + + /** + * @hide + * @return the opId associated with this object or 0 if none + */ + public final long getOpId() { + return mCrypto != null + ? AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCrypto) : 0; + } +}; diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 40ee8348ac4c..df644012ffb7 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -923,6 +923,14 @@ public abstract class CameraDevice implements AutoCloseable { * {@link CameraCaptureSession#setRepeatingRequest} or * {@link CameraCaptureSession#setRepeatingBurst}</p> * + * <p>Individual physical camera settings will only be honored for camera session + * that was initialiazed with corresponding physical camera id output configuration + * {@link OutputConfiguration#setPhysicalCameraId} and the same output targets are + * also attached in the request by {@link CaptureRequest.Builder#addTarget}.</p> + * + * <p>The output is undefined for any logical camera streams in case valid physical camera + * settings are attached.</p> + * * @param templateType An enumeration selecting the use case for this request. Not all template * types are supported on every device. See the documentation for each template type for * details. diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 22fb8e75289a..6b2059e1c84c 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -649,7 +649,7 @@ public final class DisplayManager { @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(BrightnessConfiguration c) { - setBrightnessConfigurationForUser(c, UserHandle.myUserId(), mContext.getPackageName()); + setBrightnessConfigurationForUser(c, mContext.getUserId(), mContext.getPackageName()); } /** diff --git a/core/java/android/hardware/fingerprint/Fingerprint.java b/core/java/android/hardware/fingerprint/Fingerprint.java index c30763475fa8..c7ce8fad2543 100644 --- a/core/java/android/hardware/fingerprint/Fingerprint.java +++ b/core/java/android/hardware/fingerprint/Fingerprint.java @@ -15,6 +15,7 @@ */ package android.hardware.fingerprint; +import android.hardware.biometrics.BiometricAuthenticator; import android.os.Parcel; import android.os.Parcelable; @@ -22,7 +23,7 @@ import android.os.Parcelable; * Container for fingerprint metadata. * @hide */ -public final class Fingerprint implements Parcelable { +public final class Fingerprint extends BiometricAuthenticator.BiometricIdentifier { private CharSequence mName; private int mGroupId; private int mFingerId; diff --git a/core/java/android/hardware/fingerprint/FingerprintDialog.java b/core/java/android/hardware/fingerprint/FingerprintDialog.java index 6b7fab773b43..49835963a3b1 100644 --- a/core/java/android/hardware/fingerprint/FingerprintDialog.java +++ b/core/java/android/hardware/fingerprint/FingerprintDialog.java @@ -23,19 +23,25 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.content.Context; import android.content.DialogInterface; -import android.hardware.fingerprint.FingerprintManager.AuthenticationCallback; -import android.hardware.fingerprint.FingerprintManager.AuthenticationResult; +import android.content.pm.PackageManager; +import android.hardware.biometrics.BiometricAuthenticator; +import android.hardware.biometrics.BiometricFingerprintConstants; +import android.hardware.biometrics.CryptoObject; import android.hardware.fingerprint.IFingerprintDialogReceiver; import android.os.Bundle; import android.os.CancellationSignal; import android.text.TextUtils; +import java.security.Signature; import java.util.concurrent.Executor; +import javax.crypto.Cipher; +import javax.crypto.Mac; + /** * A class that manages a system-provided fingerprint dialog. */ -public class FingerprintDialog { +public class FingerprintDialog implements BiometricAuthenticator, BiometricFingerprintConstants { /** * @hide @@ -200,6 +206,7 @@ public class FingerprintDialog { } } + private PackageManager mPackageManager; private FingerprintManager mFingerprintManager; private Bundle mBundle; private ButtonInfo mPositiveButtonInfo; @@ -227,37 +234,209 @@ public class FingerprintDialog { mPositiveButtonInfo = positiveButtonInfo; mNegativeButtonInfo = negativeButtonInfo; mFingerprintManager = context.getSystemService(FingerprintManager.class); + mPackageManager = context.getPackageManager(); + } + + /** + * A wrapper class for the crypto objects supported by FingerprintManager. Currently the + * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. + */ + public static final class CryptoObject extends android.hardware.biometrics.CryptoObject { + public CryptoObject(@NonNull Signature signature) { + super(signature); + } + + public CryptoObject(@NonNull Cipher cipher) { + super(cipher); + } + + public CryptoObject(@NonNull Mac mac) { + super(mac); + } + + /** + * Get {@link Signature} object. + * @return {@link Signature} object or null if this doesn't contain one. + */ + public Signature getSignature() { + return super.getSignature(); + } + + /** + * Get {@link Cipher} object. + * @return {@link Cipher} object or null if this doesn't contain one. + */ + public Cipher getCipher() { + return super.getCipher(); + } + + /** + * Get {@link Mac} object. + * @return {@link Mac} object or null if this doesn't contain one. + */ + public Mac getMac() { + return super.getMac(); + } + } + + /** + * Container for callback data from {@link #authenticate( + * CancellationSignal, Executor, AuthenticationCallback)} and + * {@link #authenticate(CryptoObject, CancellationSignal, Executor, + * AuthenticationCallback)} + */ + public static class AuthenticationResult extends BiometricAuthenticator.AuthenticationResult { + /** + * Authentication result + * @param crypto + * @param identifier + * @param userId + * @hide + */ + public AuthenticationResult(CryptoObject crypto, BiometricIdentifier identifier, + int userId) { + super(crypto, identifier, userId); + } + /** + * Obtain the crypto object associated with this transaction + * @return crypto object provided to {@link #authenticate( + * CryptoObject, CancellationSignal, Executor, AuthenticationCallback)} + */ + public CryptoObject getCryptoObject() { + return (CryptoObject) super.getCryptoObject(); + } + } + + /** + * Callback structure provided to {@link FingerprintDialog#authenticate(CancellationSignal, + * Executor, AuthenticationCallback)} or {@link FingerprintDialog#authenticate(CryptoObject, + * CancellationSignal, Executor, AuthenticationCallback)}. Users must provide an implementation + * of this for listening to authentication events. + */ + public static abstract class AuthenticationCallback extends + BiometricAuthenticator.AuthenticationCallback { + /** + * Called when an unrecoverable error has been encountered and the operation is complete. + * No further actions will be made on this object. + * @param errorCode An integer identifying the error message + * @param errString A human-readable error string that can be shown on an UI + */ + @Override + public void onAuthenticationError(int errorCode, CharSequence errString) {} + + /** + * Called when a recoverable error has been encountered during authentication. The help + * string is provided to give the user guidance for what went wrong, such as "Sensor dirty, + * please clean it." + * @param helpCode An integer identifying the error message + * @param helpString A human-readable string that can be shown on an UI + */ + @Override + public void onAuthenticationHelp(int helpCode, CharSequence helpString) {} + + /** + * Called when a biometric is recognized. + * @param result An object containing authentication-related data + */ + public void onAuthenticationSucceeded(AuthenticationResult result) {} + + /** + * Called when a biometric is valid but not recognized. + */ + @Override + public void onAuthenticationFailed() {} + + /** + * Called when a biometric has been acquired, but hasn't been processed yet. + * @hide + */ + @Override + public void onAuthenticationAcquired(int acquireInfo) {} + + /** + * @param result An object containing authentication-related data + * @hide + */ + @Override + public void onAuthenticationSucceeded(BiometricAuthenticator.AuthenticationResult result) { + onAuthenticationSucceeded(new AuthenticationResult( + (CryptoObject) result.getCryptoObject(), + result.getId(), + result.getUserId())); + } + } + + + /** + * @param crypto Object associated with the call + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events + * @hide + */ + @Override + public void authenticate(@NonNull android.hardware.biometrics.CryptoObject crypto, + @NonNull CancellationSignal cancel, + @NonNull @CallbackExecutor Executor executor, + @NonNull BiometricAuthenticator.AuthenticationCallback callback) { + if (!(callback instanceof FingerprintDialog.AuthenticationCallback)) { + throw new IllegalArgumentException("Callback cannot be casted"); + } + authenticate(crypto, cancel, executor, (AuthenticationCallback) callback); } /** + * + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events + * @hide + */ + @Override + public void authenticate(@NonNull CancellationSignal cancel, + @NonNull @CallbackExecutor Executor executor, + @NonNull BiometricAuthenticator.AuthenticationCallback callback) { + if (!(callback instanceof FingerprintDialog.AuthenticationCallback)) { + throw new IllegalArgumentException("Callback cannot be casted"); + } + authenticate(cancel, executor, (AuthenticationCallback) callback); + } + + + /** * This call warms up the fingerprint hardware, displays a system-provided dialog, * and starts scanning for a fingerprint. It terminates when - * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when - * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult)} is called, - * when {@link AuthenticationCallback#onAuthenticationFailed()} is called or when the user - * dismisses the system-provided dialog, at which point the crypto object becomes invalid. - * This operation can be canceled by using the provided cancel object. The application will - * receive authentication errors through {@link AuthenticationCallback}, and button events - * through the corresponding callback set in - * {@link Builder#setNegativeButton(CharSequence, Executor, DialogInterface.OnClickListener)}. - * It is safe to reuse the {@link FingerprintDialog} object, and calling - * {@link FingerprintDialog#authenticate(CancellationSignal, Executor, AuthenticationCallback)} - * while an existing authentication attempt is occurring will stop the previous client and - * start a new authentication. The interrupted client will receive a cancelled notification - * through {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}. + * {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)} is called, when + * {@link AuthenticationCallback#onAuthenticationSucceeded( + * AuthenticationResult)}, or when the user dismisses the system-provided dialog, at which point + * the crypto object becomes invalid. This operation can be canceled by using the provided + * cancel object. The application will receive authentication errors through + * {@link AuthenticationCallback}, and button events through the + * corresponding callback set in {@link Builder#setNegativeButton(CharSequence, + * Executor, DialogInterface.OnClickListener)}. It is safe to reuse the + * {@link FingerprintDialog} object, and calling {@link FingerprintDialog#authenticate( + * CancellationSignal, Executor, AuthenticationCallback)} while an + * existing authentication attempt is occurring will stop the previous client and start a + * new authentication. The interrupted client will receive a cancelled notification through + * {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)}. * - * @throws IllegalArgumentException if any of the arguments are null + * @throws IllegalArgumentException If any of the arguments are null * - * @param crypto object associated with the call - * @param cancel an object that can be used to cancel authentication - * @param executor an executor to handle callback events - * @param callback an object to receive authentication events + * @param crypto Object associated with the call + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events */ @RequiresPermission(USE_FINGERPRINT) - public void authenticate(@NonNull FingerprintManager.CryptoObject crypto, + public void authenticate(@NonNull CryptoObject crypto, @NonNull CancellationSignal cancel, @NonNull @CallbackExecutor Executor executor, - @NonNull FingerprintManager.AuthenticationCallback callback) { + @NonNull AuthenticationCallback callback) { + if (handlePreAuthenticationErrors(callback, executor)) { + return; + } mFingerprintManager.authenticate(crypto, cancel, mBundle, executor, mDialogReceiver, callback); } @@ -265,29 +444,57 @@ public class FingerprintDialog { /** * This call warms up the fingerprint hardware, displays a system-provided dialog, * and starts scanning for a fingerprint. It terminates when - * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} is called, when - * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult)} is called, - * when {@link AuthenticationCallback#onAuthenticationFailed()} is called or when the user - * dismisses the system-provided dialog. This operation can be canceled by using the provided - * cancel object. The application will receive authentication errors through - * {@link AuthenticationCallback}, and button events through the corresponding callback set in + * {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)} is called, when + * {@link AuthenticationCallback#onAuthenticationSucceeded( + * AuthenticationResult)} is called, or when the user dismisses the system-provided dialog. + * This operation can be canceled by using the provided cancel object. The application will + * receive authentication errors through {@link AuthenticationCallback}, + * and button events through the corresponding callback set in * {@link Builder#setNegativeButton(CharSequence, Executor, DialogInterface.OnClickListener)}. * It is safe to reuse the {@link FingerprintDialog} object, and calling - * {@link FingerprintDialog#authenticate(CancellationSignal, Executor, AuthenticationCallback)} - * while an existing authentication attempt is occurring will stop the previous client and - * start a new authentication. The interrupted client will receive a cancelled notification - * through {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)}. + * {@link FingerprintDialog#authenticate(CancellationSignal, Executor, + * AuthenticationCallback)} while an existing authentication attempt is + * occurring will stop the previous client and start a new authentication. The interrupted + * client will receive a cancelled notification through + * {@link AuthenticationCallback#onAuthenticationError(int, + * CharSequence)}. * - * @throws IllegalArgumentException if any of the arguments are null + * @throws IllegalArgumentException If any of the arguments are null * - * @param cancel an object that can be used to cancel authentication - * @param executor an executor to handle callback events - * @param callback an object to receive authentication events + * @param cancel An object that can be used to cancel authentication + * @param executor An executor to handle callback events + * @param callback An object to receive authentication events */ @RequiresPermission(USE_FINGERPRINT) public void authenticate(@NonNull CancellationSignal cancel, @NonNull @CallbackExecutor Executor executor, - @NonNull FingerprintManager.AuthenticationCallback callback) { + @NonNull AuthenticationCallback callback) { + if (handlePreAuthenticationErrors(callback, executor)) { + return; + } mFingerprintManager.authenticate(cancel, mBundle, executor, mDialogReceiver, callback); } + + private boolean handlePreAuthenticationErrors(AuthenticationCallback callback, + Executor executor) { + if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { + sendError(FINGERPRINT_ERROR_HW_NOT_PRESENT, callback, executor); + return true; + } else if (!mFingerprintManager.isHardwareDetected()) { + sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, callback, executor); + return true; + } else if (!mFingerprintManager.hasEnrolledFingerprints()) { + sendError(FINGERPRINT_ERROR_NO_FINGERPRINTS, callback, executor); + return true; + } + return false; + } + + private void sendError(int error, AuthenticationCallback callback, Executor executor) { + executor.execute(() -> { + callback.onAuthenticationError(error, mFingerprintManager.getErrorString( + error, 0 /* vendorCode */)); + }); + } } diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 62d92c4ac385..92d6bbb0a20f 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -27,6 +27,8 @@ import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.app.ActivityManager; import android.content.Context; +import android.hardware.biometrics.BiometricAuthenticator; +import android.hardware.biometrics.BiometricFingerprintConstants; import android.os.Binder; import android.os.Bundle; import android.os.CancellationSignal; @@ -38,7 +40,6 @@ import android.os.Looper; import android.os.PowerManager; import android.os.RemoteException; import android.os.UserHandle; -import android.security.keystore.AndroidKeyStoreProvider; import android.util.Log; import android.util.Slog; @@ -51,9 +52,14 @@ import javax.crypto.Mac; /** * A class that coordinates access to the fingerprint hardware. + * @deprecated See {@link FingerprintDialog} which shows a system-provided dialog upon starting + * authentication. In a world where devices may have in-display fingerprint sensors, it's much + * more realistic to have a system-provided authentication dialog since the in-display sensor + * location may vary by vendor/device. */ +@Deprecated @SystemService(Context.FINGERPRINT_SERVICE) -public class FingerprintManager { +public class FingerprintManager implements BiometricFingerprintConstants { private static final String TAG = "FingerprintManager"; private static final boolean DEBUG = true; private static final int MSG_ENROLL_RESULT = 100; @@ -64,147 +70,14 @@ public class FingerprintManager { private static final int MSG_REMOVED = 105; private static final int MSG_ENUMERATED = 106; - // - // Error messages from fingerprint hardware during initilization, enrollment, authentication or - // removal. Must agree with the list in fingerprint.h - // - - /** - * The hardware is unavailable. Try again later. - */ - public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; - - /** - * Error state returned when the sensor was unable to process the current image. - */ - public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; - - /** - * Error state returned when the current request has been running too long. This is intended to - * prevent programs from waiting for the fingerprint sensor indefinitely. The timeout is - * platform and sensor-specific, but is generally on the order of 30 seconds. - */ - public static final int FINGERPRINT_ERROR_TIMEOUT = 3; - - /** - * Error state returned for operations like enrollment; the operation cannot be completed - * because there's not enough storage remaining to complete the operation. - */ - public static final int FINGERPRINT_ERROR_NO_SPACE = 4; - - /** - * The operation was canceled because the fingerprint sensor is unavailable. For example, - * this may happen when the user is switched, the device is locked or another pending operation - * prevents or disables it. - */ - public static final int FINGERPRINT_ERROR_CANCELED = 5; - - /** - * The {@link FingerprintManager#remove} call failed. Typically this will happen when the - * provided fingerprint id was incorrect. - * - * @hide - */ - public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; - - /** - * The operation was canceled because the API is locked out due to too many attempts. - * This occurs after 5 failed attempts, and lasts for 30 seconds. - */ - public static final int FINGERPRINT_ERROR_LOCKOUT = 7; - - /** - * Hardware vendors may extend this list if there are conditions that do not fall under one of - * the above categories. Vendors are responsible for providing error strings for these errors. - * These messages are typically reserved for internal operations such as enrollment, but may be - * used to express vendor errors not covered by the ones in fingerprint.h. Applications are - * expected to show the error message string if they happen, but are advised not to rely on the - * message id since they will be device and vendor-specific - */ - public static final int FINGERPRINT_ERROR_VENDOR = 8; - - /** - * The operation was canceled because FINGERPRINT_ERROR_LOCKOUT occurred too many times. - * Fingerprint authentication is disabled until the user unlocks with strong authentication - * (PIN/Pattern/Password) - */ - public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; - - /** - * The user canceled the operation. Upon receiving this, applications should use alternate - * authentication (e.g. a password). The application should also provide the means to return - * to fingerprint authentication, such as a "use fingerprint" button. - */ - public static final int FINGERPRINT_ERROR_USER_CANCELED = 10; - - /** - * @hide - */ - public static final int FINGERPRINT_ERROR_VENDOR_BASE = 1000; - - // - // Image acquisition messages. Must agree with those in fingerprint.h - // - - /** - * The image acquired was good. - */ - public static final int FINGERPRINT_ACQUIRED_GOOD = 0; - - /** - * Only a partial fingerprint image was detected. During enrollment, the user should be - * informed on what needs to happen to resolve this problem, e.g. "press firmly on sensor." - */ - public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; - - /** - * The fingerprint image was too noisy to process due to a detected condition (i.e. dry skin) or - * a possibly dirty sensor (See {@link #FINGERPRINT_ACQUIRED_IMAGER_DIRTY}). - */ - public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; - - /** - * The fingerprint image was too noisy due to suspected or detected dirt on the sensor. - * For example, it's reasonable return this after multiple - * {@link #FINGERPRINT_ACQUIRED_INSUFFICIENT} or actual detection of dirt on the sensor - * (stuck pixels, swaths, etc.). The user is expected to take action to clean the sensor - * when this is returned. - */ - public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; - - /** - * The fingerprint image was unreadable due to lack of motion. This is most appropriate for - * linear array sensors that require a swipe motion. - */ - public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; - - /** - * The fingerprint image was incomplete due to quick motion. While mostly appropriate for - * linear array sensors, this could also happen if the finger was moved during acquisition. - * The user should be asked to move the finger slower (linear) or leave the finger on the sensor - * longer. - */ - public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; - - /** - * Hardware vendors may extend this list if there are conditions that do not fall under one of - * the above categories. Vendors are responsible for providing error strings for these errors. - * @hide - */ - public static final int FINGERPRINT_ACQUIRED_VENDOR = 6; - /** - * @hide - */ - public static final int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000; - private IFingerprintService mService; private Context mContext; private IBinder mToken = new Binder(); - private AuthenticationCallback mAuthenticationCallback; + private BiometricAuthenticator.AuthenticationCallback mAuthenticationCallback; private EnrollmentCallback mEnrollmentCallback; private RemovalCallback mRemovalCallback; private EnumerateCallback mEnumerateCallback; - private CryptoObject mCryptoObject; + private android.hardware.biometrics.CryptoObject mCryptoObject; private Fingerprint mRemovalFingerprint; private Handler mHandler; private Executor mExecutor; @@ -217,9 +90,9 @@ public class FingerprintManager { } private class OnAuthenticationCancelListener implements OnCancelListener { - private CryptoObject mCrypto; + private android.hardware.biometrics.CryptoObject mCrypto; - public OnAuthenticationCancelListener(CryptoObject crypto) { + public OnAuthenticationCancelListener(android.hardware.biometrics.CryptoObject crypto) { mCrypto = crypto; } @@ -233,18 +106,17 @@ public class FingerprintManager { * A wrapper class for the crypto objects supported by FingerprintManager. Currently the * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. */ - public static final class CryptoObject { - + public static final class CryptoObject extends android.hardware.biometrics.CryptoObject { public CryptoObject(@NonNull Signature signature) { - mCrypto = signature; + super(signature); } public CryptoObject(@NonNull Cipher cipher) { - mCrypto = cipher; + super(cipher); } public CryptoObject(@NonNull Mac mac) { - mCrypto = mac; + super(mac); } /** @@ -252,7 +124,7 @@ public class FingerprintManager { * @return {@link Signature} object or null if this doesn't contain one. */ public Signature getSignature() { - return mCrypto instanceof Signature ? (Signature) mCrypto : null; + return super.getSignature(); } /** @@ -260,7 +132,7 @@ public class FingerprintManager { * @return {@link Cipher} object or null if this doesn't contain one. */ public Cipher getCipher() { - return mCrypto instanceof Cipher ? (Cipher) mCrypto : null; + return super.getCipher(); } /** @@ -268,20 +140,9 @@ public class FingerprintManager { * @return {@link Mac} object or null if this doesn't contain one. */ public Mac getMac() { - return mCrypto instanceof Mac ? (Mac) mCrypto : null; + return super.getMac(); } - - /** - * @hide - * @return the opId associated with this object or 0 if none - */ - public long getOpId() { - return mCrypto != null ? - AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCrypto) : 0; - } - - private final Object mCrypto; - }; + } /** * Container for callback data from {@link FingerprintManager#authenticate(CryptoObject, @@ -334,13 +195,15 @@ public class FingerprintManager { * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to * fingerprint events. */ - public static abstract class AuthenticationCallback { + public static abstract class AuthenticationCallback + extends BiometricAuthenticator.AuthenticationCallback { /** * Called when an unrecoverable error has been encountered and the operation is complete. * No further callbacks will be made on this object. * @param errorCode An integer identifying the error message * @param errString A human-readable error string that can be shown in UI */ + @Override public void onAuthenticationError(int errorCode, CharSequence errString) { } /** @@ -350,6 +213,7 @@ public class FingerprintManager { * @param helpCode An integer identifying the error message * @param helpString A human-readable string that can be shown in UI */ + @Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) { } /** @@ -361,6 +225,7 @@ public class FingerprintManager { /** * Called when a fingerprint is valid but not recognized. */ + @Override public void onAuthenticationFailed() { } /** @@ -369,7 +234,19 @@ public class FingerprintManager { * @param acquireInfo one of FINGERPRINT_ACQUIRED_* constants * @hide */ + @Override public void onAuthenticationAcquired(int acquireInfo) {} + + /** + * @hide + * @param result + */ + @Override + public void onAuthenticationSucceeded(BiometricAuthenticator.AuthenticationResult result) { + onAuthenticationSucceeded(new AuthenticationResult( + (CryptoObject) result.getCryptoObject(), + (Fingerprint) result.getId(), result.getUserId())); + } }; /** @@ -489,11 +366,16 @@ public class FingerprintManager { * by <a href="{@docRoot}training/articles/keystore.html">Android Keystore * facility</a>. * @throws IllegalStateException if the crypto primitive is not initialized. + * @deprecated See {@link FingerprintDialog#authenticate(CancellationSignal, Executor, + * FingerprintDialog.AuthenticationCallback)} and {@link FingerprintDialog#authenticate( + * FingerprintDialog.CryptoObject, CancellationSignal, Executor, + * FingerprintDialog.AuthenticationCallback)} */ + @Deprecated @RequiresPermission(USE_FINGERPRINT) public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) { - authenticate(crypto, cancel, flags, callback, handler, UserHandle.myUserId()); + authenticate(crypto, cancel, flags, callback, handler, mContext.getUserId()); } /** @@ -554,12 +436,12 @@ public class FingerprintManager { * @param userId the user ID that the fingerprint hardware will authenticate for. */ private void authenticate(int userId, - @Nullable CryptoObject crypto, + @Nullable android.hardware.biometrics.CryptoObject crypto, @NonNull CancellationSignal cancel, @NonNull Bundle bundle, @NonNull @CallbackExecutor Executor executor, @NonNull IFingerprintDialogReceiver receiver, - @NonNull AuthenticationCallback callback) { + @NonNull BiometricAuthenticator.AuthenticationCallback callback) { mCryptoObject = crypto; if (cancel.isCanceled()) { Log.w(TAG, "authentication already canceled"); @@ -598,7 +480,7 @@ public class FingerprintManager { @NonNull Bundle bundle, @NonNull @CallbackExecutor Executor executor, @NonNull IFingerprintDialogReceiver receiver, - @NonNull AuthenticationCallback callback) { + @NonNull BiometricAuthenticator.AuthenticationCallback callback) { if (cancel == null) { throw new IllegalArgumentException("Must supply a cancellation signal"); } @@ -614,7 +496,7 @@ public class FingerprintManager { if (callback == null) { throw new IllegalArgumentException("Must supply a calback"); } - authenticate(UserHandle.myUserId(), null, cancel, bundle, executor, receiver, callback); + authenticate(mContext.getUserId(), null, cancel, bundle, executor, receiver, callback); } /** @@ -626,12 +508,12 @@ public class FingerprintManager { * @param callback * @hide */ - public void authenticate(@NonNull CryptoObject crypto, + public void authenticate(@NonNull android.hardware.biometrics.CryptoObject crypto, @NonNull CancellationSignal cancel, @NonNull Bundle bundle, @NonNull @CallbackExecutor Executor executor, @NonNull IFingerprintDialogReceiver receiver, - @NonNull AuthenticationCallback callback) { + @NonNull BiometricAuthenticator.AuthenticationCallback callback) { if (crypto == null) { throw new IllegalArgumentException("Must supply a crypto object"); } @@ -648,9 +530,10 @@ public class FingerprintManager { throw new IllegalArgumentException("Must supply a receiver"); } if (callback == null) { - throw new IllegalArgumentException("Must supply a calback"); + throw new IllegalArgumentException("Must supply a callback"); } - authenticate(UserHandle.myUserId(), crypto, cancel, bundle, executor, receiver, callback); + authenticate(mContext.getUserId(), crypto, cancel, + bundle, executor, receiver, callback); } /** @@ -841,19 +724,22 @@ public class FingerprintManager { */ @RequiresPermission(USE_FINGERPRINT) public List<Fingerprint> getEnrolledFingerprints() { - return getEnrolledFingerprints(UserHandle.myUserId()); + return getEnrolledFingerprints(mContext.getUserId()); } /** * Determine if there is at least one fingerprint enrolled. * * @return true if at least one fingerprint is enrolled, false otherwise + * @deprecated See {@link FingerprintDialog} and + * {@link FingerprintDialog#FINGERPRINT_ERROR_NO_FINGERPRINTS} */ + @Deprecated @RequiresPermission(USE_FINGERPRINT) public boolean hasEnrolledFingerprints() { if (mService != null) try { return mService.hasEnrolledFingerprints( - UserHandle.myUserId(), mContext.getOpPackageName()); + mContext.getUserId(), mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -879,7 +765,10 @@ public class FingerprintManager { * Determine if fingerprint hardware is present and functional. * * @return true if hardware is present and functional, false otherwise. + * @deprecated See {@link FingerprintDialog} and + * {@link FingerprintDialog#FINGERPRINT_ERROR_HW_UNAVAILABLE} */ + @Deprecated @RequiresPermission(USE_FINGERPRINT) public boolean isHardwareDetected() { if (mService != null) { @@ -1049,8 +938,8 @@ public class FingerprintManager { private void sendAuthenticatedSucceeded(Fingerprint fp, int userId) { if (mAuthenticationCallback != null) { - final AuthenticationResult result = - new AuthenticationResult(mCryptoObject, fp, userId); + final BiometricAuthenticator.AuthenticationResult result = + new BiometricAuthenticator.AuthenticationResult(mCryptoObject, fp, userId); mAuthenticationCallback.onAuthenticationSucceeded(result); } } @@ -1126,7 +1015,7 @@ public class FingerprintManager { } } - private void cancelAuthentication(CryptoObject cryptoObject) { + private void cancelAuthentication(android.hardware.biometrics.CryptoObject cryptoObject) { if (mService != null) try { mService.cancelAuthentication(mToken, mContext.getOpPackageName()); } catch (RemoteException e) { @@ -1160,6 +1049,12 @@ public class FingerprintManager { case FINGERPRINT_ERROR_USER_CANCELED: return mContext.getString( com.android.internal.R.string.fingerprint_error_user_canceled); + case FINGERPRINT_ERROR_NO_FINGERPRINTS: + return mContext.getString( + com.android.internal.R.string.fingerprint_error_no_fingerprints); + case FINGERPRINT_ERROR_HW_NOT_PRESENT: + return mContext.getString( + com.android.internal.R.string.fingerprint_error_hw_not_present); case FINGERPRINT_ERROR_VENDOR: { String[] msgArray = mContext.getResources().getStringArray( com.android.internal.R.array.fingerprint_error_vendor); diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index b00f6033976e..e1d7edfa7d9c 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -213,6 +213,7 @@ public class RadioManager { private final boolean mIsBgScanSupported; private final Set<Integer> mSupportedProgramTypes; private final Set<Integer> mSupportedIdentifierTypes; + @Nullable private final Map<String, Integer> mDabFrequencyTable; @NonNull private final Map<String, String> mVendorInfo; /** @hide */ @@ -221,6 +222,7 @@ public class RadioManager { boolean isCaptureSupported, BandDescriptor[] bands, boolean isBgScanSupported, @ProgramSelector.ProgramType int[] supportedProgramTypes, @ProgramSelector.IdentifierType int[] supportedIdentifierTypes, + @Nullable Map<String, Integer> dabFrequencyTable, Map<String, String> vendorInfo) { mId = id; mServiceName = TextUtils.isEmpty(serviceName) ? "default" : serviceName; @@ -236,6 +238,13 @@ public class RadioManager { mIsBgScanSupported = isBgScanSupported; mSupportedProgramTypes = arrayToSet(supportedProgramTypes); mSupportedIdentifierTypes = arrayToSet(supportedIdentifierTypes); + if (dabFrequencyTable != null) { + for (Map.Entry<String, Integer> entry : dabFrequencyTable.entrySet()) { + Objects.requireNonNull(entry.getKey()); + Objects.requireNonNull(entry.getValue()); + } + } + mDabFrequencyTable = dabFrequencyTable; mVendorInfo = (vendorInfo == null) ? new HashMap<>() : vendorInfo; } @@ -363,6 +372,19 @@ public class RadioManager { } /** + * A frequency table for Digital Audio Broadcasting (DAB). + * + * The key is a channel name, i.e. 5A, 7B. + * + * The value is a frequency, in kHz. + * + * @return a frequency table, or {@code null} if the module doesn't support DAB + */ + public @Nullable Map<String, Integer> getDabFrequencyTable() { + return mDabFrequencyTable; + } + + /** * A map of vendor-specific opaque strings, passed from HAL without changes. * Format of these strings can vary across vendors. * @@ -403,6 +425,7 @@ public class RadioManager { mIsBgScanSupported = in.readInt() == 1; mSupportedProgramTypes = arrayToSet(in.createIntArray()); mSupportedIdentifierTypes = arrayToSet(in.createIntArray()); + mDabFrequencyTable = Utils.readStringIntMap(in); mVendorInfo = Utils.readStringMap(in); } @@ -433,6 +456,7 @@ public class RadioManager { dest.writeInt(mIsBgScanSupported ? 1 : 0); dest.writeIntArray(setToArray(mSupportedProgramTypes)); dest.writeIntArray(setToArray(mSupportedIdentifierTypes)); + Utils.writeStringIntMap(dest, mDabFrequencyTable); Utils.writeStringMap(dest, mVendorInfo); } @@ -456,67 +480,31 @@ public class RadioManager { @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + mId; - result = prime * result + mServiceName.hashCode(); - result = prime * result + mClassId; - result = prime * result + ((mImplementor == null) ? 0 : mImplementor.hashCode()); - result = prime * result + ((mProduct == null) ? 0 : mProduct.hashCode()); - result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode()); - result = prime * result + ((mSerial == null) ? 0 : mSerial.hashCode()); - result = prime * result + mNumTuners; - result = prime * result + mNumAudioSources; - result = prime * result + (mIsCaptureSupported ? 1 : 0); - result = prime * result + Arrays.hashCode(mBands); - result = prime * result + (mIsBgScanSupported ? 1 : 0); - result = prime * result + mVendorInfo.hashCode(); - return result; + return Objects.hash(mId, mServiceName, mClassId, mImplementor, mProduct, mVersion, + mSerial, mNumTuners, mNumAudioSources, mIsCaptureSupported, mBands, + mIsBgScanSupported, mDabFrequencyTable, mVendorInfo); } @Override public boolean equals(Object obj) { - if (this == obj) - return true; - if (!(obj instanceof ModuleProperties)) - return false; + if (this == obj) return true; + if (!(obj instanceof ModuleProperties)) return false; ModuleProperties other = (ModuleProperties) obj; - if (mId != other.getId()) - return false; + + if (mId != other.getId()) return false; if (!TextUtils.equals(mServiceName, other.mServiceName)) return false; - if (mClassId != other.getClassId()) - return false; - if (mImplementor == null) { - if (other.getImplementor() != null) - return false; - } else if (!mImplementor.equals(other.getImplementor())) - return false; - if (mProduct == null) { - if (other.getProduct() != null) - return false; - } else if (!mProduct.equals(other.getProduct())) - return false; - if (mVersion == null) { - if (other.getVersion() != null) - return false; - } else if (!mVersion.equals(other.getVersion())) - return false; - if (mSerial == null) { - if (other.getSerial() != null) - return false; - } else if (!mSerial.equals(other.getSerial())) - return false; - if (mNumTuners != other.getNumTuners()) - return false; - if (mNumAudioSources != other.getNumAudioSources()) - return false; - if (mIsCaptureSupported != other.isCaptureSupported()) - return false; - if (!Arrays.equals(mBands, other.getBands())) - return false; - if (mIsBgScanSupported != other.isBackgroundScanningSupported()) - return false; - if (!mVendorInfo.equals(other.mVendorInfo)) return false; + if (mClassId != other.mClassId) return false; + if (!Objects.equals(mImplementor, other.mImplementor)) return false; + if (!Objects.equals(mProduct, other.mProduct)) return false; + if (!Objects.equals(mVersion, other.mVersion)) return false; + if (!Objects.equals(mSerial, other.mSerial)) return false; + if (mNumTuners != other.mNumTuners) return false; + if (mNumAudioSources != other.mNumAudioSources) return false; + if (mIsCaptureSupported != other.mIsCaptureSupported) return false; + if (!Objects.equals(mBands, other.mBands)) return false; + if (mIsBgScanSupported != other.mIsBgScanSupported) return false; + if (!Objects.equals(mDabFrequencyTable, other.mDabFrequencyTable)) return false; + if (!Objects.equals(mVendorInfo, other.mVendorInfo)) return false; return true; } } diff --git a/core/java/android/hardware/radio/Utils.java b/core/java/android/hardware/radio/Utils.java index f1b589746a14..9887f7823269 100644 --- a/core/java/android/hardware/radio/Utils.java +++ b/core/java/android/hardware/radio/Utils.java @@ -56,6 +56,29 @@ final class Utils { return map; } + static void writeStringIntMap(@NonNull Parcel dest, @Nullable Map<String, Integer> map) { + if (map == null) { + dest.writeInt(0); + return; + } + dest.writeInt(map.size()); + for (Map.Entry<String, Integer> entry : map.entrySet()) { + dest.writeString(entry.getKey()); + dest.writeInt(entry.getValue()); + } + } + + static @NonNull Map<String, Integer> readStringIntMap(@NonNull Parcel in) { + int size = in.readInt(); + Map<String, Integer> map = new HashMap<>(); + while (size-- > 0) { + String key = in.readString(); + int value = in.readInt(); + map.put(key, value); + } + return map; + } + static <T extends Parcelable> void writeSet(@NonNull Parcel dest, @Nullable Set<T> set) { if (set == null) { dest.writeInt(0); diff --git a/core/java/android/hardware/usb/AccessoryFilter.java b/core/java/android/hardware/usb/AccessoryFilter.java index d9b7c5be7ddd..00070fe363be 100644 --- a/core/java/android/hardware/usb/AccessoryFilter.java +++ b/core/java/android/hardware/usb/AccessoryFilter.java @@ -16,6 +16,11 @@ package android.hardware.usb; +import android.annotation.NonNull; +import android.service.usb.UsbAccessoryFilterProto; + +import com.android.internal.util.dump.DualDumpOutputStream; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -142,4 +147,17 @@ public class AccessoryFilter { "\", mModel=\"" + mModel + "\", mVersion=\"" + mVersion + "\"]"; } + + /** + * Write a description of the filter to a dump stream. + */ + public void dump(@NonNull DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("manufacturer", UsbAccessoryFilterProto.MANUFACTURER, mManufacturer); + dump.write("model", UsbAccessoryFilterProto.MODEL, mModel); + dump.write("version", UsbAccessoryFilterProto.VERSION, mVersion); + + dump.end(token); + } } diff --git a/core/java/android/hardware/usb/DeviceFilter.java b/core/java/android/hardware/usb/DeviceFilter.java index 439c629758b0..6f1aff71b2f3 100644 --- a/core/java/android/hardware/usb/DeviceFilter.java +++ b/core/java/android/hardware/usb/DeviceFilter.java @@ -16,8 +16,12 @@ package android.hardware.usb; +import android.annotation.NonNull; +import android.service.usb.UsbDeviceFilterProto; import android.util.Slog; +import com.android.internal.util.dump.DualDumpOutputStream; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -310,4 +314,22 @@ public class DeviceFilter { ",mProductName=" + mProductName + ",mSerialNumber=" + mSerialNumber + "]"; } + + /** + * Write a description of the filter to a dump stream. + */ + public void dump(@NonNull DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("vendor_id", UsbDeviceFilterProto.VENDOR_ID, mVendorId); + dump.write("product_id", UsbDeviceFilterProto.PRODUCT_ID, mProductId); + dump.write("class", UsbDeviceFilterProto.CLASS, mClass); + dump.write("subclass", UsbDeviceFilterProto.SUBCLASS, mSubclass); + dump.write("protocol", UsbDeviceFilterProto.PROTOCOL, mProtocol); + dump.write("manufacturer_name", UsbDeviceFilterProto.MANUFACTURER_NAME, mManufacturerName); + dump.write("product_name", UsbDeviceFilterProto.PRODUCT_NAME, mProductName); + dump.write("serial_number", UsbDeviceFilterProto.SERIAL_NUMBER, mSerialNumber); + + dump.end(token); + } } diff --git a/core/java/android/hardware/usb/UsbConfiguration.java b/core/java/android/hardware/usb/UsbConfiguration.java index a17157087a61..6ce420191ed3 100644 --- a/core/java/android/hardware/usb/UsbConfiguration.java +++ b/core/java/android/hardware/usb/UsbConfiguration.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; + import com.android.internal.util.Preconditions; /** @@ -106,6 +107,17 @@ public class UsbConfiguration implements Parcelable { } /** + * Returns the attributes of this configuration + * + * @return the configuration's attributes + * + * @hide + */ + public int getAttributes() { + return mAttributes; + } + + /** * Returns the configuration's max power consumption, in milliamps. * * @return the configuration's max power diff --git a/core/java/android/hardware/usb/UsbConstants.java b/core/java/android/hardware/usb/UsbConstants.java index 0e8d47ca1304..215e9d5fa94b 100644 --- a/core/java/android/hardware/usb/UsbConstants.java +++ b/core/java/android/hardware/usb/UsbConstants.java @@ -16,6 +16,8 @@ package android.hardware.usb; +import android.service.ServiceProtoEnums; + /** * Contains constants for the USB protocol. * These constants correspond to definitions in linux/usb/ch9.h in the linux kernel. @@ -35,12 +37,12 @@ public final class UsbConstants { * Used to signify direction of data for a {@link UsbEndpoint} is OUT (host to device) * @see UsbEndpoint#getDirection */ - public static final int USB_DIR_OUT = 0; + public static final int USB_DIR_OUT = ServiceProtoEnums.USB_ENDPOINT_DIR_OUT; // 0 /** * Used to signify direction of data for a {@link UsbEndpoint} is IN (device to host) * @see UsbEndpoint#getDirection */ - public static final int USB_DIR_IN = 0x80; + public static final int USB_DIR_IN = ServiceProtoEnums.USB_ENDPOINT_DIR_IN; // 0x80 /** * Bitmask used for extracting the {@link UsbEndpoint} number its address field. @@ -63,22 +65,26 @@ public final class UsbConstants { * Control endpoint type (endpoint zero) * @see UsbEndpoint#getType */ - public static final int USB_ENDPOINT_XFER_CONTROL = 0; + public static final int USB_ENDPOINT_XFER_CONTROL = + ServiceProtoEnums.USB_ENDPOINT_TYPE_XFER_CONTROL; // 0 /** * Isochronous endpoint type (currently not supported) * @see UsbEndpoint#getType */ - public static final int USB_ENDPOINT_XFER_ISOC = 1; + public static final int USB_ENDPOINT_XFER_ISOC = + ServiceProtoEnums.USB_ENDPOINT_TYPE_XFER_ISOC; // 1 /** * Bulk endpoint type * @see UsbEndpoint#getType */ - public static final int USB_ENDPOINT_XFER_BULK = 2; + public static final int USB_ENDPOINT_XFER_BULK = + ServiceProtoEnums.USB_ENDPOINT_TYPE_XFER_BULK; // 2 /** * Interrupt endpoint type * @see UsbEndpoint#getType */ - public static final int USB_ENDPOINT_XFER_INT = 3; + public static final int USB_ENDPOINT_XFER_INT = + ServiceProtoEnums.USB_ENDPOINT_TYPE_XFER_INT; // 3 /** diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java index 31a30968cbcd..ecccda588aec 100644 --- a/core/java/android/net/EthernetManager.java +++ b/core/java/android/net/EthernetManager.java @@ -18,9 +18,6 @@ package android.net; import android.annotation.SystemService; import android.content.Context; -import android.net.IEthernetManager; -import android.net.IEthernetServiceListener; -import android.net.IpConfiguration; import android.os.Handler; import android.os.Message; import android.os.RemoteException; @@ -45,18 +42,18 @@ public class EthernetManager { if (msg.what == MSG_AVAILABILITY_CHANGED) { boolean isAvailable = (msg.arg1 == 1); for (Listener listener : mListeners) { - listener.onAvailabilityChanged(isAvailable); + listener.onAvailabilityChanged((String) msg.obj, isAvailable); } } } }; - private final ArrayList<Listener> mListeners = new ArrayList<Listener>(); + private final ArrayList<Listener> mListeners = new ArrayList<>(); private final IEthernetServiceListener.Stub mServiceListener = new IEthernetServiceListener.Stub() { @Override - public void onAvailabilityChanged(boolean isAvailable) { + public void onAvailabilityChanged(String iface, boolean isAvailable) { mHandler.obtainMessage( - MSG_AVAILABILITY_CHANGED, isAvailable ? 1 : 0, 0, null).sendToTarget(); + MSG_AVAILABILITY_CHANGED, isAvailable ? 1 : 0, 0, iface).sendToTarget(); } }; @@ -66,9 +63,10 @@ public class EthernetManager { public interface Listener { /** * Called when Ethernet port's availability is changed. - * @param isAvailable {@code true} if one or more Ethernet port exists. + * @param iface Ethernet interface name + * @param isAvailable {@code true} if Ethernet port exists. */ - public void onAvailabilityChanged(boolean isAvailable); + void onAvailabilityChanged(String iface, boolean isAvailable); } /** @@ -86,9 +84,9 @@ public class EthernetManager { * Get Ethernet configuration. * @return the Ethernet Configuration, contained in {@link IpConfiguration}. */ - public IpConfiguration getConfiguration() { + public IpConfiguration getConfiguration(String iface) { try { - return mService.getConfiguration(); + return mService.getConfiguration(iface); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -97,21 +95,29 @@ public class EthernetManager { /** * Set Ethernet configuration. */ - public void setConfiguration(IpConfiguration config) { + public void setConfiguration(String iface, IpConfiguration config) { try { - mService.setConfiguration(config); + mService.setConfiguration(iface, config); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** - * Indicates whether the system currently has one or more - * Ethernet interfaces. + * Indicates whether the system currently has one or more Ethernet interfaces. */ public boolean isAvailable() { + return getAvailableInterfaces().length > 0; + } + + /** + * Indicates whether the system has given interface. + * + * @param iface Ethernet interface name + */ + public boolean isAvailable(String iface) { try { - return mService.isAvailable(); + return mService.isAvailable(iface); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -137,6 +143,17 @@ public class EthernetManager { } /** + * Returns an array of available Ethernet interface names. + */ + public String[] getAvailableInterfaces() { + try { + return mService.getAvailableInterfaces(); + } catch (RemoteException e) { + throw e.rethrowAsRuntimeException(); + } + } + + /** * Removes a listener. * @param listener A {@link Listener} to remove. * @throws IllegalArgumentException If the listener is null. diff --git a/core/java/android/net/IEthernetManager.aidl b/core/java/android/net/IEthernetManager.aidl index 7a92eb955ace..94960b51d329 100644 --- a/core/java/android/net/IEthernetManager.aidl +++ b/core/java/android/net/IEthernetManager.aidl @@ -26,9 +26,10 @@ import android.net.IEthernetServiceListener; /** {@hide} */ interface IEthernetManager { - IpConfiguration getConfiguration(); - void setConfiguration(in IpConfiguration config); - boolean isAvailable(); + String[] getAvailableInterfaces(); + IpConfiguration getConfiguration(String iface); + void setConfiguration(String iface, in IpConfiguration config); + boolean isAvailable(String iface); void addListener(in IEthernetServiceListener listener); void removeListener(in IEthernetServiceListener listener); } diff --git a/core/java/android/net/IEthernetServiceListener.aidl b/core/java/android/net/IEthernetServiceListener.aidl index 356690e8f7a6..782fa19d9df7 100644 --- a/core/java/android/net/IEthernetServiceListener.aidl +++ b/core/java/android/net/IEthernetServiceListener.aidl @@ -19,5 +19,5 @@ package android.net; /** @hide */ oneway interface IEthernetServiceListener { - void onAvailabilityChanged(boolean isAvailable); + void onAvailabilityChanged(String iface, boolean isAvailable); } diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 5df742c5a394..9f47f62775e1 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -42,6 +42,7 @@ import java.util.Objects; public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { private static final int VERSION_INIT = 1; private static final int VERSION_RULE = 2; + private static final int VERSION_RAPID = 3; public static final int CYCLE_NONE = -1; public static final long WARNING_DISABLED = -1; @@ -54,6 +55,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public long limitBytes = LIMIT_DISABLED; public long lastWarningSnooze = SNOOZE_NEVER; public long lastLimitSnooze = SNOOZE_NEVER; + public long lastRapidSnooze = SNOOZE_NEVER; @Deprecated public boolean metered = true; public boolean inferred = false; @@ -82,15 +84,24 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); } + @Deprecated public NetworkPolicy(NetworkTemplate template, RecurrenceRule cycleRule, long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, boolean metered, boolean inferred) { + this(template, cycleRule, warningBytes, limitBytes, lastWarningSnooze, lastLimitSnooze, + SNOOZE_NEVER, metered, inferred); + } + + public NetworkPolicy(NetworkTemplate template, RecurrenceRule cycleRule, long warningBytes, + long limitBytes, long lastWarningSnooze, long lastLimitSnooze, long lastRapidSnooze, + boolean metered, boolean inferred) { this.template = Preconditions.checkNotNull(template, "missing NetworkTemplate"); this.cycleRule = Preconditions.checkNotNull(cycleRule, "missing RecurrenceRule"); this.warningBytes = warningBytes; this.limitBytes = limitBytes; this.lastWarningSnooze = lastWarningSnooze; this.lastLimitSnooze = lastLimitSnooze; + this.lastRapidSnooze = lastRapidSnooze; this.metered = metered; this.inferred = inferred; } @@ -102,6 +113,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { limitBytes = source.readLong(); lastWarningSnooze = source.readLong(); lastLimitSnooze = source.readLong(); + lastRapidSnooze = source.readLong(); metered = source.readInt() != 0; inferred = source.readInt() != 0; } @@ -114,6 +126,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { dest.writeLong(limitBytes); dest.writeLong(lastWarningSnooze); dest.writeLong(lastLimitSnooze); + dest.writeLong(lastRapidSnooze); dest.writeInt(metered ? 1 : 0); dest.writeInt(inferred ? 1 : 0); } @@ -151,6 +164,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public void clearSnooze() { lastWarningSnooze = SNOOZE_NEVER; lastLimitSnooze = SNOOZE_NEVER; + lastRapidSnooze = SNOOZE_NEVER; } /** @@ -176,7 +190,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public int hashCode() { return Objects.hash(template, cycleRule, warningBytes, limitBytes, - lastWarningSnooze, lastLimitSnooze, metered, inferred); + lastWarningSnooze, lastLimitSnooze, lastRapidSnooze, metered, inferred); } @Override @@ -186,7 +200,9 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { return warningBytes == other.warningBytes && limitBytes == other.limitBytes && lastWarningSnooze == other.lastWarningSnooze - && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered + && lastLimitSnooze == other.lastLimitSnooze + && lastRapidSnooze == other.lastRapidSnooze + && metered == other.metered && inferred == other.inferred && Objects.equals(template, other.template) && Objects.equals(cycleRule, other.cycleRule); @@ -203,6 +219,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { .append(" limitBytes=").append(limitBytes) .append(" lastWarningSnooze=").append(lastWarningSnooze) .append(" lastLimitSnooze=").append(lastLimitSnooze) + .append(" lastRapidSnooze=").append(lastRapidSnooze) .append(" metered=").append(metered) .append(" inferred=").append(inferred) .append("}").toString(); @@ -224,13 +241,14 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(baos); - out.writeInt(VERSION_RULE); + out.writeInt(VERSION_RAPID); out.write(template.getBytesForBackup()); cycleRule.writeToStream(out); out.writeLong(warningBytes); out.writeLong(limitBytes); out.writeLong(lastWarningSnooze); out.writeLong(lastLimitSnooze); + out.writeLong(lastRapidSnooze); out.writeInt(metered ? 1 : 0); out.writeInt(inferred ? 1 : 0); return baos.toByteArray(); @@ -239,35 +257,32 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public static NetworkPolicy getNetworkPolicyFromBackup(DataInputStream in) throws IOException, BackupUtils.BadVersionException { final int version = in.readInt(); - switch (version) { - case VERSION_INIT: { - NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in); - int cycleDay = in.readInt(); - String cycleTimeZone = BackupUtils.readString(in); - long warningBytes = in.readLong(); - long limitBytes = in.readLong(); - long lastWarningSnooze = in.readLong(); - long lastLimitSnooze = in.readLong(); - boolean metered = in.readInt() == 1; - boolean inferred = in.readInt() == 1; - return new NetworkPolicy(template, cycleDay, cycleTimeZone, warningBytes, - limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); - } - case VERSION_RULE: { - NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in); - RecurrenceRule cycleRule = new RecurrenceRule(in); - long warningBytes = in.readLong(); - long limitBytes = in.readLong(); - long lastWarningSnooze = in.readLong(); - long lastLimitSnooze = in.readLong(); - boolean metered = in.readInt() == 1; - boolean inferred = in.readInt() == 1; - return new NetworkPolicy(template, cycleRule, warningBytes, - limitBytes, lastWarningSnooze, lastLimitSnooze, metered, inferred); - } - default: { - throw new BackupUtils.BadVersionException("Unknown backup version: " + version); - } + if (version > VERSION_RAPID) { + throw new BackupUtils.BadVersionException("Unknown backup version: " + version); + } + + final NetworkTemplate template = NetworkTemplate.getNetworkTemplateFromBackup(in); + final RecurrenceRule cycleRule; + if (version >= VERSION_RULE) { + cycleRule = new RecurrenceRule(in); + } else { + final int cycleDay = in.readInt(); + final String cycleTimezone = BackupUtils.readString(in); + cycleRule = buildRule(cycleDay, ZoneId.of(cycleTimezone)); + } + final long warningBytes = in.readLong(); + final long limitBytes = in.readLong(); + final long lastWarningSnooze = in.readLong(); + final long lastLimitSnooze = in.readLong(); + final long lastRapidSnooze; + if (version >= VERSION_RAPID) { + lastRapidSnooze = in.readLong(); + } else { + lastRapidSnooze = SNOOZE_NEVER; } + final boolean metered = in.readInt() == 1; + final boolean inferred = in.readInt() == 1; + return new NetworkPolicy(template, cycleRule, warningBytes, limitBytes, lastWarningSnooze, + lastLimitSnooze, lastRapidSnooze, metered, inferred); } } diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS index 6758d95fa6b6..3a40cf4bf8a3 100644 --- a/core/java/android/net/OWNERS +++ b/core/java/android/net/OWNERS @@ -1,5 +1,4 @@ ek@google.com -hugobenichi@google.com jsharkey@android.com jchalard@google.com lorenzo@google.com diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index bda720bb6fdd..7922276edb75 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -439,6 +439,10 @@ public class TrafficStats { } } + private static long addIfSupported(long stat) { + return (stat == UNSUPPORTED) ? 0 : stat; + } + /** * Return number of packets transmitted across mobile networks since device * boot. Counts packets across all mobile network interfaces, and always @@ -451,7 +455,7 @@ public class TrafficStats { public static long getMobileTxPackets() { long total = 0; for (String iface : getMobileIfaces()) { - total += getTxPackets(iface); + total += addIfSupported(getTxPackets(iface)); } return total; } @@ -468,7 +472,7 @@ public class TrafficStats { public static long getMobileRxPackets() { long total = 0; for (String iface : getMobileIfaces()) { - total += getRxPackets(iface); + total += addIfSupported(getRxPackets(iface)); } return total; } @@ -485,7 +489,7 @@ public class TrafficStats { public static long getMobileTxBytes() { long total = 0; for (String iface : getMobileIfaces()) { - total += getTxBytes(iface); + total += addIfSupported(getTxBytes(iface)); } return total; } @@ -502,7 +506,7 @@ public class TrafficStats { public static long getMobileRxBytes() { long total = 0; for (String iface : getMobileIfaces()) { - total += getRxBytes(iface); + total += addIfSupported(getRxBytes(iface)); } return total; } @@ -517,9 +521,7 @@ public class TrafficStats { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - if (stat != UNSUPPORTED) { - total += stat; - } + total += addIfSupported(stat); } return total; } @@ -534,9 +536,7 @@ public class TrafficStats { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - if (stat != UNSUPPORTED) { - total += stat; - } + total += addIfSupported(stat); } return total; } diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 9edcc0e9b8d4..5ca3a4106a2d 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -720,6 +720,10 @@ public abstract class Uri implements Parcelable, Comparable<Uri> { LOOP: while (end < length) { switch (uriString.charAt(end)) { case '/': // Start of path + case '\\':// Start of path + // Per http://url.spec.whatwg.org/#host-state, the \ character + // is treated as if it were a / character when encountered in a + // host case '?': // Start of query case '#': // Start of fragment break LOOP; @@ -758,6 +762,10 @@ public abstract class Uri implements Parcelable, Comparable<Uri> { case '#': // Start of fragment return ""; // Empty path. case '/': // Start of path! + case '\\':// Start of path! + // Per http://url.spec.whatwg.org/#host-state, the \ character + // is treated as if it were a / character when encountered in a + // host break LOOP; } pathStart++; diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 185b1818df45..712576f304d9 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -192,7 +192,7 @@ public class VpnService extends Service { */ public static Intent prepare(Context context) { try { - if (getService().prepareVpn(context.getPackageName(), null, UserHandle.myUserId())) { + if (getService().prepareVpn(context.getPackageName(), null, context.getUserId())) { return null; } } catch (RemoteException e) { @@ -219,7 +219,7 @@ public class VpnService extends Service { String packageName = context.getPackageName(); try { // Only prepare if we're not already prepared. - int userId = UserHandle.myUserId(); + int userId = context.getUserId(); if (!cm.prepareVpn(packageName, null, userId)) { cm.prepareVpn(null, packageName, userId); } diff --git a/core/java/android/nfc/NfcActivityManager.java b/core/java/android/nfc/NfcActivityManager.java index c7d4c65d99c0..958063ae0a9f 100644 --- a/core/java/android/nfc/NfcActivityManager.java +++ b/core/java/android/nfc/NfcActivityManager.java @@ -393,7 +393,7 @@ public final class NfcActivityManager extends IAppCallback.Stub "either scheme file or scheme content"); continue; } - uri = ContentProvider.maybeAddUserId(uri, UserHandle.myUserId()); + uri = ContentProvider.maybeAddUserId(uri, activity.getUserId()); validUris.add(uri); } @@ -410,7 +410,7 @@ public final class NfcActivityManager extends IAppCallback.Stub } finally { Binder.restoreCallingIdentity(ident); } - return new BeamShareData(message, uris, new UserHandle(UserHandle.myUserId()), flags); + return new BeamShareData(message, uris, activity.getUser(), flags); } /** Callback from NFC service, usually on binder thread */ diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index debef6310f14..b02d48dc438f 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -147,6 +147,19 @@ public final class NfcAdapter { public static final String ACTION_TAG_DISCOVERED = "android.nfc.action.TAG_DISCOVERED"; /** + * Broadcast Action: Intent to notify an application that an transaction event has occurred + * on the Secure Element. + * + * <p>This intent will only be sent if the application has requested permission for + * {@link android.Manifest.permission#NFC_TRANSACTION_EVENT} and if the application has the + * necessary access to Secure Element which witnessed the particular event. + */ + @RequiresPermission(android.Manifest.permission.NFC_TRANSACTION_EVENT) + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_TRANSACTION_DETECTED = + "android.nfc.action.TRANSACTION_DETECTED"; + + /** * Broadcast to only the activity that handles ACTION_TAG_DISCOVERED * @hide */ @@ -197,6 +210,23 @@ public final class NfcAdapter { */ public static final String EXTRA_ADAPTER_STATE = "android.nfc.extra.ADAPTER_STATE"; + /** + * Mandatory byte[] extra field in {@link #ACTION_TRANSACTION_DETECTED} + */ + public static final String EXTRA_AID = "android.nfc.extra.AID"; + + /** + * Optional byte[] extra field in {@link #ACTION_TRANSACTION_DETECTED} + */ + public static final String EXTRA_DATA = "android.nfc.extra.DATA"; + + /** + * Mandatory String extra field in {@link #ACTION_TRANSACTION_DETECTED} + * Indicates the Secure Element on which the transaction occurred. + * eSE1...eSEn for Embedded Secure Elements, SIM1...SIMn for UICC, etc. + */ + public static final String EXTRA_SE_NAME = "android.nfc.extra.SE_NAME"; + public static final int STATE_OFF = 1; public static final int STATE_TURNING_ON = 2; public static final int STATE_ON = 3; diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index 6dd799396599..15d02f2e5ddf 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -201,7 +201,7 @@ public final class CardEmulation { */ public boolean isDefaultServiceForCategory(ComponentName service, String category) { try { - return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service, category); + return sService.isDefaultServiceForCategory(mContext.getUserId(), service, category); } catch (RemoteException e) { // Try one more time recoverService(); @@ -210,7 +210,7 @@ public final class CardEmulation { return false; } try { - return sService.isDefaultServiceForCategory(UserHandle.myUserId(), service, + return sService.isDefaultServiceForCategory(mContext.getUserId(), service, category); } catch (RemoteException ee) { Log.e(TAG, "Failed to recover CardEmulationService."); @@ -232,7 +232,7 @@ public final class CardEmulation { */ public boolean isDefaultServiceForAid(ComponentName service, String aid) { try { - return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid); + return sService.isDefaultServiceForAid(mContext.getUserId(), service, aid); } catch (RemoteException e) { // Try one more time recoverService(); @@ -241,7 +241,7 @@ public final class CardEmulation { return false; } try { - return sService.isDefaultServiceForAid(UserHandle.myUserId(), service, aid); + return sService.isDefaultServiceForAid(mContext.getUserId(), service, aid); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); return false; @@ -326,7 +326,7 @@ public final class CardEmulation { List<String> aids) { AidGroup aidGroup = new AidGroup(aids, category); try { - return sService.registerAidGroupForService(UserHandle.myUserId(), service, aidGroup); + return sService.registerAidGroupForService(mContext.getUserId(), service, aidGroup); } catch (RemoteException e) { // Try one more time recoverService(); @@ -335,7 +335,7 @@ public final class CardEmulation { return false; } try { - return sService.registerAidGroupForService(UserHandle.myUserId(), service, + return sService.registerAidGroupForService(mContext.getUserId(), service, aidGroup); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); @@ -360,7 +360,7 @@ public final class CardEmulation { */ public List<String> getAidsForService(ComponentName service, String category) { try { - AidGroup group = sService.getAidGroupForService(UserHandle.myUserId(), service, + AidGroup group = sService.getAidGroupForService(mContext.getUserId(), service, category); return (group != null ? group.getAids() : null); } catch (RemoteException e) { @@ -370,7 +370,7 @@ public final class CardEmulation { return null; } try { - AidGroup group = sService.getAidGroupForService(UserHandle.myUserId(), service, + AidGroup group = sService.getAidGroupForService(mContext.getUserId(), service, category); return (group != null ? group.getAids() : null); } catch (RemoteException ee) { @@ -397,7 +397,7 @@ public final class CardEmulation { */ public boolean removeAidsForService(ComponentName service, String category) { try { - return sService.removeAidGroupForService(UserHandle.myUserId(), service, category); + return sService.removeAidGroupForService(mContext.getUserId(), service, category); } catch (RemoteException e) { // Try one more time recoverService(); @@ -406,7 +406,7 @@ public final class CardEmulation { return false; } try { - return sService.removeAidGroupForService(UserHandle.myUserId(), service, category); + return sService.removeAidGroupForService(mContext.getUserId(), service, category); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); return false; @@ -537,7 +537,7 @@ public final class CardEmulation { */ public boolean setDefaultServiceForCategory(ComponentName service, String category) { try { - return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service, category); + return sService.setDefaultServiceForCategory(mContext.getUserId(), service, category); } catch (RemoteException e) { // Try one more time recoverService(); @@ -546,7 +546,7 @@ public final class CardEmulation { return false; } try { - return sService.setDefaultServiceForCategory(UserHandle.myUserId(), service, + return sService.setDefaultServiceForCategory(mContext.getUserId(), service, category); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); @@ -560,7 +560,7 @@ public final class CardEmulation { */ public boolean setDefaultForNextTap(ComponentName service) { try { - return sService.setDefaultForNextTap(UserHandle.myUserId(), service); + return sService.setDefaultForNextTap(mContext.getUserId(), service); } catch (RemoteException e) { // Try one more time recoverService(); @@ -569,7 +569,7 @@ public final class CardEmulation { return false; } try { - return sService.setDefaultForNextTap(UserHandle.myUserId(), service); + return sService.setDefaultForNextTap(mContext.getUserId(), service); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); return false; @@ -582,7 +582,7 @@ public final class CardEmulation { */ public List<ApduServiceInfo> getServices(String category) { try { - return sService.getServices(UserHandle.myUserId(), category); + return sService.getServices(mContext.getUserId(), category); } catch (RemoteException e) { // Try one more time recoverService(); @@ -591,7 +591,7 @@ public final class CardEmulation { return null; } try { - return sService.getServices(UserHandle.myUserId(), category); + return sService.getServices(mContext.getUserId(), category); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); return null; diff --git a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java index f2b5ebc15a43..80e8579dd73f 100644 --- a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java +++ b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java @@ -118,7 +118,7 @@ public final class NfcFCardEmulation { throw new NullPointerException("service is null"); } try { - return sService.getSystemCodeForService(UserHandle.myUserId(), service); + return sService.getSystemCodeForService(mContext.getUserId(), service); } catch (RemoteException e) { // Try one more time recoverService(); @@ -127,7 +127,7 @@ public final class NfcFCardEmulation { return null; } try { - return sService.getSystemCodeForService(UserHandle.myUserId(), service); + return sService.getSystemCodeForService(mContext.getUserId(), service); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); ee.rethrowAsRuntimeException(); @@ -164,7 +164,7 @@ public final class NfcFCardEmulation { throw new NullPointerException("service or systemCode is null"); } try { - return sService.registerSystemCodeForService(UserHandle.myUserId(), + return sService.registerSystemCodeForService(mContext.getUserId(), service, systemCode); } catch (RemoteException e) { // Try one more time @@ -174,7 +174,7 @@ public final class NfcFCardEmulation { return false; } try { - return sService.registerSystemCodeForService(UserHandle.myUserId(), + return sService.registerSystemCodeForService(mContext.getUserId(), service, systemCode); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); @@ -195,7 +195,7 @@ public final class NfcFCardEmulation { throw new NullPointerException("service is null"); } try { - return sService.removeSystemCodeForService(UserHandle.myUserId(), service); + return sService.removeSystemCodeForService(mContext.getUserId(), service); } catch (RemoteException e) { // Try one more time recoverService(); @@ -204,7 +204,7 @@ public final class NfcFCardEmulation { return false; } try { - return sService.removeSystemCodeForService(UserHandle.myUserId(), service); + return sService.removeSystemCodeForService(mContext.getUserId(), service); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); ee.rethrowAsRuntimeException(); @@ -230,7 +230,7 @@ public final class NfcFCardEmulation { throw new NullPointerException("service is null"); } try { - return sService.getNfcid2ForService(UserHandle.myUserId(), service); + return sService.getNfcid2ForService(mContext.getUserId(), service); } catch (RemoteException e) { // Try one more time recoverService(); @@ -239,7 +239,7 @@ public final class NfcFCardEmulation { return null; } try { - return sService.getNfcid2ForService(UserHandle.myUserId(), service); + return sService.getNfcid2ForService(mContext.getUserId(), service); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); ee.rethrowAsRuntimeException(); @@ -273,7 +273,7 @@ public final class NfcFCardEmulation { throw new NullPointerException("service or nfcid2 is null"); } try { - return sService.setNfcid2ForService(UserHandle.myUserId(), + return sService.setNfcid2ForService(mContext.getUserId(), service, nfcid2); } catch (RemoteException e) { // Try one more time @@ -283,7 +283,7 @@ public final class NfcFCardEmulation { return false; } try { - return sService.setNfcid2ForService(UserHandle.myUserId(), + return sService.setNfcid2ForService(mContext.getUserId(), service, nfcid2); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); @@ -381,7 +381,7 @@ public final class NfcFCardEmulation { */ public List<NfcFServiceInfo> getNfcFServices() { try { - return sService.getNfcFServices(UserHandle.myUserId()); + return sService.getNfcFServices(mContext.getUserId()); } catch (RemoteException e) { // Try one more time recoverService(); @@ -390,7 +390,7 @@ public final class NfcFCardEmulation { return null; } try { - return sService.getNfcFServices(UserHandle.myUserId()); + return sService.getNfcFServices(mContext.getUserId()); } catch (RemoteException ee) { Log.e(TAG, "Failed to reach CardEmulationService."); return null; diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java index 21d245d40c64..1160415ce212 100644 --- a/core/java/android/os/FileUtils.java +++ b/core/java/android/os/FileUtils.java @@ -33,6 +33,7 @@ import android.util.Slog; import android.webkit.MimeTypeMap; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.SizedInputStream; import libcore.io.IoUtils; import libcore.util.EmptyArray; @@ -93,7 +94,7 @@ public class FileUtils { private static final long COPY_CHECKPOINT_BYTES = 524288; - public interface CopyListener { + public interface ProgressListener { public void onProgress(long progress); } @@ -202,7 +203,7 @@ public class FileUtils { } /** - * @deprecated use {@link #copy(InputStream, OutputStream)} instead. + * @deprecated use {@link #copy(File, File)} instead. */ @Deprecated public static boolean copyFile(File srcFile, File destFile) { @@ -215,7 +216,7 @@ public class FileUtils { } /** - * @deprecated use {@link #copy(InputStream, OutputStream)} instead. + * @deprecated use {@link #copy(File, File)} instead. */ @Deprecated public static void copyFileOrThrow(File srcFile, File destFile) throws IOException { @@ -255,44 +256,124 @@ public class FileUtils { } } - public static void copy(File from, File to) throws IOException { + /** + * Copy the contents of one file to another, replacing any existing content. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @return number of bytes copied. + */ + public static long copy(@NonNull File from, @NonNull File to) throws IOException { + return copy(from, to, null, null); + } + + /** + * Copy the contents of one file to another, replacing any existing content. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @param listener to be periodically notified as the copy progresses. + * @param signal to signal if the copy should be cancelled early. + * @return number of bytes copied. + */ + public static long copy(@NonNull File from, @NonNull File to, + @Nullable ProgressListener listener, @Nullable CancellationSignal signal) + throws IOException { try (FileInputStream in = new FileInputStream(from); FileOutputStream out = new FileOutputStream(to)) { - copy(in, out); + return copy(in, out, listener, signal); } } - public static void copy(InputStream in, OutputStream out) throws IOException { - copy(in, out, null, null); + /** + * Copy the contents of one stream to another. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @return number of bytes copied. + */ + public static long copy(@NonNull InputStream in, @NonNull OutputStream out) throws IOException { + return copy(in, out, null, null); } - public static void copy(InputStream in, OutputStream out, CopyListener listener, - CancellationSignal signal) throws IOException { + /** + * Copy the contents of one stream to another. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @param listener to be periodically notified as the copy progresses. + * @param signal to signal if the copy should be cancelled early. + * @return number of bytes copied. + */ + public static long copy(@NonNull InputStream in, @NonNull OutputStream out, + @Nullable ProgressListener listener, @Nullable CancellationSignal signal) + throws IOException { if (ENABLE_COPY_OPTIMIZATIONS) { if (in instanceof FileInputStream && out instanceof FileOutputStream) { - copy(((FileInputStream) in).getFD(), ((FileOutputStream) out).getFD(), + return copy(((FileInputStream) in).getFD(), ((FileOutputStream) out).getFD(), listener, signal); } } // Worse case fallback to userspace - copyInternalUserspace(in, out, listener, signal); + return copyInternalUserspace(in, out, listener, signal); } - public static void copy(FileDescriptor in, FileDescriptor out) throws IOException { - copy(in, out, null, null); + /** + * Copy the contents of one FD to another. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @return number of bytes copied. + */ + public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out) + throws IOException { + return copy(in, out, null, null); + } + + /** + * Copy the contents of one FD to another. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @param listener to be periodically notified as the copy progresses. + * @param signal to signal if the copy should be cancelled early. + * @return number of bytes copied. + */ + public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out, + @Nullable ProgressListener listener, @Nullable CancellationSignal signal) + throws IOException { + return copy(in, out, listener, signal, Long.MAX_VALUE); } - public static void copy(FileDescriptor in, FileDescriptor out, CopyListener listener, - CancellationSignal signal) throws IOException { + /** + * Copy the contents of one FD to another. + * <p> + * Attempts to use several optimization strategies to copy the data in the + * kernel before falling back to a userspace copy as a last resort. + * + * @param listener to be periodically notified as the copy progresses. + * @param signal to signal if the copy should be cancelled early. + * @param count the number of bytes to copy. + * @return number of bytes copied. + */ + public static long copy(@NonNull FileDescriptor in, @NonNull FileDescriptor out, + @Nullable ProgressListener listener, @Nullable CancellationSignal signal, long count) + throws IOException { if (ENABLE_COPY_OPTIMIZATIONS) { try { final StructStat st_in = Os.fstat(in); final StructStat st_out = Os.fstat(out); if (S_ISREG(st_in.st_mode) && S_ISREG(st_out.st_mode)) { - copyInternalSendfile(in, out, listener, signal); + return copyInternalSendfile(in, out, listener, signal, count); } else if (S_ISFIFO(st_in.st_mode) || S_ISFIFO(st_out.st_mode)) { - copyInternalSplice(in, out, listener, signal); + return copyInternalSplice(in, out, listener, signal, count); } } catch (ErrnoException e) { throw e.rethrowAsIOException(); @@ -300,23 +381,25 @@ public class FileUtils { } // Worse case fallback to userspace - copyInternalUserspace(in, out, listener, signal); + return copyInternalUserspace(in, out, listener, signal, count); } /** * Requires one of input or output to be a pipe. */ @VisibleForTesting - public static void copyInternalSplice(FileDescriptor in, FileDescriptor out, - CopyListener listener, CancellationSignal signal) throws ErrnoException { + public static long copyInternalSplice(FileDescriptor in, FileDescriptor out, + ProgressListener listener, CancellationSignal signal, long count) + throws ErrnoException { long progress = 0; long checkpoint = 0; long t; - while ((t = Os.splice(in, null, out, null, COPY_CHECKPOINT_BYTES, + while ((t = Os.splice(in, null, out, null, Math.min(count, COPY_CHECKPOINT_BYTES), SPLICE_F_MOVE | SPLICE_F_MORE)) != 0) { progress += t; checkpoint += t; + count -= t; if (checkpoint >= COPY_CHECKPOINT_BYTES) { if (signal != null) { @@ -328,21 +411,24 @@ public class FileUtils { checkpoint = 0; } } + return progress; } /** * Requires both input and output to be a regular file. */ @VisibleForTesting - public static void copyInternalSendfile(FileDescriptor in, FileDescriptor out, - CopyListener listener, CancellationSignal signal) throws ErrnoException { + public static long copyInternalSendfile(FileDescriptor in, FileDescriptor out, + ProgressListener listener, CancellationSignal signal, long count) + throws ErrnoException { long progress = 0; long checkpoint = 0; long t; - while ((t = Os.sendfile(out, in, null, COPY_CHECKPOINT_BYTES)) != 0) { + while ((t = Os.sendfile(out, in, null, Math.min(count, COPY_CHECKPOINT_BYTES))) != 0) { progress += t; checkpoint += t; + count -= t; if (checkpoint >= COPY_CHECKPOINT_BYTES) { if (signal != null) { @@ -354,17 +440,24 @@ public class FileUtils { checkpoint = 0; } } + return progress; } @VisibleForTesting - public static void copyInternalUserspace(FileDescriptor in, FileDescriptor out, - CopyListener listener, CancellationSignal signal) throws IOException { - copyInternalUserspace(new FileInputStream(in), new FileOutputStream(out), listener, signal); + public static long copyInternalUserspace(FileDescriptor in, FileDescriptor out, + ProgressListener listener, CancellationSignal signal, long count) throws IOException { + if (count != Long.MAX_VALUE) { + return copyInternalUserspace(new SizedInputStream(new FileInputStream(in), count), + new FileOutputStream(out), listener, signal); + } else { + return copyInternalUserspace(new FileInputStream(in), + new FileOutputStream(out), listener, signal); + } } @VisibleForTesting - public static void copyInternalUserspace(InputStream in, OutputStream out, - CopyListener listener, CancellationSignal signal) throws IOException { + public static long copyInternalUserspace(InputStream in, OutputStream out, + ProgressListener listener, CancellationSignal signal) throws IOException { long progress = 0; long checkpoint = 0; byte[] buffer = new byte[8192]; @@ -386,6 +479,7 @@ public class FileUtils { checkpoint = 0; } } + return progress; } /** @@ -997,7 +1091,7 @@ public class FileUtils { } } } catch (IOException | ErrnoException e) { - throw new RuntimeException(e); + // Ignored } finally { if (sink) { SystemClock.sleep(TimeUnit.SECONDS.toMillis(1)); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index b2b43cfd6ddc..2093cec769da 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -393,8 +393,9 @@ public class UserManager { public static final String DISALLOW_CONFIG_VPN = "no_config_vpn"; /** - * Specifies if a user is disallowed from configuring location mode. Device owner and profile - * owners can set this restriction and it only applies on the managed user. + * Specifies if a user is disallowed from enabling or disabling location providers. As a + * result, user is disallowed from turning on or off location. Device owner and profile owners + * can set this restriction and it only applies on the managed user. * * <p>In a managed profile, location sharing is forced off when it's off on primary user, so * user can still turn off location sharing on managed profile when the restriction is set by @@ -408,11 +409,12 @@ public class UserManager { * * <p>Key for user restrictions. * <p>Type: Boolean + * @see android.location.LocationManager#isProviderEnabled(String) * @see DevicePolicyManager#addUserRestriction(ComponentName, String) * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) * @see #getUserRestrictions() */ - public static final String DISALLOW_CONFIG_LOCATION_MODE = "no_config_location_mode"; + public static final String DISALLOW_CONFIG_LOCATION = "no_config_location"; /** * Specifies if date, time and timezone configuring is disallowed. diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index f4deeedae697..f593e8056db9 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -1096,7 +1096,7 @@ public class StorageManager { public @NonNull List<StorageVolume> getStorageVolumes() { final ArrayList<StorageVolume> res = new ArrayList<>(); Collections.addAll(res, - getVolumeList(UserHandle.myUserId(), FLAG_REAL_STATE | FLAG_INCLUDE_INVISIBLE)); + getVolumeList(mContext.getUserId(), FLAG_REAL_STATE | FLAG_INCLUDE_INVISIBLE)); return res; } @@ -1107,7 +1107,7 @@ public class StorageManager { * {@link Context#getExternalFilesDir(String)}. */ public @NonNull StorageVolume getPrimaryStorageVolume() { - return getVolumeList(UserHandle.myUserId(), FLAG_REAL_STATE | FLAG_INCLUDE_INVISIBLE)[0]; + return getVolumeList(mContext.getUserId(), FLAG_REAL_STATE | FLAG_INCLUDE_INVISIBLE)[0]; } /** {@hide} */ diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java index 747400d486bf..a5f93050e307 100644 --- a/core/java/android/print/PrintFileDocumentAdapter.java +++ b/core/java/android/print/PrintFileDocumentAdapter.java @@ -21,6 +21,8 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.CancellationSignal; import android.os.CancellationSignal.OnCancelListener; +import android.os.FileUtils; +import android.os.OperationCanceledException; import android.os.ParcelFileDescriptor; import android.util.Log; @@ -114,28 +116,15 @@ public class PrintFileDocumentAdapter extends PrintDocumentAdapter { @Override protected Void doInBackground(Void... params) { - InputStream in = null; - OutputStream out = new FileOutputStream(mDestination.getFileDescriptor()); - final byte[] buffer = new byte[8192]; - try { - in = new FileInputStream(mFile); - while (true) { - if (isCancelled()) { - break; - } - final int readByteCount = in.read(buffer); - if (readByteCount < 0) { - break; - } - out.write(buffer, 0, readByteCount); - } - } catch (IOException ioe) { - Log.e(LOG_TAG, "Error writing data!", ioe); - mResultCallback.onWriteFailed(mContext.getString( - R.string.write_fail_reason_cannot_write)); - } finally { - IoUtils.closeQuietly(in); - IoUtils.closeQuietly(out); + try (InputStream in = new FileInputStream(mFile); + OutputStream out = new FileOutputStream(mDestination.getFileDescriptor())) { + FileUtils.copy(in, out, null, mCancellationSignal); + } catch (OperationCanceledException e) { + // Ignored; already handled below + } catch (IOException e) { + Log.e(LOG_TAG, "Error writing data!", e); + mResultCallback.onWriteFailed(mContext.getString( + R.string.write_fail_reason_cannot_write)); } return null; } diff --git a/core/java/android/provider/ContactsInternal.java b/core/java/android/provider/ContactsInternal.java index 2cd1d48e7dc1..362eba93aaba 100644 --- a/core/java/android/provider/ContactsInternal.java +++ b/core/java/android/provider/ContactsInternal.java @@ -68,7 +68,7 @@ public class ContactsInternal { } } // Launch on the current profile. - startQuickContactWithErrorToastForUser(context, intent, Process.myUserHandle()); + startQuickContactWithErrorToastForUser(context, intent, context.getUser()); } public static void startQuickContactWithErrorToastForUser(Context context, Intent intent, diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ad0ce49cf456..8c6504103528 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2255,7 +2255,7 @@ public final class Settings { * @return the corresponding value, or null if not present */ public static String getString(ContentResolver resolver, String name) { - return getStringForUser(resolver, name, UserHandle.myUserId()); + return getStringForUser(resolver, name, resolver.getUserId()); } /** @hide */ @@ -2282,7 +2282,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putString(ContentResolver resolver, String name, String value) { - return putStringForUser(resolver, name, value, UserHandle.myUserId()); + return putStringForUser(resolver, name, value, resolver.getUserId()); } /** @hide */ @@ -2336,7 +2336,7 @@ public final class Settings { * or not a valid integer. */ public static int getInt(ContentResolver cr, String name, int def) { - return getIntForUser(cr, name, def, UserHandle.myUserId()); + return getIntForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -2369,7 +2369,7 @@ public final class Settings { */ public static int getInt(ContentResolver cr, String name) throws SettingNotFoundException { - return getIntForUser(cr, name, UserHandle.myUserId()); + return getIntForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -2397,7 +2397,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putInt(ContentResolver cr, String name, int value) { - return putIntForUser(cr, name, value, UserHandle.myUserId()); + return putIntForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -2421,7 +2421,7 @@ public final class Settings { * or not a valid {@code long}. */ public static long getLong(ContentResolver cr, String name, long def) { - return getLongForUser(cr, name, def, UserHandle.myUserId()); + return getLongForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -2456,7 +2456,7 @@ public final class Settings { */ public static long getLong(ContentResolver cr, String name) throws SettingNotFoundException { - return getLongForUser(cr, name, UserHandle.myUserId()); + return getLongForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -2484,7 +2484,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putLong(ContentResolver cr, String name, long value) { - return putLongForUser(cr, name, value, UserHandle.myUserId()); + return putLongForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -2508,7 +2508,7 @@ public final class Settings { * or not a valid float. */ public static float getFloat(ContentResolver cr, String name, float def) { - return getFloatForUser(cr, name, def, UserHandle.myUserId()); + return getFloatForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -2542,7 +2542,7 @@ public final class Settings { */ public static float getFloat(ContentResolver cr, String name) throws SettingNotFoundException { - return getFloatForUser(cr, name, UserHandle.myUserId()); + return getFloatForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -2573,7 +2573,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putFloat(ContentResolver cr, String name, float value) { - return putFloatForUser(cr, name, value, UserHandle.myUserId()); + return putFloatForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -2591,7 +2591,7 @@ public final class Settings { * @param outConfig Where to place the configuration settings. */ public static void getConfiguration(ContentResolver cr, Configuration outConfig) { - adjustConfigurationForUser(cr, outConfig, UserHandle.myUserId(), + adjustConfigurationForUser(cr, outConfig, cr.getUserId(), false /* updateSettingsIfEmpty */); } @@ -2644,7 +2644,7 @@ public final class Settings { * @return true if the values were set, false on database errors */ public static boolean putConfiguration(ContentResolver cr, Configuration config) { - return putConfigurationForUser(cr, config, UserHandle.myUserId()); + return putConfigurationForUser(cr, config, cr.getUserId()); } /** @hide */ @@ -2664,7 +2664,7 @@ public final class Settings { /** @deprecated - Do not use */ @Deprecated public static boolean getShowGTalkServiceStatus(ContentResolver cr) { - return getShowGTalkServiceStatusForUser(cr, UserHandle.myUserId()); + return getShowGTalkServiceStatusForUser(cr, cr.getUserId()); } /** @@ -2680,7 +2680,7 @@ public final class Settings { /** @deprecated - Do not use */ @Deprecated public static void setShowGTalkServiceStatus(ContentResolver cr, boolean flag) { - setShowGTalkServiceStatusForUser(cr, flag, UserHandle.myUserId()); + setShowGTalkServiceStatusForUser(cr, flag, cr.getUserId()); } /** @@ -4732,7 +4732,7 @@ public final class Settings { * @return the corresponding value, or null if not present */ public static String getString(ContentResolver resolver, String name) { - return getStringForUser(resolver, name, UserHandle.myUserId()); + return getStringForUser(resolver, name, resolver.getUserId()); } /** @hide */ @@ -4786,7 +4786,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putString(ContentResolver resolver, String name, String value) { - return putStringForUser(resolver, name, value, UserHandle.myUserId()); + return putStringForUser(resolver, name, value, resolver.getUserId()); } /** @hide */ @@ -4859,7 +4859,7 @@ public final class Settings { @NonNull String name, @Nullable String value, @Nullable String tag, boolean makeDefault) { return putStringForUser(resolver, name, value, tag, makeDefault, - UserHandle.myUserId()); + resolver.getUserId()); } /** @@ -4880,7 +4880,7 @@ public final class Settings { public static void resetToDefaults(@NonNull ContentResolver resolver, @Nullable String tag) { resetToDefaultsAsUser(resolver, tag, RESET_MODE_PACKAGE_DEFAULTS, - UserHandle.myUserId()); + resolver.getUserId()); } /** @@ -4947,7 +4947,7 @@ public final class Settings { * or not a valid integer. */ public static int getInt(ContentResolver cr, String name, int def) { - return getIntForUser(cr, name, def, UserHandle.myUserId()); + return getIntForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -4984,7 +4984,7 @@ public final class Settings { */ public static int getInt(ContentResolver cr, String name) throws SettingNotFoundException { - return getIntForUser(cr, name, UserHandle.myUserId()); + return getIntForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -5016,7 +5016,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putInt(ContentResolver cr, String name, int value) { - return putIntForUser(cr, name, value, UserHandle.myUserId()); + return putIntForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -5040,7 +5040,7 @@ public final class Settings { * or not a valid {@code long}. */ public static long getLong(ContentResolver cr, String name, long def) { - return getLongForUser(cr, name, def, UserHandle.myUserId()); + return getLongForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -5075,7 +5075,7 @@ public final class Settings { */ public static long getLong(ContentResolver cr, String name) throws SettingNotFoundException { - return getLongForUser(cr, name, UserHandle.myUserId()); + return getLongForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -5103,7 +5103,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putLong(ContentResolver cr, String name, long value) { - return putLongForUser(cr, name, value, UserHandle.myUserId()); + return putLongForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -5127,7 +5127,7 @@ public final class Settings { * or not a valid float. */ public static float getFloat(ContentResolver cr, String name, float def) { - return getFloatForUser(cr, name, def, UserHandle.myUserId()); + return getFloatForUser(cr, name, def, cr.getUserId()); } /** @hide */ @@ -5161,7 +5161,7 @@ public final class Settings { */ public static float getFloat(ContentResolver cr, String name) throws SettingNotFoundException { - return getFloatForUser(cr, name, UserHandle.myUserId()); + return getFloatForUser(cr, name, cr.getUserId()); } /** @hide */ @@ -5192,7 +5192,7 @@ public final class Settings { * @return true if the value was set, false on database errors */ public static boolean putFloat(ContentResolver cr, String name, float value) { - return putFloatForUser(cr, name, value, UserHandle.myUserId()); + return putFloatForUser(cr, name, value, cr.getUserId()); } /** @hide */ @@ -7999,7 +7999,7 @@ public final class Settings { */ @Deprecated public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) { - return isLocationProviderEnabledForUser(cr, provider, UserHandle.myUserId()); + return isLocationProviderEnabledForUser(cr, provider, cr.getUserId()); } /** @@ -8031,7 +8031,7 @@ public final class Settings { @Deprecated public static final void setLocationProviderEnabled(ContentResolver cr, String provider, boolean enabled) { - setLocationProviderEnabledForUser(cr, provider, enabled, UserHandle.myUserId()); + setLocationProviderEnabledForUser(cr, provider, enabled, cr.getUserId()); } /** @@ -9315,17 +9315,6 @@ public final class Settings { private static final Validator WIFI_WAKEUP_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR; /** - * Value to specify if Wi-Fi Wakeup is available. - * - * Wi-Fi Wakeup will only operate if it's available - * and {@link #WIFI_WAKEUP_ENABLED} is true. - * - * Type: int (0 for false, 1 for true) - * @hide - */ - public static final String WIFI_WAKEUP_AVAILABLE = "wifi_wakeup_available"; - - /** * Value to specify whether network quality scores and badging should be shown in the UI. * * Type: int (0 for false, 1 for true) @@ -10296,6 +10285,16 @@ public final class Settings { public static final String SYS_VDSO = "sys_vdso"; /** + * Uid CpuPower global setting. This links the uid.cpupower system property. + * The following values are supported: + * 0 -> /proc/uid_cpupower/* are disabled + * 1 -> /proc/uid_cpupower/* are enabled + * Any other value defaults to enabled. + * @hide + */ + public static final String UID_CPUPOWER = "uid_cpupower"; + + /** * An integer to reduce the FPS by this factor. Only for experiments. Need to reboot the * device for this setting to take full effect. * @@ -10750,14 +10749,14 @@ public final class Settings { public static final String LOW_POWER_MODE = "low_power"; /** - * Battery level [1-99] at which low power mode automatically turns on. + * Battery level [1-100] at which low power mode automatically turns on. * If 0, it will not automatically turn on. * @hide */ public static final String LOW_POWER_MODE_TRIGGER_LEVEL = "low_power_trigger_level"; private static final Validator LOW_POWER_MODE_TRIGGER_LEVEL_VALIDATOR = - new SettingsValidators.InclusiveIntegerRangeValidator(0, 99); + new SettingsValidators.InclusiveIntegerRangeValidator(0, 100); /** * If not 0, the activity manager will aggressively finish activities and @@ -11344,6 +11343,15 @@ public final class Settings { "chained_battery_attribution_enabled"; /** + * The packages whitelisted to be run in autofill compatibility mode. + * + * @hide + */ + @SystemApi + public static final String AUTOFILL_COMPAT_ALLOWED_PACKAGES = + "autofill_compat_allowed_packages"; + + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * @@ -11478,7 +11486,7 @@ public final class Settings { * @return the corresponding value, or null if not present */ public static String getString(ContentResolver resolver, String name) { - return getStringForUser(resolver, name, UserHandle.myUserId()); + return getStringForUser(resolver, name, resolver.getUserId()); } /** @hide */ @@ -11501,7 +11509,7 @@ public final class Settings { */ public static boolean putString(ContentResolver resolver, String name, String value) { - return putStringForUser(resolver, name, value, null, false, UserHandle.myUserId()); + return putStringForUser(resolver, name, value, null, false, resolver.getUserId()); } /** @@ -11550,7 +11558,7 @@ public final class Settings { @NonNull String name, @Nullable String value, @Nullable String tag, boolean makeDefault) { return putStringForUser(resolver, name, value, tag, makeDefault, - UserHandle.myUserId()); + resolver.getUserId()); } /** @@ -11571,7 +11579,7 @@ public final class Settings { public static void resetToDefaults(@NonNull ContentResolver resolver, @Nullable String tag) { resetToDefaultsAsUser(resolver, tag, RESET_MODE_PACKAGE_DEFAULTS, - UserHandle.myUserId()); + resolver.getUserId()); } /** @@ -11885,8 +11893,6 @@ public final class Settings { */ public static final String MULTI_SIM_SMS_PROMPT = "multi_sim_sms_prompt"; - - /** User preferred subscriptions setting. * This holds the details of the user selected subscription from the card and * the activation status. Each settings string have the comma separated values diff --git a/core/java/android/se/omapi/Channel.java b/core/java/android/se/omapi/Channel.java index f0b9fa2de5d2..65ce67fcba8f 100644 --- a/core/java/android/se/omapi/Channel.java +++ b/core/java/android/se/omapi/Channel.java @@ -25,6 +25,7 @@ package android.se.omapi; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.util.Log; import java.io.IOException; @@ -168,8 +169,10 @@ public class Channel { throw new IOException("Error in communicating with Secure Element"); } return response; - } catch (RemoteException e) { + } catch (ServiceSpecificException e) { throw new IOException(e.getMessage()); + } catch (RemoteException e) { + throw new IllegalStateException(e.getMessage()); } } } @@ -244,8 +247,10 @@ public class Channel { synchronized (mLock) { return mChannel.selectNext(); } - } catch (RemoteException e) { + } catch (ServiceSpecificException e) { throw new IOException(e.getMessage()); + } catch (RemoteException e) { + throw new IllegalStateException(e.getMessage()); } } } diff --git a/core/java/android/se/omapi/Reader.java b/core/java/android/se/omapi/Reader.java index 9f1573973be4..3dec97631e9c 100644 --- a/core/java/android/se/omapi/Reader.java +++ b/core/java/android/se/omapi/Reader.java @@ -24,6 +24,7 @@ package android.se.omapi; import android.annotation.NonNull; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.util.Log; import java.io.IOException; @@ -45,8 +46,7 @@ public class Reader { private final Object mLock = new Object(); - Reader(SEService service, String name, ISecureElementReader reader) throws - IOException { + Reader(SEService service, String name, ISecureElementReader reader) { if (reader == null || service == null || name == null) { throw new IllegalArgumentException("Parameters cannot be null"); } @@ -96,8 +96,10 @@ public class Reader { ISecureElementSession session; try { session = mReader.openSession(); - } catch (RemoteException e) { + } catch (ServiceSpecificException e) { throw new IOException(e.getMessage()); + } catch (RemoteException e) { + throw new IllegalStateException(e.getMessage()); } if (session == null) { throw new IOException("service session is null."); diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java index 1e37277dcd6d..b8937e69c143 100644 --- a/core/java/android/se/omapi/SEService.java +++ b/core/java/android/se/omapi/SEService.java @@ -42,6 +42,23 @@ import java.util.HashMap; */ public class SEService { + /** + * Error code used with ServiceSpecificException. + * Thrown if there was an error communicating with the Secure Element. + * + * @hide + */ + public static final int IO_ERROR = 1; + + /** + * Error code used with ServiceSpecificException. + * Thrown if AID cannot be selected or is not available when opening + * a logical channel. + * + * @hide + */ + public static final int NO_SUCH_ELEMENT_ERROR = 2; + private static final String TAG = "OMAPI.SEService"; private final Object mLock = new Object(); diff --git a/core/java/android/se/omapi/Session.java b/core/java/android/se/omapi/Session.java index bb2a0327ee0d..19a018ee01bb 100644 --- a/core/java/android/se/omapi/Session.java +++ b/core/java/android/se/omapi/Session.java @@ -25,6 +25,7 @@ package android.se.omapi; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.util.Log; import java.io.IOException; @@ -207,8 +208,16 @@ public class Session { return null; } return new Channel(mService, this, channel); + } catch (ServiceSpecificException e) { + if (e.errorCode == SEService.IO_ERROR) { + throw new IOException(e.getMessage()); + } else if (e.errorCode == SEService.NO_SUCH_ELEMENT_ERROR) { + throw new NoSuchElementException(e.getMessage()); + } else { + throw new IllegalStateException(e.getMessage()); + } } catch (RemoteException e) { - throw new IOException(e.getMessage()); + throw new IllegalStateException(e.getMessage()); } } } @@ -311,8 +320,16 @@ public class Session { return null; } return new Channel(mService, this, channel); + } catch (ServiceSpecificException e) { + if (e.errorCode == SEService.IO_ERROR) { + throw new IOException(e.getMessage()); + } else if (e.errorCode == SEService.NO_SUCH_ELEMENT_ERROR) { + throw new NoSuchElementException(e.getMessage()); + } else { + throw new IllegalStateException(e.getMessage()); + } } catch (RemoteException e) { - throw new IOException(e.getMessage()); + throw new IllegalStateException(e.getMessage()); } } } diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java index 4e4a0374087e..7cd08f76a47e 100644 --- a/core/java/android/security/keystore/recovery/RecoveryController.java +++ b/core/java/android/security/keystore/recovery/RecoveryController.java @@ -26,9 +26,13 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; +import android.security.KeyStore; +import android.security.keystore.AndroidKeyStoreProvider; import com.android.internal.widget.ILockSettings; +import java.security.Key; +import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; @@ -113,9 +117,11 @@ public class RecoveryController { private final ILockSettings mBinder; + private final KeyStore mKeyStore; - private RecoveryController(ILockSettings binder) { + private RecoveryController(ILockSettings binder, KeyStore keystore) { mBinder = binder; + mKeyStore = keystore; } /** @@ -133,7 +139,7 @@ public class RecoveryController { public static RecoveryController getInstance(Context context) { ILockSettings lockSettings = ILockSettings.Stub.asInterface(ServiceManager.getService("lock_settings")); - return new RecoveryController(lockSettings); + return new RecoveryController(lockSettings, KeyStore.getInstance()); } /** @@ -430,6 +436,7 @@ public class RecoveryController { } /** + * Deprecated. * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable * key store. Returns the raw material of the key. * @@ -444,7 +451,6 @@ public class RecoveryController { public byte[] generateAndStoreKey(@NonNull String alias, byte[] account) throws InternalRecoveryServiceException, LockScreenRequiredException { try { - // TODO: add account return mBinder.generateAndStoreKey(alias); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -457,6 +463,72 @@ public class RecoveryController { } /** + * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable + * key store. Returns {@link javax.crypto.SecretKey}. + * + * @param alias The key alias. + * @param account The account associated with the key. + * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery + * service. + * @throws LockScreenRequiredException if the user has not set a lock screen. This is required + * to generate recoverable keys, as the snapshots are encrypted using a key derived from the + * lock screen. + * @hide + */ + public Key generateKey(@NonNull String alias, byte[] account) + throws InternalRecoveryServiceException, LockScreenRequiredException { + // TODO: update RecoverySession.recoverKeys + try { + String grantAlias = mBinder.generateKey(alias, account); + if (grantAlias == null) { + return null; + } + Key result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore( + mKeyStore, + grantAlias, + KeyStore.UID_SELF); + return result; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (UnrecoverableKeyException e) { + throw new InternalRecoveryServiceException("Access to newly generated key failed for"); + } catch (ServiceSpecificException e) { + if (e.errorCode == ERROR_INSECURE_USER) { + throw new LockScreenRequiredException(e.getMessage()); + } + throw wrapUnexpectedServiceSpecificException(e); + } + } + + /** + * Gets a key called {@code alias} from the recoverable key store. + * + * @param alias The key alias. + * @return The key. + * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery + * service. + * @throws UnrecoverableKeyException if key is permanently invalidated or not found. + * @hide + */ + public @Nullable Key getKey(@NonNull String alias) + throws InternalRecoveryServiceException, UnrecoverableKeyException { + try { + String grantAlias = mBinder.getKey(alias); + if (grantAlias == null) { + return null; + } + return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore( + mKeyStore, + grantAlias, + KeyStore.UID_SELF); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (ServiceSpecificException e) { + throw wrapUnexpectedServiceSpecificException(e); + } + } + + /** * Removes a key called {@code alias} from the recoverable key store. * * @param alias The key alias. diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index 12aa64e4ecb7..7a304c7f55d2 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -490,8 +490,45 @@ import com.android.internal.os.SomeArgs; * strong suspicious that it could. For example, if an activity has four or more fields and one of * them is a list, chances are that these are address fields (like address, city, state, and * zip code). + * + * <a name="CompatibilityMode"></a> + * <h3>Compatibility mode</h3> + * + * <p>Apps that use standard Android widgets support autofill out-of-the-box and need to do + * very little to improve their user experience (annotating autofillable views and providing + * autofill hints). However, some apps do their own rendering and the rendered content may + * contain semantic structure that needs to be surfaced to the autofill framework. The platform + * exposes APIs to achieve this, however it could take some time until these apps implement + * autofill support. + * + * <p>To enable autofill for such apps the platform provides a compatibility mode in which the + * platform would fall back to the accessibility APIs to generate the state reported to autofill + * services and fill data. This mode needs to be explicitly requested for a given package up + * to a specified max version code allowing clean migration path when the target app begins to + * support autofill natively. Note that enabling compatibility may degrade performance for the + * target package and should be used with caution. The platform supports whitelisting which packages + * can be targeted in compatibility mode to ensure this mode is used only when needed and as long + * as needed. + * + * <p>You can request compatibility mode for packages of interest in the meta-data resource + * associated with your service. Below is a sample service declaration: + * + * <pre> <service android:name=".MyAutofillService" + * android:permission="android.permission.BIND_AUTOFILL_SERVICE"> + * <intent-filter> + * <action android:name="android.service.autofill.AutofillService" /> + * </intent-filter> + * <meta-data android:name="android.autofillservice" android:resource="@xml/autofillservice" /> + * </service></pre> + * + * <P>In the XML file you can specify one or more packages for which to enable compatibility + * mode. Below is a sample meta-data declaration: + * + * <pre> <autofill-service xmlns:android="http://schemas.android.com/apk/res/android"> + * <compatibility-package android:name="foo.bar.baz" android:maxLongVersionCode="1000000000"/> + * </autofill-service></pre> */ -// TODO(b/70407264): add code snippets above??? +// TODO(b/70407264): add code snippets to field classification ??? public abstract class AutofillService extends Service { private static final String TAG = "AutofillService"; diff --git a/core/java/android/service/autofill/AutofillServiceInfo.java b/core/java/android/service/autofill/AutofillServiceInfo.java index 4f2f6cb36d87..29c6cea14980 100644 --- a/core/java/android/service/autofill/AutofillServiceInfo.java +++ b/core/java/android/service/autofill/AutofillServiceInfo.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; import android.content.ComponentName; +import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.ServiceInfo; import android.content.res.Resources; @@ -27,6 +28,8 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.metrics.LogMaker; import android.os.RemoteException; +import android.text.TextUtils; +import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; import android.util.Xml; @@ -35,11 +38,13 @@ import com.android.internal.R; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.util.XmlUtils; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; - import java.io.IOException; +import java.util.Map; /** * {@link ServiceInfo} and meta-data about an {@link AutofillService}. @@ -49,6 +54,9 @@ import java.io.IOException; public final class AutofillServiceInfo { private static final String TAG = "AutofillServiceInfo"; + private static final String TAG_AUTOFILL_SERVICE = "autofill-service"; + private static final String TAG_COMPATIBILITY_PACKAGE = "compatibility-package"; + private static ServiceInfo getServiceInfoOrThrow(ComponentName comp, int userHandle) throws PackageManager.NameNotFoundException { try { @@ -70,29 +78,15 @@ public final class AutofillServiceInfo { @Nullable private final String mSettingsActivity; - public AutofillServiceInfo(PackageManager pm, ComponentName comp, int userHandle) - throws PackageManager.NameNotFoundException { - this(pm, getServiceInfoOrThrow(comp, userHandle)); - } + @Nullable + private final Map<String, Long> mCompatibilityPackages; - public AutofillServiceInfo(PackageManager pm, ServiceInfo si) { - mServiceInfo = si; - final TypedArray metaDataArray = getMetaDataArray(pm, si); - if (metaDataArray != null) { - mSettingsActivity = metaDataArray - .getString(R.styleable.AutofillService_settingsActivity); - metaDataArray.recycle(); - } else { - mSettingsActivity = null; - } + public AutofillServiceInfo(Context context, ComponentName comp, int userHandle) + throws PackageManager.NameNotFoundException { + this(context, getServiceInfoOrThrow(comp, userHandle)); } - /** - * Gets the meta-data as a {@link TypedArray}, or {@code null} if not provided, - * or throws if invalid. - */ - @Nullable - private static TypedArray getMetaDataArray(PackageManager pm, ServiceInfo si) { + public AutofillServiceInfo(Context context, ServiceInfo si) { // Check for permissions. if (!Manifest.permission.BIND_AUTOFILL_SERVICE.equals(si.permission)) { if (Manifest.permission.BIND_AUTOFILL.equals(si.permission)) { @@ -111,45 +105,115 @@ public final class AutofillServiceInfo { } } + mServiceInfo = si; + // Get the AutoFill metadata, if declared. - XmlResourceParser parser = si.loadXmlMetaData(pm, AutofillService.SERVICE_META_DATA); + final XmlResourceParser parser = si.loadXmlMetaData(context.getPackageManager(), + AutofillService.SERVICE_META_DATA); if (parser == null) { - return null; + mSettingsActivity = null; + mCompatibilityPackages = null; + return; } - // Parse service info and get the <autofill-service> tag as an AttributeSet. - AttributeSet attrs; + String settingsActivity = null; + Map<String, Long> compatibilityPackages = null; + try { - // Move the XML parser to the first tag. - try { - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && type != XmlPullParser.START_TAG) { - } - } catch (XmlPullParserException | IOException e) { - Log.e(TAG, "Error parsing auto fill service meta-data", e); - return null; + final Resources resources = context.getPackageManager().getResourcesForApplication( + si.applicationInfo); + + int type = 0; + while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { + type = parser.next(); } - if (!"autofill-service".equals(parser.getName())) { + if (TAG_AUTOFILL_SERVICE.equals(parser.getName())) { + final AttributeSet allAttributes = Xml.asAttributeSet(parser); + TypedArray afsAttributes = null; + try { + afsAttributes = resources.obtainAttributes(allAttributes, + com.android.internal.R.styleable.AutofillService); + settingsActivity = afsAttributes.getString( + R.styleable.AutofillService_settingsActivity); + } finally { + if (afsAttributes != null) { + afsAttributes.recycle(); + } + } + compatibilityPackages = parseCompatibilityPackages(parser, resources); + } else { Log.e(TAG, "Meta-data does not start with autofill-service tag"); - return null; } - attrs = Xml.asAttributeSet(parser); - - // Get resources required to read the AttributeSet. - Resources res; - try { - res = pm.getResourcesForApplication(si.applicationInfo); - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, "Error getting application resources", e); - return null; + } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) { + Log.e(TAG, "Error parsing auto fill service meta-data", e); + } + + mSettingsActivity = settingsActivity; + mCompatibilityPackages = compatibilityPackages; + } + + private Map<String, Long> parseCompatibilityPackages(XmlPullParser parser, Resources resources) + throws IOException, XmlPullParserException { + Map<String, Long> compatibilityPackages = null; + + final int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; } - return res.obtainAttributes(attrs, R.styleable.AutofillService); - } finally { - parser.close(); + if (TAG_COMPATIBILITY_PACKAGE.equals(parser.getName())) { + TypedArray cpAttributes = null; + try { + final AttributeSet allAttributes = Xml.asAttributeSet(parser); + + cpAttributes = resources.obtainAttributes(allAttributes, + R.styleable.AutofillService_CompatibilityPackage); + + final String name = cpAttributes.getString( + R.styleable.AutofillService_CompatibilityPackage_name); + if (TextUtils.isEmpty(name)) { + Log.e(TAG, "Invalid compatibility package:" + name); + break; + } + + final String maxVersionCodeStr = cpAttributes.getString( + R.styleable.AutofillService_CompatibilityPackage_maxLongVersionCode); + final Long maxVersionCode; + if (maxVersionCodeStr != null) { + try { + maxVersionCode = Long.parseLong(maxVersionCodeStr); + } catch (NumberFormatException e) { + Log.e(TAG, "Invalid compatibility max version code:" + + maxVersionCodeStr); + break; + } + if (maxVersionCode < 0) { + Log.e(TAG, "Invalid compatibility max version code:" + + maxVersionCode); + break; + } + } else { + maxVersionCode = Long.MAX_VALUE; + } + + if (compatibilityPackages == null) { + compatibilityPackages = new ArrayMap<>(); + } + compatibilityPackages.put(name, maxVersionCode); + } finally { + XmlUtils.skipCurrentTag(parser); + if (cpAttributes != null) { + cpAttributes.recycle(); + } + } + } } + + return compatibilityPackages; } public ServiceInfo getServiceInfo() { @@ -161,8 +225,26 @@ public final class AutofillServiceInfo { return mSettingsActivity; } + @Nullable + public boolean isCompatibilityModeRequested(String packageName, long versionCode) { + if (mCompatibilityPackages == null) { + return false; + } + final Long maxVersionCode = mCompatibilityPackages.get(packageName); + if (maxVersionCode == null) { + return false; + } + return versionCode <= maxVersionCode; + } + @Override public String toString() { - return mServiceInfo == null ? "null" : mServiceInfo.toString(); + final StringBuilder builder = new StringBuilder(); + builder.append(getClass().getSimpleName()); + builder.append("[").append(mServiceInfo); + builder.append(", settings:").append(mSettingsActivity); + builder.append(", hasCompatPckgs:").append(mCompatibilityPackages != null + && !mCompatibilityPackages.isEmpty()).append("]"); + return builder.toString(); } } diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 23ae4b96810f..d66322c3aa89 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -17,6 +17,7 @@ package android.service.notification; import android.app.ActivityManager; +import android.app.AlarmManager; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.ComponentName; @@ -1445,4 +1446,99 @@ public class ZenModeConfig implements Parcelable { return !config.allowAlarms && !config.allowMediaSystemOther && areAllPriorityOnlyNotificationZenSoundsMuted(config); } + + /** + * Returns a description of the current do not disturb settings from config. + * - If turned on manually and end time is known, returns end time. + * - If turned on by an automatic rule, returns the automatic rule name. + * - If on due to an app, returns the app name. + * - If there's a combination of rules/apps that trigger, then shows the one that will + * last the longest if applicable. + * @return null if do not disturb is off. + */ + public static String getDescription(Context context, boolean zenOn, ZenModeConfig config) { + if (!zenOn) { + return null; + } + + String secondaryText = ""; + long latestEndTime = -1; + + // DND turned on by manual rule + if (config.manualRule != null) { + final Uri id = config.manualRule.conditionId; + if (config.manualRule.enabler != null) { + // app triggered manual rule + String appName = getOwnerCaption(context, config.manualRule.enabler); + if (!appName.isEmpty()) { + secondaryText = appName; + } + } else { + if (id == null) { + // Do not disturb manually triggered to remain on forever until turned off + // No subtext + return null; + } else { + latestEndTime = tryParseCountdownConditionId(id); + if (latestEndTime > 0) { + final CharSequence formattedTime = getFormattedTime(context, + latestEndTime, isToday(latestEndTime), + context.getUserId()); + secondaryText = context.getString(R.string.zen_mode_until, formattedTime); + } + } + } + } + + // DND turned on by an automatic rule + for (ZenRule automaticRule : config.automaticRules.values()) { + if (automaticRule.isAutomaticActive()) { + if (isValidEventConditionId(automaticRule.conditionId) + || isValidScheduleConditionId(automaticRule.conditionId)) { + // set text if automatic rule end time is the latest active rule end time + long endTime = parseAutomaticRuleEndTime(context, automaticRule.conditionId); + if (endTime > latestEndTime) { + latestEndTime = endTime; + secondaryText = automaticRule.name; + } + } else { + // set text if 3rd party rule + return automaticRule.name; + } + } + } + + return !secondaryText.equals("") ? secondaryText : null; + } + + private static long parseAutomaticRuleEndTime(Context context, Uri id) { + if (isValidEventConditionId(id)) { + // cannot look up end times for events + return Long.MAX_VALUE; + } + + if (isValidScheduleConditionId(id)) { + ScheduleCalendar schedule = toScheduleCalendar(id); + long endTimeMs = schedule.getNextChangeTime(System.currentTimeMillis()); + + // check if automatic rule will end on next alarm + if (schedule.exitAtAlarm()) { + long nextAlarm = getNextAlarm(context); + schedule.maybeSetNextAlarm(System.currentTimeMillis(), nextAlarm); + if (schedule.shouldExitForAlarm(endTimeMs)) { + return nextAlarm; + } + } + + return endTimeMs; + } + + return -1; + } + + private static long getNextAlarm(Context context) { + final AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + final AlarmManager.AlarmClockInfo info = alarms.getNextAlarmClock(context.getUserId()); + return info != null ? info.getTriggerTime() : 0; + } } diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 413cd1035618..eba9129e81be 100755 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -166,7 +166,7 @@ public class DateFormat { * @return true if 24 hour time format is selected, false otherwise. */ public static boolean is24HourFormat(Context context) { - return is24HourFormat(context, UserHandle.myUserId()); + return is24HourFormat(context, context.getUserId()); } /** @@ -270,7 +270,7 @@ public class DateFormat { * @hide */ public static String getTimeFormatString(Context context) { - return getTimeFormatString(context, UserHandle.myUserId()); + return getTimeFormatString(context, context.getUserId()); } /** diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index b7099b642e98..13de172c811c 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -120,6 +120,14 @@ public class DisplayMetrics { public static final int DENSITY_420 = 420; /** + * Intermediate density for screens that sit somewhere between + * {@link #DENSITY_XHIGH} (320 dpi) and {@link #DENSITY_XXHIGH} (480 dpi). + * This is not a density that applications should target, instead relying + * on the system to scale their {@link #DENSITY_XXHIGH} assets for them. + */ + public static final int DENSITY_440 = 440; + + /** * Standard quantized DPI for extra-extra-high-density screens. */ public static final int DENSITY_XXHIGH = 480; diff --git a/core/java/android/util/apk/ApkVerityBuilder.java b/core/java/android/util/apk/ApkVerityBuilder.java index 4c6e511ede46..a3eeb275064a 100644 --- a/core/java/android/util/apk/ApkVerityBuilder.java +++ b/core/java/android/util/apk/ApkVerityBuilder.java @@ -106,18 +106,22 @@ abstract class ApkVerityBuilder { calculateFsveritySignatureInternal(apk, signatureInfo, null, null, header, extensions); MessageDigest md = MessageDigest.getInstance(JCA_DIGEST_ALGORITHM); - md.update(DEFAULT_SALT); - md.update(verityBlock); + md.update(header); + md.update(extensions); md.update(apkDigest); return md.digest(); } + /** + * Internal method to generate various parts of FSVerity constructs, including the header, + * extensions, Merkle tree, and the tree's root hash. The output buffer is flipped to the + * generated data size and is readey for consuming. + */ private static void calculateFsveritySignatureInternal( RandomAccessFile apk, SignatureInfo signatureInfo, ByteBuffer treeOutput, ByteBuffer rootHashOutput, ByteBuffer headerOutput, ByteBuffer extensionsOutput) throws IOException, NoSuchAlgorithmException, DigestException { assertSigningBlockAlignedAndHasFullPages(signatureInfo); - long signingBlockSize = signatureInfo.centralDirOffset - signatureInfo.apkSigningBlockOffset; long dataSize = apk.length() - signingBlockSize - ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE; @@ -128,6 +132,7 @@ abstract class ApkVerityBuilder { levelOffset, treeOutput); if (rootHashOutput != null) { rootHashOutput.put(apkRootHash); + rootHashOutput.flip(); } } @@ -333,9 +338,9 @@ abstract class ApkVerityBuilder { buffer.put((byte) 0); // auth block offset, disabled here buffer.put((byte) 2); // extension count buffer.put(salt); // salt (8 bytes) - // skip(buffer, 22); // reserved + skip(buffer, 22); // reserved - buffer.rewind(); + buffer.flip(); return buffer; } @@ -396,12 +401,10 @@ abstract class ApkVerityBuilder { buffer.put((byte) ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE); // length skip(buffer, 7); // reserved buffer.putInt(Math.toIntExact(signingBlockOffset)); // databytes - - // There are extra kPadding bytes of 0s here, included in the total size field of the - // extension header. The output ByteBuffer is assumed to be initialized to 0. + skip(buffer, kPadding); // padding } - buffer.rewind(); + buffer.flip(); return buffer; } diff --git a/core/java/android/view/PointerIcon.java b/core/java/android/view/PointerIcon.java index 3fd469630db0..8cb46b704c18 100644 --- a/core/java/android/view/PointerIcon.java +++ b/core/java/android/view/PointerIcon.java @@ -23,6 +23,10 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -396,6 +400,33 @@ public final class PointerIcon implements Parcelable { return true; } + /** + * Get the Bitmap from the Drawable. + * + * If the Bitmap needed to be scaled up to account for density, BitmapDrawable + * handles this at draw time. But this class doesn't actually draw the Bitmap; + * it is just a holder for native code to access its SkBitmap. So this needs to + * get a version that is scaled to account for density. + */ + private Bitmap getBitmapFromDrawable(BitmapDrawable bitmapDrawable) { + Bitmap bitmap = bitmapDrawable.getBitmap(); + final int scaledWidth = bitmapDrawable.getIntrinsicWidth(); + final int scaledHeight = bitmapDrawable.getIntrinsicHeight(); + if (scaledWidth == bitmap.getWidth() && scaledHeight == bitmap.getHeight()) { + return bitmap; + } + + Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); + RectF dst = new RectF(0, 0, scaledWidth, scaledHeight); + + Bitmap scaled = Bitmap.createBitmap(scaledWidth, scaledHeight, bitmap.getConfig()); + Canvas canvas = new Canvas(scaled); + Paint paint = new Paint(); + paint.setFilterBitmap(true); + canvas.drawBitmap(bitmap, src, dst, paint); + return scaled; + } + private void loadResource(Context context, Resources resources, @XmlRes int resourceId) { final XmlResourceParser parser = resources.getXml(resourceId); final int bitmapRes; @@ -452,7 +483,8 @@ public final class PointerIcon implements Parcelable { + "is different. All frames should have the exact same size and " + "share the same hotspot."); } - mBitmapFrames[i - 1] = ((BitmapDrawable)drawableFrame).getBitmap(); + BitmapDrawable bitmapDrawableFrame = (BitmapDrawable) drawableFrame; + mBitmapFrames[i - 1] = getBitmapFromDrawable(bitmapDrawableFrame); } } } @@ -461,7 +493,8 @@ public final class PointerIcon implements Parcelable { + "refer to a bitmap drawable."); } - final Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); + BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; + final Bitmap bitmap = getBitmapFromDrawable(bitmapDrawable); validateHotSpot(bitmap, hotSpotX, hotSpotY); // Set the properties now that we have successfully loaded the icon. mBitmap = bitmap; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 3cbd2754c9ce..79fc13424bee 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -74,6 +74,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Trace; +import android.text.InputType; import android.text.TextUtils; import android.util.AttributeSet; import android.util.FloatProperty; @@ -7940,12 +7941,22 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * optimal implementation providing this data. */ public void onProvideVirtualStructure(ViewStructure structure) { - AccessibilityNodeProvider provider = getAccessibilityNodeProvider(); + onProvideVirtualStructureCompat(structure, false); + } + + /** + * Fallback implementation to populate a ViewStructure from accessibility state. + * + * @param structure The structure to populate. + * @param forAutofill Whether the structure is needed for autofill. + */ + private void onProvideVirtualStructureCompat(ViewStructure structure, boolean forAutofill) { + final AccessibilityNodeProvider provider = getAccessibilityNodeProvider(); if (provider != null) { - AccessibilityNodeInfo info = createAccessibilityNodeInfo(); + final AccessibilityNodeInfo info = createAccessibilityNodeInfo(); structure.setChildCount(1); - ViewStructure root = structure.newChild(0); - populateVirtualStructure(root, provider, info); + final ViewStructure root = structure.newChild(0); + populateVirtualStructure(root, provider, info, forAutofill); info.recycle(); } } @@ -7974,6 +7985,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * <li>Call {@link android.view.autofill.AutofillManager#notifyViewEntered(View, int, Rect)} * and/or {@link android.view.autofill.AutofillManager#notifyViewExited(View, int)} * when the focused virtual child changed. + * <li>Override {@link #isVisibleToUserForAutofill(int)} to allow the platform to query + * whether a given virtual view is visible to the user in order to support triggering + * save when all views of interest go away. * <li>Call * {@link android.view.autofill.AutofillManager#notifyValueChanged(View, int, AutofillValue)} * when the value of a virtual child changed. @@ -8009,6 +8023,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @see #AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS */ public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) { + if (mContext.isAutofillCompatibilityEnabled()) { + onProvideVirtualStructureCompat(structure, true); + } } /** @@ -8086,6 +8103,25 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @attr ref android.R.styleable#Theme_autofilledHighlight */ public void autofill(@NonNull @SuppressWarnings("unused") SparseArray<AutofillValue> values) { + if (!mContext.isAutofillCompatibilityEnabled()) { + return; + } + final AccessibilityNodeProvider provider = getAccessibilityNodeProvider(); + if (provider == null) { + return; + } + final int valueCount = values.size(); + for (int i = 0; i < valueCount; i++) { + final AutofillValue value = values.valueAt(i); + if (value.isText()) { + final int virtualId = values.keyAt(i); + final CharSequence text = value.getTextValue(); + final Bundle arguments = new Bundle(); + arguments.putCharSequence( + AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text); + provider.performAction(virtualId, AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); + } + } } /** @@ -8339,7 +8375,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private void populateVirtualStructure(ViewStructure structure, - AccessibilityNodeProvider provider, AccessibilityNodeInfo info) { + AccessibilityNodeProvider provider, AccessibilityNodeInfo info, + boolean forAutofill) { structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()), null, null, null); Rect rect = structure.getTempRect(); @@ -8374,21 +8411,43 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if (info.isContextClickable()) { structure.setContextClickable(true); } + if (forAutofill) { + structure.setAutofillId(new AutofillId(getAutofillId(), + AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()))); + } CharSequence cname = info.getClassName(); structure.setClassName(cname != null ? cname.toString() : null); structure.setContentDescription(info.getContentDescription()); if ((info.getText() != null || info.getError() != null)) { structure.setText(info.getText(), info.getTextSelectionStart(), info.getTextSelectionEnd()); + if (forAutofill) { + if (info.isEditable()) { + structure.setDataIsSensitive(true); + structure.setAutofillType(AUTOFILL_TYPE_TEXT); + final AutofillValue autofillValue = AutofillValue.forText(structure.getText()); + structure.setAutofillValue(autofillValue); + if (info.isPassword()) { + structure.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); + } + } else { + structure.setDataIsSensitive(false); + } + } } final int NCHILDREN = info.getChildCount(); if (NCHILDREN > 0) { structure.setChildCount(NCHILDREN); for (int i=0; i<NCHILDREN; i++) { + if (AccessibilityNodeInfo.getVirtualDescendantId(info.getChildNodeIds().get(i)) + == AccessibilityNodeProvider.HOST_VIEW_ID) { + Log.e(VIEW_LOG_TAG, "Virtual view pointing to its host. Ignoring"); + continue; + } AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo( AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i))); ViewStructure child = structure.newChild(i); - populateVirtualStructure(child, provider, cinfo); + populateVirtualStructure(child, provider, cinfo, forAutofill); cinfo.recycle(); } } @@ -8717,6 +8776,24 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Computes whether this virtual autofill view is visible to the user. + * + * @return Whether the view is visible on the screen. + */ + public boolean isVisibleToUserForAutofill(int virtualId) { + if (mContext.isAutofillCompatibilityEnabled()) { + final AccessibilityNodeProvider provider = getAccessibilityNodeProvider(); + if (provider != null) { + final AccessibilityNodeInfo node = provider.createAccessibilityNodeInfo(virtualId); + if (node != null) { + return node.isVisibleToUser(); + } + } + } + return false; + } + + /** * Computes whether this view is visible to the user. Such a view is * attached, visible, all its predecessors are visible, it is not clipped * entirely by its predecessors, and has an alpha greater than zero. @@ -8725,7 +8802,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @hide */ - protected boolean isVisibleToUser() { + public boolean isVisibleToUser() { return isVisibleToUser(null); } @@ -23689,9 +23766,16 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Point shadowTouchPoint = new Point(); shadowBuilder.onProvideShadowMetrics(shadowSize, shadowTouchPoint); - if ((shadowSize.x <= 0) || (shadowSize.y <= 0) + if ((shadowSize.x < 0) || (shadowSize.y < 0) || (shadowTouchPoint.x < 0) || (shadowTouchPoint.y < 0)) { - throw new IllegalStateException("Drag shadow dimensions must be positive"); + throw new IllegalStateException("Drag shadow dimensions must not be negative"); + } + + // Create 1x1 surface when zero surface size is specified because SurfaceControl.Builder + // does not accept zero size surface. + if (shadowSize.x == 0 || shadowSize.y == 0) { + shadowSize.x = 1; + shadowSize.y = 1; } if (ViewDebug.DEBUG_DRAG) { diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index a8bdb85660d0..273f097edc63 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3555,13 +3555,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager public void dispatchProvideAutofillStructure(ViewStructure structure, @AutofillFlags int flags) { super.dispatchProvideAutofillStructure(structure, flags); + if (structure.getChildCount() != 0) { return; } if (!isLaidOut()) { - Log.v(VIEW_LOG_TAG, "dispatchProvideAutofillStructure(): not laid out, ignoring " - + mChildrenCount + " children of " + getAutofillId()); + if (Helper.sVerbose) { + Log.v(VIEW_LOG_TAG, "dispatchProvideAutofillStructure(): not laid out, ignoring " + + mChildrenCount + " children of " + getAutofillId()); + } return; } @@ -5120,6 +5123,20 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager // manually assembling the hierarchy, update the ancestor default-focus chain. setDefaultFocus(child); } + + touchAccessibilityNodeProviderIfNeeded(child); + } + + /** + * We may need to touch the provider to bring up the a11y layer. In a11y mode + * clients inspect the screen or the user touches it which triggers bringing up + * of the a11y infrastructure while in autofill mode we want the infra up and + * running from the beginning since we watch for a11y events to drive autofill. + */ + private void touchAccessibilityNodeProviderIfNeeded(View child) { + if (mContext.isAutofillCompatibilityEnabled()) { + child.getAccessibilityNodeProvider(); + } } private void addInArray(View child, int index) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7bd197e824db..810864eaac3c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -71,6 +71,7 @@ import android.os.Trace; import android.util.AndroidRuntimeException; import android.util.DisplayMetrics; import android.util.Log; +import android.util.LongArray; import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; @@ -114,6 +115,8 @@ import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedList; +import java.util.Queue; import java.util.concurrent.CountDownLatch; /** @@ -2569,6 +2572,10 @@ public final class ViewRootImpl implements ViewParent, ~WindowManager.LayoutParams .SOFT_INPUT_IS_FORWARD_NAVIGATION; mHasHadWindowFocus = true; + + // Refocusing a window that has a focused view should fire a + // focus event for the view since the global focused view changed. + fireAccessibilityFocusEventIfHasFocusedNode(); } else { if (mPointerCapture) { handlePointerCaptureChanged(false); @@ -2578,6 +2585,86 @@ public final class ViewRootImpl implements ViewParent, mFirstInputStage.onWindowFocusChanged(hasWindowFocus); } + private void fireAccessibilityFocusEventIfHasFocusedNode() { + if (!AccessibilityManager.getInstance(mContext).isEnabled()) { + return; + } + final View focusedView = mView.findFocus(); + if (focusedView == null) { + return; + } + final AccessibilityNodeProvider provider = focusedView.getAccessibilityNodeProvider(); + if (provider == null) { + focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); + } else { + final AccessibilityNodeInfo focusedNode = findFocusedVirtualNode(provider); + if (focusedNode != null) { + final int virtualId = AccessibilityNodeInfo.getVirtualDescendantId( + focusedNode.getSourceNodeId()); + // This is a best effort since clearing and setting the focus via the + // provider APIs could have side effects. We don't have a provider API + // similar to that on View to ask a given event to be fired. + final AccessibilityEvent event = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_VIEW_FOCUSED); + event.setSource(focusedView, virtualId); + event.setPackageName(focusedNode.getPackageName()); + event.setChecked(focusedNode.isChecked()); + event.setContentDescription(focusedNode.getContentDescription()); + event.setPassword(focusedNode.isPassword()); + event.getText().add(focusedNode.getText()); + event.setEnabled(focusedNode.isEnabled()); + focusedView.getParent().requestSendAccessibilityEvent(focusedView, event); + focusedNode.recycle(); + } + } + } + + private AccessibilityNodeInfo findFocusedVirtualNode(AccessibilityNodeProvider provider) { + AccessibilityNodeInfo focusedNode = provider.findFocus( + AccessibilityNodeInfo.FOCUS_INPUT); + if (focusedNode != null) { + return focusedNode; + } + + if (!mContext.isAutofillCompatibilityEnabled()) { + return null; + } + + // Unfortunately some provider implementations don't properly + // implement AccessibilityNodeProvider#findFocus + AccessibilityNodeInfo current = provider.createAccessibilityNodeInfo( + AccessibilityNodeProvider.HOST_VIEW_ID); + if (current.isFocused()) { + return current; + } + + final Queue<AccessibilityNodeInfo> fringe = new LinkedList<>(); + fringe.offer(current); + + while (!fringe.isEmpty()) { + current = fringe.poll(); + final LongArray childNodeIds = current.getChildNodeIds(); + if (childNodeIds== null || childNodeIds.size() <= 0) { + continue; + } + final int childCount = childNodeIds.size(); + for (int i = 0; i < childCount; i++) { + final int virtualId = AccessibilityNodeInfo.getVirtualDescendantId( + childNodeIds.get(i)); + final AccessibilityNodeInfo child = provider.createAccessibilityNodeInfo(virtualId); + if (child != null) { + if (child.isFocused()) { + return child; + } + fringe.offer(child); + } + } + current.recycle(); + } + + return null; + } + private void handleOutOfResourcesException(Surface.OutOfResourcesException e) { Log.e(mTag, "OutOfResourcesException initializing HW surface", e); try { diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index b4499d1acac3..191c27073782 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -16,10 +16,9 @@ package android.view.accessibility; -import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME; - import android.Manifest; import android.accessibilityservice.AccessibilityServiceInfo; +import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; @@ -44,7 +43,7 @@ import android.util.Log; import android.util.SparseArray; import android.view.IWindow; import android.view.View; - +import android.view.accessibility.AccessibilityEvent.EventType; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IntPair; @@ -52,6 +51,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME; + /** * System level service that serves as an event dispatch for {@link AccessibilityEvent}s, * and provides facilities for querying the accessibility state of the system. @@ -132,6 +133,8 @@ public final class AccessibilityManager { boolean mIsHighTextContrastEnabled; + AccessibilityPolicy mAccessibilityPolicy; + private final ArrayMap<AccessibilityStateChangeListener, Handler> mAccessibilityStateChangeListeners = new ArrayMap<>(); @@ -215,6 +218,60 @@ public final class AccessibilityManager { void onHighTextContrastStateChanged(boolean enabled); } + /** + * Policy to inject behavior into the accessibility manager. + * + * @hide + */ + public interface AccessibilityPolicy { + /** + * Checks whether accessibility is enabled. + * + * @param accessibilityEnabled Whether the accessibility layer is enabled. + * @return whether accessibility is enabled. + */ + boolean isEnabled(boolean accessibilityEnabled); + + /** + * Notifies the policy for an accessibility event. + * + * @param event The event. + * @param accessibilityEnabled Whether the accessibility layer is enabled. + * @param relevantEventTypes The events relevant events. + * @return The event to dispatch or null. + */ + @Nullable AccessibilityEvent onAccessibilityEvent(@NonNull AccessibilityEvent event, + boolean accessibilityEnabled, @EventType int relevantEventTypes); + + /** + * Gets the list of relevant events. + * + * @param relevantEventTypes The relevant events. + * @return The relevant events to report. + */ + @EventType int getRelevantEventTypes(@EventType int relevantEventTypes); + + /** + * Gets the list of installed services to report. + * + * @param installedService The installed services. + * @return The services to report. + */ + @NonNull List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList( + @Nullable List<AccessibilityServiceInfo> installedService); + + /** + * Gets the list of enabled accessibility services. + * + * @param feedbackTypeFlags The feedback type to query for. + * @param enabledService The enabled services. + * @return The services to report. + */ + @Nullable List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList( + @FeedbackType int feedbackTypeFlags, + @Nullable List<AccessibilityServiceInfo> enabledService); + } + private final IAccessibilityManagerClient.Stub mClient = new IAccessibilityManagerClient.Stub() { @Override @@ -273,7 +330,7 @@ public final class AccessibilityManager { == PackageManager.PERMISSION_GRANTED) { userId = UserHandle.USER_CURRENT; } else { - userId = UserHandle.myUserId(); + userId = context.getUserId(); } sInstance = new AccessibilityManager(context, null, userId); } @@ -341,11 +398,8 @@ public final class AccessibilityManager { */ public boolean isEnabled() { synchronized (mLock) { - IAccessibilityManager service = getServiceLocked(); - if (service == null) { - return false; - } - return mIsEnabled; + return mIsEnabled || (mAccessibilityPolicy != null + && mAccessibilityPolicy.isEnabled(mIsEnabled)); } } @@ -401,12 +455,23 @@ public final class AccessibilityManager { public void sendAccessibilityEvent(AccessibilityEvent event) { final IAccessibilityManager service; final int userId; + final AccessibilityEvent dispatchedEvent; synchronized (mLock) { service = getServiceLocked(); if (service == null) { return; } - if (!mIsEnabled) { + event.setEventTime(SystemClock.uptimeMillis()); + if (mAccessibilityPolicy != null) { + dispatchedEvent = mAccessibilityPolicy.onAccessibilityEvent(event, + mIsEnabled, mRelevantEventTypes); + if (dispatchedEvent == null) { + return; + } + } else { + dispatchedEvent = event; + } + if (!isEnabled()) { Looper myLooper = Looper.myLooper(); if (myLooper == Looper.getMainLooper()) { throw new IllegalStateException( @@ -420,9 +485,9 @@ public final class AccessibilityManager { return; } } - if ((event.getEventType() & mRelevantEventTypes) == 0) { + if ((dispatchedEvent.getEventType() & mRelevantEventTypes) == 0) { if (DEBUG) { - Log.i(LOG_TAG, "Not dispatching irrelevant event: " + event + Log.i(LOG_TAG, "Not dispatching irrelevant event: " + dispatchedEvent + " that is not among " + AccessibilityEvent.eventTypeToString(mRelevantEventTypes)); } @@ -431,23 +496,25 @@ public final class AccessibilityManager { userId = mUserId; } try { - event.setEventTime(SystemClock.uptimeMillis()); // it is possible that this manager is in the same process as the service but // client using it is called through Binder from another process. Example: MMS // app adds a SMS notification and the NotificationManagerService calls this method long identityToken = Binder.clearCallingIdentity(); try { - service.sendAccessibilityEvent(event, userId); + service.sendAccessibilityEvent(dispatchedEvent, userId); } finally { Binder.restoreCallingIdentity(identityToken); } if (DEBUG) { - Log.i(LOG_TAG, event + " sent"); + Log.i(LOG_TAG, dispatchedEvent + " sent"); } } catch (RemoteException re) { - Log.e(LOG_TAG, "Error during sending " + event + " ", re); + Log.e(LOG_TAG, "Error during sending " + dispatchedEvent + " ", re); } finally { - event.recycle(); + if (event != dispatchedEvent) { + event.recycle(); + } + dispatchedEvent.recycle(); } } @@ -462,7 +529,7 @@ public final class AccessibilityManager { if (service == null) { return; } - if (!mIsEnabled) { + if (!isEnabled()) { Looper myLooper = Looper.myLooper(); if (myLooper == Looper.getMainLooper()) { throw new IllegalStateException( @@ -532,6 +599,9 @@ public final class AccessibilityManager { } catch (RemoteException re) { Log.e(LOG_TAG, "Error while obtaining the installed AccessibilityServices. ", re); } + if (mAccessibilityPolicy != null) { + services = mAccessibilityPolicy.getInstalledAccessibilityServiceList(services); + } if (services != null) { return Collections.unmodifiableList(services); } else { @@ -574,6 +644,10 @@ public final class AccessibilityManager { } catch (RemoteException re) { Log.e(LOG_TAG, "Error while obtaining the installed AccessibilityServices. ", re); } + if (mAccessibilityPolicy != null) { + services = mAccessibilityPolicy.getEnabledAccessibilityServiceList( + feedbackTypeFlags, services); + } if (services != null) { return Collections.unmodifiableList(services); } else { @@ -783,6 +857,19 @@ public final class AccessibilityManager { } /** + * Sets the {@link AccessibilityPolicy} controlling this manager. + * + * @param policy The policy. + * + * @hide + */ + public void setAccessibilityPolicy(@Nullable AccessibilityPolicy policy) { + synchronized (mLock) { + mAccessibilityPolicy = policy; + } + } + + /** * Check if the accessibility volume stream is active. * * @return True if accessibility volume is active (i.e. some service has requested it). False @@ -834,7 +921,7 @@ public final class AccessibilityManager { final boolean highTextContrastEnabled = (stateFlags & STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED) != 0; - final boolean wasEnabled = mIsEnabled; + final boolean wasEnabled = isEnabled(); final boolean wasTouchExplorationEnabled = mIsTouchExplorationEnabled; final boolean wasHighTextContrastEnabled = mIsHighTextContrastEnabled; @@ -843,7 +930,7 @@ public final class AccessibilityManager { mIsTouchExplorationEnabled = touchExplorationEnabled; mIsHighTextContrastEnabled = highTextContrastEnabled; - if (wasEnabled != enabled) { + if (wasEnabled != isEnabled()) { notifyAccessibilityStateChanged(); } @@ -1052,16 +1139,15 @@ public final class AccessibilityManager { if (mAccessibilityStateChangeListeners.isEmpty()) { return; } - isEnabled = mIsEnabled; + isEnabled = isEnabled(); listeners = new ArrayMap<>(mAccessibilityStateChangeListeners); } - int numListeners = listeners.size(); + final int numListeners = listeners.size(); for (int i = 0; i < numListeners; i++) { - final AccessibilityStateChangeListener listener = - mAccessibilityStateChangeListeners.keyAt(i); - mAccessibilityStateChangeListeners.valueAt(i) - .post(() -> listener.onAccessibilityStateChanged(isEnabled)); + final AccessibilityStateChangeListener listener = listeners.keyAt(i); + listeners.valueAt(i).post(() -> + listener.onAccessibilityStateChanged(isEnabled)); } } @@ -1079,12 +1165,11 @@ public final class AccessibilityManager { listeners = new ArrayMap<>(mTouchExplorationStateChangeListeners); } - int numListeners = listeners.size(); + final int numListeners = listeners.size(); for (int i = 0; i < numListeners; i++) { - final TouchExplorationStateChangeListener listener = - mTouchExplorationStateChangeListeners.keyAt(i); - mTouchExplorationStateChangeListeners.valueAt(i) - .post(() -> listener.onTouchExplorationStateChanged(isTouchExplorationEnabled)); + final TouchExplorationStateChangeListener listener = listeners.keyAt(i); + listeners.valueAt(i).post(() -> + listener.onTouchExplorationStateChanged(isTouchExplorationEnabled)); } } @@ -1102,12 +1187,11 @@ public final class AccessibilityManager { listeners = new ArrayMap<>(mHighTextContrastStateChangeListeners); } - int numListeners = listeners.size(); + final int numListeners = listeners.size(); for (int i = 0; i < numListeners; i++) { - final HighTextContrastChangeListener listener = - mHighTextContrastStateChangeListeners.keyAt(i); - mHighTextContrastStateChangeListeners.valueAt(i) - .post(() -> listener.onHighTextContrastStateChanged(isHighTextContrastEnabled)); + final HighTextContrastChangeListener listener = listeners.keyAt(i); + listeners.valueAt(i).post(() -> + listener.onHighTextContrastStateChanged(isHighTextContrastEnabled)); } } diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index dac19987f9f2..63a9990cf839 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -16,10 +16,7 @@ package android.view.autofill; -import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; -import static android.view.autofill.Helper.sDebug; -import static android.view.autofill.Helper.sVerbose; - +import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -28,6 +25,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.graphics.Rect; import android.metrics.LogMaker; import android.os.Bundle; @@ -41,13 +40,22 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.SparseArray; +import android.view.Choreographer; import android.view.View; - +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeProvider; +import android.view.accessibility.AccessibilityWindowInfo; import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; +import org.xmlpull.v1.XmlPullParserException; +import sun.misc.Cleaner; +import java.io.IOException; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -58,8 +66,11 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; +import static android.view.autofill.Helper.sDebug; +import static android.view.autofill.Helper.sVerbose; + // TODO: use java.lang.ref.Cleaner once Android supports Java 9 -import sun.misc.Cleaner; /** * The {@link AutofillManager} provides ways for apps and custom views to integrate with the @@ -178,7 +189,6 @@ public final class AutofillManager { private static final String STATE_TAG = "android:state"; private static final String LAST_AUTOFILLED_DATA_TAG = "android:lastAutoFilledData"; - /** @hide */ public static final int ACTION_START_SESSION = 1; /** @hide */ public static final int ACTION_VIEW_ENTERED = 2; /** @hide */ public static final int ACTION_VIEW_EXITED = 3; @@ -355,6 +365,10 @@ public final class AutofillManager { @GuardedBy("mLock") private boolean mSaveOnFinish; + /** If compatibility mode is enabled - this is a bridge to interact with a11y */ + @GuardedBy("mLock") + private CompatibilityBridge mCompatibilityBridge; + /** @hide */ public interface AutofillClient { /** @@ -364,13 +378,13 @@ public final class AutofillManager { * @param intent The authentication intent. * @param fillInIntent The authentication fill-in intent. */ - void autofillCallbackAuthenticate(int authenticationId, IntentSender intent, + void autofillClientAuthenticate(int authenticationId, IntentSender intent, Intent fillInIntent); /** * Tells the client this manager has state to be reset. */ - void autofillCallbackResetableStateAvailable(); + void autofillClientResetableStateAvailable(); /** * Request showing the autofill UI. @@ -382,7 +396,7 @@ public final class AutofillManager { * @param presenter The presenter that controls the fill UI window. * @return Whether the UI was shown. */ - boolean autofillCallbackRequestShowFillUi(@NonNull View anchor, int width, int height, + boolean autofillClientRequestShowFillUi(@NonNull View anchor, int width, int height, @Nullable Rect virtualBounds, IAutofillWindowPresenter presenter); /** @@ -390,21 +404,28 @@ public final class AutofillManager { * * @return Whether the UI was hidden. */ - boolean autofillCallbackRequestHideFillUi(); + boolean autofillClientRequestHideFillUi(); + + /** + * Gets whether the fill UI is currenlty being shown. + * + * @return Whether the fill UI is currently being shown + */ + boolean autofillClientIsFillUiShowing(); /** * Checks if views are currently attached and visible. * * @return And array with {@code true} iff the view is attached or visible */ - @NonNull boolean[] getViewVisibility(@NonNull int[] viewId); + @NonNull boolean[] autofillClientGetViewVisibility(@NonNull AutofillId[] autofillIds); /** * Checks is the client is currently visible as understood by autofill. * * @return {@code true} if the client is currently visible */ - boolean isVisibleForAutofill(); + boolean autofillClientIsVisibleForAutofill(); /** * Client might disable enter/exit event e.g. when activity is paused. @@ -414,30 +435,51 @@ public final class AutofillManager { /** * Finds views by traversing the hierarchies of the client. * - * @param viewIds The autofill ids of the views to find + * @param autofillIds The autofill ids of the views to find * * @return And array containing the views (empty if no views found). */ - @NonNull View[] findViewsByAutofillIdTraversal(@NonNull int[] viewIds); + @NonNull View[] autofillClientFindViewsByAutofillIdTraversal( + @NonNull AutofillId[] autofillIds); /** * Finds a view by traversing the hierarchies of the client. * - * @param viewId The autofill id of the views to find + * @param autofillId The autofill id of the views to find + * + * @return The view, or {@code null} if not found + */ + @Nullable View autofillClientFindViewByAutofillIdTraversal(@NonNull AutofillId autofillId); + + /** + * Finds a view by a11y id in a given client window. + * + * @param viewId The accessibility id of the views to find + * @param windowId The accessibility window id where to search * * @return The view, or {@code null} if not found */ - @Nullable View findViewByAutofillIdTraversal(int viewId); + @Nullable View autofillClientFindViewByAccessibilityIdTraversal(int viewId, int windowId); /** * Runs the specified action on the UI thread. */ - void runOnUiThread(Runnable action); + void autofillClientRunOnUiThread(Runnable action); /** * Gets the complete component name of this client. */ - ComponentName getComponentName(); + ComponentName autofillClientGetComponentName(); + + /** + * Gets the activity token + */ + @Nullable IBinder autofillClientGetActivityToken(); + + /** + * @return Whether compatibility mode is enabled. + */ + boolean autofillIsCompatibilityModeEnabled(); } /** @@ -449,6 +491,19 @@ public final class AutofillManager { } /** + * @hide + */ + public void enableCompatibilityMode() { + synchronized (mLock) { + // The accessibility manager is a singleton so we may need to plug + // different bridge based on which activity is currently focused + // in the current process. Since compat would be rarely used, just + // create and register a new instance every time. + mCompatibilityBridge = new CompatibilityBridge(); + } + } + + /** * Restore state after activity lifecycle * * @param savedInstanceState The state to be restored @@ -477,7 +532,8 @@ public final class AutofillManager { if (client != null) { try { final boolean sessionWasRestored = mService.restoreSession(mSessionId, - mContext.getActivityToken(), mServiceClient.asBinder()); + client.autofillClientGetActivityToken(), + mServiceClient.asBinder()); if (!sessionWasRestored) { Log.w(TAG, "Session " + mSessionId + " could not be restored"); @@ -488,7 +544,7 @@ public final class AutofillManager { Log.d(TAG, "session " + mSessionId + " was restored"); } - client.autofillCallbackResetableStateAvailable(); + client.autofillClientResetableStateAvailable(); } } catch (RemoteException e) { Log.e(TAG, "Could not figure out if there was an autofill session", e); @@ -501,22 +557,29 @@ public final class AutofillManager { /** * Called once the client becomes visible. * - * @see AutofillClient#isVisibleForAutofill() + * @see AutofillClient#autofillClientIsVisibleForAutofill() * * {@hide} */ public void onVisibleForAutofill() { - synchronized (mLock) { - if (mEnabled && isActiveLocked() && mTrackedViews != null) { - mTrackedViews.onVisibleForAutofillLocked(); + // This gets called when the client just got visible at which point the visibility + // of the tracked views may not have been computed (due to a pending layout, etc). + // While generally we have no way to know when the UI has settled. We will evaluate + // the tracked views state at the end of next frame to guarantee that everything + // that may need to be laid out is laid out. + Choreographer.getInstance().postCallback(Choreographer.CALLBACK_COMMIT, () -> { + synchronized (mLock) { + if (mEnabled && isActiveLocked() && mTrackedViews != null) { + mTrackedViews.onVisibleForAutofillChangedLocked(); + } } - } + }, null); } /** * Called once the client becomes invisible. * - * @see AutofillClient#isVisibleForAutofill() + * @see AutofillClient#autofillClientIsVisibleForAutofill() * * {@hide} */ @@ -551,6 +614,15 @@ public final class AutofillManager { } /** + * @hide + */ + public boolean isCompatibilityModeEnabled() { + synchronized (mLock) { + return mCompatibilityBridge != null; + } + } + + /** * Checks whether autofill is enabled for the current user. * * <p>Typically used to determine whether the option to explicitly request autofill should @@ -653,7 +725,7 @@ public final class AutofillManager { private boolean isClientVisibleForAutofillLocked() { final AutofillClient client = getClient(); - return client != null && client.isVisibleForAutofill(); + return client != null && client.autofillClientIsVisibleForAutofill(); } private boolean isClientDisablingEnterExitEvent() { @@ -1322,13 +1394,13 @@ public final class AutofillManager { final AutofillClient client = getClient(); if (client == null) return; // NOTE: getClient() already logd it.. - mSessionId = mService.startSession(mContext.getActivityToken(), + mSessionId = mService.startSession(client.autofillClientGetActivityToken(), mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(), - mCallback != null, flags, client.getComponentName()); + mCallback != null, flags, client.autofillClientGetComponentName()); if (mSessionId != NO_SESSION) { mState = STATE_ACTIVE; } - client.autofillCallbackResetableStateAvailable(); + client.autofillClientResetableStateAvailable(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1383,14 +1455,16 @@ public final class AutofillManager { final AutofillClient client = getClient(); if (client == null) return; // NOTE: getClient() already logd it.. - final int newId = mService.updateOrRestartSession(mContext.getActivityToken(), + final int newId = mService.updateOrRestartSession( + client.autofillClientGetActivityToken(), mServiceClient.asBinder(), id, bounds, value, mContext.getUserId(), - mCallback != null, flags, client.getComponentName(), mSessionId, action); + mCallback != null, flags, client.autofillClientGetComponentName(), + mSessionId, action); if (newId != mSessionId) { if (sDebug) Log.d(TAG, "Session restarted: " + mSessionId + "=>" + newId); mSessionId = newId; mState = (mSessionId == NO_SESSION) ? STATE_UNKNOWN : STATE_ACTIVE; - client.autofillCallbackResetableStateAvailable(); + client.autofillClientResetableStateAvailable(); } } else { mService.updateSession(mSessionId, id, bounds, value, action, flags, @@ -1489,7 +1563,7 @@ public final class AutofillManager { AutofillClient client = getClient(); if (client != null) { - if (client.autofillCallbackRequestShowFillUi(anchor, width, height, + if (client.autofillClientRequestShowFillUi(anchor, width, height, anchorBounds, presenter) && mCallback != null) { callback = mCallback; } @@ -1516,7 +1590,7 @@ public final class AutofillManager { // clear mOnInvisibleCalled and we will see if receive onInvisibleForAutofill() // before onAuthenticationResult() mOnInvisibleCalled = false; - client.autofillCallbackAuthenticate(authenticationId, intent, fillInIntent); + client.autofillClientAuthenticate(authenticationId, intent, fillInIntent); } } } @@ -1587,7 +1661,8 @@ public final class AutofillManager { final int itemCount = ids.size(); int numApplied = 0; ArrayMap<View, SparseArray<AutofillValue>> virtualValues = null; - final View[] views = client.findViewsByAutofillIdTraversal(getViewIds(ids)); + final View[] views = client.autofillClientFindViewsByAutofillIdTraversal( + Helper.toArray(ids)); for (int i = 0; i < itemCount; i++) { final AutofillId id = ids.get(i); @@ -1758,7 +1833,7 @@ public final class AutofillManager { // service being uninstalled and the UI being dismissed. AutofillClient client = getClient(); if (client != null) { - if (client.autofillCallbackRequestHideFillUi() && mCallback != null) { + if (client.autofillClientRequestHideFillUi() && mCallback != null) { callback = mCallback; } } @@ -1807,35 +1882,6 @@ public final class AutofillManager { } /** - * Get an array of viewIds from a List of {@link AutofillId}. - * - * @param autofillIds The autofill ids to convert - * - * @return The array of viewIds. - */ - // TODO: move to Helper as static method - @NonNull private int[] getViewIds(@NonNull AutofillId[] autofillIds) { - final int numIds = autofillIds.length; - final int[] viewIds = new int[numIds]; - for (int i = 0; i < numIds; i++) { - viewIds[i] = autofillIds[i].getViewId(); - } - - return viewIds; - } - - // TODO: move to Helper as static method - @NonNull private int[] getViewIds(@NonNull List<AutofillId> autofillIds) { - final int numIds = autofillIds.size(); - final int[] viewIds = new int[numIds]; - for (int i = 0; i < numIds; i++) { - viewIds[i] = autofillIds.get(i).getViewId(); - } - - return viewIds; - } - - /** * Find a single view by its id. * * @param autofillId The autofill id of the view @@ -1844,12 +1890,10 @@ public final class AutofillManager { */ private View findView(@NonNull AutofillId autofillId) { final AutofillClient client = getClient(); - - if (client == null) { - return null; + if (client != null) { + return client.autofillClientFindViewByAutofillIdTraversal(autofillId); } - - return client.findViewByAutofillIdTraversal(autofillId.getViewId()); + return null; } /** @hide */ @@ -1895,6 +1939,7 @@ public final class AutofillManager { pw.print(pfx); pw.print("fillable ids: "); pw.println(mFillableIds); pw.print(pfx); pw.print("save trigger id: "); pw.println(mSaveTriggerId); pw.print(pfx); pw.print("save on finish(): "); pw.println(mSaveOnFinish); + pw.print(pfx); pw.print("compat mode enabled: "); pw.println(isCompatibilityModeEnabled()); pw.print(pfx); pw.print("debug: "); pw.print(sDebug); pw.print(" verbose: "); pw.println(sVerbose); } @@ -1934,7 +1979,218 @@ public final class AutofillManager { if (sVerbose) Log.v(TAG, "ignoring post() because client is null"); return; } - client.runOnUiThread(runnable); + client.autofillClientRunOnUiThread(runnable); + } + + /** + * Implementation of the accessibility based compatibility. + */ + private final class CompatibilityBridge implements AccessibilityManager.AccessibilityPolicy { + @GuardedBy("mLock") + private final Rect mFocusedBounds = new Rect(); + @GuardedBy("mLock") + private final Rect mTempBounds = new Rect(); + + @GuardedBy("mLock") + private int mFocusedWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID; + @GuardedBy("mLock") + private long mFocusedNodeId = AccessibilityNodeInfo.UNDEFINED_NODE_ID; + + // Need to report a fake service in case a11y clients check the service list + @NonNull + @GuardedBy("mLock") + AccessibilityServiceInfo mCompatServiceInfo; + + CompatibilityBridge() { + final AccessibilityManager am = AccessibilityManager.getInstance(mContext); + am.setAccessibilityPolicy(this); + } + + private AccessibilityServiceInfo getCompatServiceInfo() { + synchronized (mLock) { + if (mCompatServiceInfo != null) { + return mCompatServiceInfo; + } + final Intent intent = new Intent(); + intent.setComponent(new ComponentName("android", + "com.android.server.autofill.AutofillCompatAccessibilityService")); + final ResolveInfo resolveInfo = mContext.getPackageManager().resolveService( + intent, PackageManager.MATCH_SYSTEM_ONLY | PackageManager.GET_META_DATA); + try { + mCompatServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); + } catch (XmlPullParserException | IOException e) { + Log.e(TAG, "Cannot find compat autofill service:" + intent); + throw new IllegalStateException("Cannot find compat autofill service"); + } + return mCompatServiceInfo; + } + } + + @Override + public boolean isEnabled(boolean accessibilityEnabled) { + return true; + } + + @Override + public int getRelevantEventTypes(int relevantEventTypes) { + return relevantEventTypes | AccessibilityEvent.TYPE_VIEW_FOCUSED + | AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED + | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; + } + + @Override + public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList( + List<AccessibilityServiceInfo> installedServices) { + if (installedServices == null) { + installedServices = new ArrayList<>(); + } + installedServices.add(getCompatServiceInfo()); + return installedServices; + } + + @Override + public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList( + int feedbackTypeFlags, List<AccessibilityServiceInfo> enabledService) { + if (enabledService == null) { + enabledService = new ArrayList<>(); + } + enabledService.add(getCompatServiceInfo()); + return enabledService; + } + + @Override + public AccessibilityEvent onAccessibilityEvent(AccessibilityEvent event, + boolean accessibilityEnabled, int relevantEventTypes) { + switch (event.getEventType()) { + case AccessibilityEvent.TYPE_VIEW_FOCUSED: { + synchronized (mLock) { + if (mFocusedWindowId == event.getWindowId() + && mFocusedNodeId == event.getSourceNodeId()) { + return event; + } + if (mFocusedWindowId != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID + && mFocusedNodeId != AccessibilityNodeInfo.UNDEFINED_NODE_ID) { + notifyViewExited(mFocusedWindowId, mFocusedNodeId); + mFocusedWindowId = AccessibilityWindowInfo.UNDEFINED_WINDOW_ID; + mFocusedNodeId = AccessibilityNodeInfo.UNDEFINED_NODE_ID; + mFocusedBounds.set(0, 0, 0, 0); + } + final int windowId = event.getWindowId(); + final long nodeId = event.getSourceNodeId(); + if (notifyViewEntered(windowId, nodeId, mFocusedBounds)) { + mFocusedWindowId = windowId; + mFocusedNodeId = nodeId; + } + } + } break; + + case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: { + synchronized (mLock) { + if (mFocusedWindowId == event.getWindowId() + && mFocusedNodeId == event.getSourceNodeId()) { + notifyValueChanged(event.getWindowId(), event.getSourceNodeId()); + } + } + } break; + + case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED: { + final AutofillClient client = getClient(); + if (client != null) { + synchronized (mLock) { + if (client.autofillClientIsFillUiShowing()) { + notifyViewEntered(mFocusedWindowId, mFocusedNodeId, mFocusedBounds); + } + updateTrackedViewsLocked(); + } + } + } break; + } + + return accessibilityEnabled ? event : null; + } + + private boolean notifyViewEntered(int windowId, long nodeId, Rect focusedBounds) { + final int virtualId = AccessibilityNodeInfo.getVirtualDescendantId(nodeId); + if (!isVirtualNode(virtualId)) { + return false; + } + final View view = findViewByAccessibilityId(windowId, nodeId); + if (view == null) { + return false; + } + final AccessibilityNodeInfo node = findVirtualNodeByAccessibilityId(view, virtualId); + if (node == null) { + return false; + } + if (!node.isEditable()) { + return false; + } + final Rect newBounds = mTempBounds; + node.getBoundsInScreen(newBounds); + if (newBounds.equals(focusedBounds)) { + return false; + } + focusedBounds.set(newBounds); + AutofillManager.this.notifyViewEntered(view, virtualId, newBounds); + return true; + } + + private void notifyViewExited(int windowId, long nodeId) { + final int virtualId = AccessibilityNodeInfo.getVirtualDescendantId(nodeId); + if (!isVirtualNode(virtualId)) { + return; + } + final View view = findViewByAccessibilityId(windowId, nodeId); + if (view == null) { + return; + } + AutofillManager.this.notifyViewExited(view, virtualId); + } + + private void notifyValueChanged(int windowId, long nodeId) { + final int virtualId = AccessibilityNodeInfo.getVirtualDescendantId(nodeId); + if (!isVirtualNode(virtualId)) { + return; + } + final View view = findViewByAccessibilityId(windowId, nodeId); + if (view == null) { + return; + } + final AccessibilityNodeInfo node = findVirtualNodeByAccessibilityId(view, virtualId); + if (node == null) { + return; + } + AutofillManager.this.notifyValueChanged(view, virtualId, + AutofillValue.forText(node.getText())); + } + + private void updateTrackedViewsLocked() { + if (mTrackedViews != null) { + mTrackedViews.onVisibleForAutofillChangedLocked(); + } + } + + private View findViewByAccessibilityId(int windowId, long nodeId) { + final AutofillClient client = getClient(); + if (client == null) { + return null; + } + final int viewId = AccessibilityNodeInfo.getAccessibilityViewId(nodeId); + return client.autofillClientFindViewByAccessibilityIdTraversal(viewId, windowId); + } + + private AccessibilityNodeInfo findVirtualNodeByAccessibilityId(View view, int virtualId) { + final AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider(); + if (provider == null) { + return null; + } + return provider.createAccessibilityNodeInfo(virtualId); + } + + private boolean isVirtualNode(int nodeId) { + return nodeId != AccessibilityNodeProvider.HOST_VIEW_ID + && nodeId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID; + } } /** @@ -2013,11 +2269,11 @@ public final class AutofillManager { */ TrackedViews(@Nullable AutofillId[] trackedIds) { final AutofillClient client = getClient(); - if (trackedIds != null && client != null) { + if (!ArrayUtils.isEmpty(trackedIds) && client != null) { final boolean[] isVisible; - if (client.isVisibleForAutofill()) { - isVisible = client.getViewVisibility(getViewIds(trackedIds)); + if (client.autofillClientIsVisibleForAutofill()) { + isVisible = client.autofillClientGetViewVisibility(trackedIds); } else { // All false isVisible = new boolean[trackedIds.length]; @@ -2054,7 +2310,7 @@ public final class AutofillManager { */ void notifyViewVisibilityChangedLocked(@NonNull AutofillId id, boolean isVisible) { if (sDebug) { - Log.d(TAG, "notifyViewVisibilityChanged(): id=" + id + " isVisible=" + Log.d(TAG, "notifyViewVisibilityChangedLocked(): id=" + id + " isVisible=" + isVisible); } @@ -2083,9 +2339,9 @@ public final class AutofillManager { /** * Called once the client becomes visible. * - * @see AutofillClient#isVisibleForAutofill() + * @see AutofillClient#autofillClientIsVisibleForAutofill() */ - void onVisibleForAutofillLocked() { + void onVisibleForAutofillChangedLocked() { // The visibility of the views might have changed while the client was not be visible, // hence update the visibility state for all views. AutofillClient client = getClient(); @@ -2095,8 +2351,8 @@ public final class AutofillManager { if (mInvisibleTrackedIds != null) { final ArrayList<AutofillId> orderedInvisibleIds = new ArrayList<>(mInvisibleTrackedIds); - final boolean[] isVisible = client.getViewVisibility( - getViewIds(orderedInvisibleIds)); + final boolean[] isVisible = client.autofillClientGetViewVisibility( + Helper.toArray(orderedInvisibleIds)); final int numInvisibleTrackedIds = orderedInvisibleIds.size(); for (int i = 0; i < numInvisibleTrackedIds; i++) { @@ -2116,8 +2372,8 @@ public final class AutofillManager { if (mVisibleTrackedIds != null) { final ArrayList<AutofillId> orderedVisibleIds = new ArrayList<>(mVisibleTrackedIds); - final boolean[] isVisible = client.getViewVisibility( - getViewIds(orderedVisibleIds)); + final boolean[] isVisible = client.autofillClientGetViewVisibility( + Helper.toArray(orderedVisibleIds)); final int numVisibleTrackedIds = orderedVisibleIds.size(); for (int i = 0; i < numVisibleTrackedIds; i++) { diff --git a/core/java/android/view/autofill/AutofillManagerInternal.java b/core/java/android/view/autofill/AutofillManagerInternal.java index fc5d306ddcef..155fe721311c 100644 --- a/core/java/android/view/autofill/AutofillManagerInternal.java +++ b/core/java/android/view/autofill/AutofillManagerInternal.java @@ -15,6 +15,9 @@ */ package android.view.autofill; +import android.annotation.NonNull; +import android.annotation.UserIdInt; + /** * Autofill Manager local system service interface. * @@ -26,4 +29,14 @@ public abstract class AutofillManagerInternal { * Notifies the manager that the back key was pressed. */ public abstract void onBackKeyPressed(); + + /** + * Gets whether compatibility mode is enabled for a package + * + * @param packageName The package for which to query. + * @param versionCode The package version code. + * @param userId The user id for which to query. + */ + public abstract boolean isCompatibilityModeRequested(@NonNull String packageName, + long versionCode, @UserIdInt int userId); } diff --git a/core/java/android/view/autofill/Helper.java b/core/java/android/view/autofill/Helper.java index 4b2c53c7eb84..48d0dbb3e02b 100644 --- a/core/java/android/view/autofill/Helper.java +++ b/core/java/android/view/autofill/Helper.java @@ -19,6 +19,8 @@ package android.view.autofill; import android.annotation.NonNull; import android.annotation.Nullable; +import java.util.Collection; + /** @hide */ public final class Helper { @@ -59,6 +61,20 @@ public final class Helper { builder.append(" ]"); } + /** + * Convers a collaction of {@link AutofillId AutofillIds} to an array. + * @param collection The collection. + * @return The array. + */ + public static @NonNull AutofillId[] toArray(Collection<AutofillId> collection) { + if (collection == null) { + return new AutofillId[0]; + } + final AutofillId[] array = new AutofillId[collection.size()]; + collection.toArray(array); + return array; + } + private Helper() { throw new UnsupportedOperationException("contains static members only"); } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 7db5c3207296..9de26a86f20f 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemService; +import android.annotation.TestApi; import android.content.Context; import android.graphics.Rect; import android.inputmethodservice.InputMethodService; @@ -1178,8 +1179,9 @@ public final class InputMethodManager { } } - /* + /** * This method toggles the input method window display. + * * If the input window is already displayed, it gets hidden. * If not the input window will be displayed. * @param showFlags Provides additional operating flags. May be @@ -1188,7 +1190,6 @@ public final class InputMethodManager { * @param hideFlags Provides additional operating flags. May be * 0 or have the {@link #HIDE_IMPLICIT_ONLY}, * {@link #HIDE_NOT_ALWAYS} bit set. - * @hide */ public void toggleSoftInput(int showFlags, int hideFlags) { if (mCurMethod != null) { @@ -2137,6 +2138,26 @@ public final class InputMethodManager { } /** + * A test API for CTS to make sure that {@link #showInputMethodPicker()} works as expected. + * + * <p>When customizing the implementation of {@link #showInputMethodPicker()} API, make sure + * that this test API returns when and only while and only while + * {@link #showInputMethodPicker()} is showing UI. Otherwise your OS implementation may not + * pass CTS.</p> + * + * @return {@code true} while and only while {@link #showInputMethodPicker()} is showing UI. + * @hide + */ + @TestApi + public boolean isInputMethodPickerShown() { + try { + return mService.isInputMethodPickerShownForTest(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Show the settings for enabling subtypes of the specified input method. * @param imiId An input method, whose subtypes settings will be shown. If imiId is null, * subtypes of all input methods will be shown. diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java index ede52119390a..d866d1305172 100644 --- a/core/java/android/view/textclassifier/TextLinks.java +++ b/core/java/android/view/textclassifier/TextLinks.java @@ -198,7 +198,11 @@ public final class TextLinks implements Parcelable { /** * Create a new TextLink. * - * @throws IllegalArgumentException if entityScores is null or empty. + * @param start The start index of the identified subsequence + * @param end The end index of the identified subsequence + * @param entityScores A mapping of entity type to confidence score + * + * @throws IllegalArgumentException if entityScores is null or empty */ TextLink(int start, int end, Map<String, Float> entityScores) { Preconditions.checkNotNull(entityScores); @@ -212,7 +216,7 @@ public final class TextLinks implements Parcelable { /** * Returns the start index of this link in the original text. * - * @return the start index. + * @return the start index */ public int getStart() { return mStart; @@ -221,7 +225,7 @@ public final class TextLinks implements Parcelable { /** * Returns the end index of this link in the original text. * - * @return the end index. + * @return the end index */ public int getEnd() { return mEnd; @@ -230,7 +234,7 @@ public final class TextLinks implements Parcelable { /** * Returns the number of entity types that have confidence scores. * - * @return the entity count. + * @return the entity count */ public int getEntityCount() { return mEntityScores.getEntities().size(); @@ -239,7 +243,7 @@ public final class TextLinks implements Parcelable { /** * Returns the entity type at a given index. Entity types are sorted by confidence. * - * @return the entity type at the provided index. + * @return the entity type at the provided index */ @NonNull public @EntityType String getEntity(int index) { return mEntityScores.getEntities().get(index); @@ -248,7 +252,7 @@ public final class TextLinks implements Parcelable { /** * Returns the confidence score for a particular entity type. * - * @param entityType the entity type. + * @param entityType the entity type */ public @FloatRange(from = 0.0, to = 1.0) float getConfidenceScore( @EntityType String entityType) { @@ -371,7 +375,7 @@ public final class TextLinks implements Parcelable { /** * @return ordered list of locale preferences that can be used to disambiguate - * the provided text. + * the provided text */ @Nullable public LocaleList getDefaultLocales() { @@ -389,7 +393,7 @@ public final class TextLinks implements Parcelable { /** * @return the strategy for resolving conflictswhen applying generated links to text that - * already have links. + * already have links * * @see #APPLY_STRATEGY_IGNORE * @see #APPLY_STRATEGY_REPLACE @@ -494,7 +498,7 @@ public final class TextLinks implements Parcelable { /** * Create a new TextLinks.Builder. * - * @param fullText The full text to annotate with links. + * @param fullText The full text to annotate with links */ public Builder(@NonNull String fullText) { mFullText = Preconditions.checkNotNull(fullText); @@ -504,7 +508,7 @@ public final class TextLinks implements Parcelable { /** * Adds a TextLink. * - * @return this instance. + * @return this instance * * @throws IllegalArgumentException if entityScores is null or empty. */ @@ -524,7 +528,7 @@ public final class TextLinks implements Parcelable { /** * Constructs a TextLinks instance. * - * @return the constructed TextLinks. + * @return the constructed TextLinks */ public TextLinks build() { return new TextLinks(mFullText, mLinks); diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 7bb0db1cf910..5ab579df5ed6 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1745,16 +1745,19 @@ public class Editor { highlight = null; } + if (mSelectionActionModeHelper != null) { + mSelectionActionModeHelper.onDraw(canvas); + if (mSelectionActionModeHelper.isDrawingHighlight()) { + highlight = null; + } + } + if (mTextView.canHaveDisplayList() && canvas.isHardwareAccelerated()) { drawHardwareAccelerated(canvas, layout, highlight, highlightPaint, cursorOffsetVertical); } else { layout.draw(canvas, highlight, highlightPaint, cursorOffsetVertical); } - - if (mSelectionActionModeHelper != null) { - mSelectionActionModeHelper.onDraw(canvas); - } } private void drawHardwareAccelerated(Canvas canvas, Layout layout, Path highlight, diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 1dc5b44bed4f..4b951fa1824e 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -23,10 +23,12 @@ import android.annotation.TestApi; import android.content.ContentResolver; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.ImageDecoder; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.PorterDuff; @@ -53,7 +55,6 @@ import android.widget.RemoteViews.RemoteView; import com.android.internal.R; import java.io.IOException; -import java.io.InputStream; /** * Displays image resources, for example {@link android.graphics.Bitmap} @@ -946,21 +947,15 @@ public class ImageView extends View { } } else if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme)) { - InputStream stream = null; try { - stream = mContext.getContentResolver().openInputStream(uri); - return Drawable.createFromResourceStream(sCompatUseCorrectStreamDensity - ? getResources() : null, null, stream, null); - } catch (Exception e) { + Resources res = sCompatUseCorrectStreamDensity ? getResources() : null; + ImageDecoder.Source src = ImageDecoder.createSource(mContext.getContentResolver(), + uri, res); + return ImageDecoder.decodeDrawable(src, (decoder, info, s) -> { + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); + } catch (IOException e) { Log.w(LOG_TAG, "Unable to open content: " + uri, e); - } finally { - if (stream != null) { - try { - stream.close(); - } catch (IOException e) { - Log.w(LOG_TAG, "Unable to close content: " + uri, e); - } - } } } else { return Drawable.createFromPath(uri.toString()); diff --git a/core/java/android/widget/MediaControlView2.java b/core/java/android/widget/MediaControlView2.java index 5f6d9ce665ad..7d556bf450b4 100644 --- a/core/java/android/widget/MediaControlView2.java +++ b/core/java/android/widget/MediaControlView2.java @@ -22,8 +22,8 @@ import android.annotation.Nullable; import android.content.Context; import android.media.session.MediaController; import android.media.update.ApiLoader; -import android.media.update.FrameLayoutHelper; import android.media.update.MediaControlView2Provider; +import android.media.update.ViewGroupHelper; import android.util.AttributeSet; import java.lang.annotation.Retention; @@ -49,9 +49,8 @@ import java.lang.annotation.RetentionPolicy; * There is no separate method that handles the show/hide behavior for MediaControlView2. Instead, * one can directly change the visibility of this view by calling View.setVisibility(int). The * values supported are View.VISIBLE and View.GONE. - * In addition, the following customizations are supported: - * 1. Modify default timeout value of 2 seconds by calling setTimeout(long). - * 2. Set focus to the play/pause button by calling requestPlayButtonFocus(). + * In addition, the following customization is supported: + * Set focus to the play/pause button by calling requestPlayButtonFocus(). * * <p> * It is also possible to add custom buttons with custom icons and actions inside MediaControlView2. @@ -61,7 +60,7 @@ import java.lang.annotation.RetentionPolicy; * TODO PUBLIC API * @hide */ -public class MediaControlView2 extends FrameLayoutHelper<MediaControlView2Provider> { +public class MediaControlView2 extends ViewGroupHelper<MediaControlView2Provider> { /** @hide */ @IntDef({ BUTTON_PLAY_PAUSE, @@ -155,10 +154,12 @@ public class MediaControlView2 extends FrameLayoutHelper<MediaControlView2Provid public MediaControlView2(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super((instance, superProvider) -> + super((instance, superProvider, privateProvider) -> ApiLoader.getProvider(context).createMediaControlView2( - (MediaControlView2) instance, superProvider), + (MediaControlView2) instance, superProvider, privateProvider, + attrs, defStyleAttr, defStyleRes), context, attrs, defStyleAttr, defStyleRes); + mProvider.initialize(attrs, defStyleAttr, defStyleRes); } /** @@ -169,13 +170,6 @@ public class MediaControlView2 extends FrameLayoutHelper<MediaControlView2Provid } /** - * Returns whether the control view is currently shown or hidden. - */ - public boolean isShowing() { - return mProvider.isShowing_impl(); - } - - /** * Changes the visibility state of an individual button. Default value is View.Visible. * * @param button the {@code Button} assigned to individual buttons @@ -205,27 +199,8 @@ public class MediaControlView2 extends FrameLayoutHelper<MediaControlView2Provid mProvider.requestPlayButtonFocus_impl(); } - /** - * Sets a new timeout value (in milliseconds) for showing MediaControlView2. The default value - * is set as 2 seconds. - * @param timeout the - */ - public void setTimeout(long timeout) { - mProvider.setTimeout_impl(timeout); - } - - /** - * Retrieves current timeout value (in milliseconds) for showing MediaControlView2. The default - * value is set as 2 seconds. - */ - public long getTimeout() { - return mProvider.getTimeout_impl(); - } - @Override - // TODO Move this method to ViewProvider - public void onVisibilityAggregated(boolean isVisible) { - - mProvider.onVisibilityAggregated_impl(isVisible); + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mProvider.onLayout_impl(changed, l, t, r, b); } } diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 2e354c1eee1f..e7a4c0246e1f 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -93,7 +93,7 @@ public final class SelectionActionModeHelper { if (SMART_SELECT_ANIMATION_ENABLED) { mSmartSelectSprite = new SmartSelectSprite(mTextView.getContext(), - mTextView::invalidate); + editor.getTextView().mHighlightColor, mTextView::invalidate); } else { mSmartSelectSprite = null; } @@ -200,11 +200,15 @@ public final class SelectionActionModeHelper { } public void onDraw(final Canvas canvas) { - if (mSmartSelectSprite != null) { + if (isDrawingHighlight() && mSmartSelectSprite != null) { mSmartSelectSprite.draw(canvas); } } + public boolean isDrawingHighlight() { + return mSmartSelectSprite != null && mSmartSelectSprite.isAnimationActive(); + } + private void cancelAsyncTask() { if (mTextClassificationAsyncTask != null) { mTextClassificationAsyncTask.cancel(true); diff --git a/core/java/android/widget/SmartSelectSprite.java b/core/java/android/widget/SmartSelectSprite.java index a391c6ee8ec3..9a84f69d120a 100644 --- a/core/java/android/widget/SmartSelectSprite.java +++ b/core/java/android/widget/SmartSelectSprite.java @@ -26,7 +26,6 @@ import android.annotation.ColorInt; import android.annotation.FloatRange; import android.annotation.IntDef; import android.content.Context; -import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; @@ -36,7 +35,6 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.Shape; import android.text.Layout; -import android.util.TypedValue; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -54,21 +52,15 @@ import java.util.List; final class SmartSelectSprite { private static final int EXPAND_DURATION = 300; - private static final int CORNER_DURATION = 150; - private static final float STROKE_WIDTH_DP = 1.5F; - - // GBLUE700 - @ColorInt - private static final int DEFAULT_STROKE_COLOR = 0xFF3367D6; + private static final int CORNER_DURATION = 50; private final Interpolator mExpandInterpolator; private final Interpolator mCornerInterpolator; - private final float mStrokeWidth; private Animator mActiveAnimator = null; private final Runnable mInvalidator; @ColorInt - private final int mStrokeColor; + private final int mFillColor; static final Comparator<RectF> RECTANGLE_COMPARATOR = Comparator .<RectF>comparingDouble(e -> e.bottom) @@ -124,26 +116,11 @@ final class SmartSelectSprite { return expansionDirection * -1; } - @Retention(SOURCE) - @IntDef({RectangleBorderType.FIT, RectangleBorderType.OVERSHOOT}) - private @interface RectangleBorderType { - /** A rectangle which, fully expanded, fits inside of its bounding rectangle. */ - int FIT = 0; - /** - * A rectangle which, when fully expanded, clips outside of its bounding rectangle so that - * its edges no longer appear rounded. - */ - int OVERSHOOT = 1; - } - - private final float mStrokeWidth; private final RectF mBoundingRectangle; private float mRoundRatio = 1.0f; private final @ExpansionDirection int mExpansionDirection; - private final @RectangleBorderType int mRectangleBorderType; private final RectF mDrawRect = new RectF(); - private final RectF mClipRect = new RectF(); private final Path mClipPath = new Path(); /** How offset the left edge of the rectangle is from the left side of the bounding box. */ @@ -159,13 +136,9 @@ final class SmartSelectSprite { private RoundedRectangleShape( final RectF boundingRectangle, final @ExpansionDirection int expansionDirection, - final @RectangleBorderType int rectangleBorderType, - final boolean inverted, - final float strokeWidth) { + final boolean inverted) { mBoundingRectangle = new RectF(boundingRectangle); mBoundingWidth = boundingRectangle.width(); - mRectangleBorderType = rectangleBorderType; - mStrokeWidth = strokeWidth; mInverted = inverted && expansionDirection != ExpansionDirection.CENTER; if (inverted) { @@ -182,14 +155,8 @@ final class SmartSelectSprite { } /* - * In order to achieve the "rounded rectangle hits the wall" effect, the drawing needs to be - * done in two passes. In this context, the wall is the bounding rectangle and in the first - * pass we need to draw the rounded rectangle (expanded and with a corner radius as per - * object properties) clipped by the bounding box. If the rounded rectangle expands outside - * of the bounding box, one more pass needs to be done, as there will now be a hole in the - * rounded rectangle where it "flattened" against the bounding box. In order to fill just - * this hole, we need to draw the bounding box, but clip it with the rounded rectangle and - * this will connect the missing pieces. + * In order to achieve the "rounded rectangle hits the wall" effect, we draw an expanding + * rounded rectangle that is clipped by the bounding box of the selected text. */ @Override public void draw(Canvas canvas, Paint paint) { @@ -201,31 +168,8 @@ final class SmartSelectSprite { final float adjustedCornerRadius = getAdjustedCornerRadius(); mDrawRect.set(mBoundingRectangle); - mDrawRect.left = mBoundingRectangle.left + mLeftBoundary; - mDrawRect.right = mBoundingRectangle.left + mRightBoundary; - - if (mRectangleBorderType == RectangleBorderType.OVERSHOOT) { - mDrawRect.left -= cornerRadius / 2; - mDrawRect.right += cornerRadius / 2; - } else { - switch (mExpansionDirection) { - case ExpansionDirection.CENTER: - break; - case ExpansionDirection.LEFT: - mDrawRect.right += cornerRadius; - break; - case ExpansionDirection.RIGHT: - mDrawRect.left -= cornerRadius; - break; - } - } - - canvas.save(); - mClipRect.set(mBoundingRectangle); - mClipRect.inset(-mStrokeWidth / 2, -mStrokeWidth / 2); - canvas.clipRect(mClipRect); - canvas.drawRoundRect(mDrawRect, adjustedCornerRadius, adjustedCornerRadius, paint); - canvas.restore(); + mDrawRect.left = mBoundingRectangle.left + mLeftBoundary - cornerRadius / 2; + mDrawRect.right = mBoundingRectangle.left + mRightBoundary + cornerRadius / 2; canvas.save(); mClipPath.reset(); @@ -272,11 +216,7 @@ final class SmartSelectSprite { } private float getBoundingWidth() { - if (mRectangleBorderType == RectangleBorderType.OVERSHOOT) { - return (int) (mBoundingRectangle.width() + getCornerRadius()); - } else { - return mBoundingRectangle.width(); - } + return (int) (mBoundingRectangle.width() + getCornerRadius()); } } @@ -388,19 +328,20 @@ final class SmartSelectSprite { } /** - * @param context the {@link Context} in which the animation will run + * @param context the {@link Context} in which the animation will run + * @param highlightColor the highlight color of the underlying {@link TextView} * @param invalidator a {@link Runnable} which will be called every time the animation updates, * indicating that the view drawing the animation should invalidate itself */ - SmartSelectSprite(final Context context, final Runnable invalidator) { + SmartSelectSprite(final Context context, @ColorInt int highlightColor, + final Runnable invalidator) { mExpandInterpolator = AnimationUtils.loadInterpolator( context, android.R.interpolator.fast_out_slow_in); mCornerInterpolator = AnimationUtils.loadInterpolator( context, android.R.interpolator.fast_out_linear_in); - mStrokeWidth = dpToPixel(context, STROKE_WIDTH_DP); - mStrokeColor = getStrokeColor(context); + mFillColor = highlightColor; mInvalidator = Preconditions.checkNotNull(invalidator); } @@ -437,17 +378,14 @@ final class SmartSelectSprite { RectangleWithTextSelectionLayout centerRectangle = null; int startingOffset = 0; - int startingRectangleIndex = 0; - for (int index = 0; index < rectangleCount; ++index) { - final RectangleWithTextSelectionLayout rectangleWithTextSelectionLayout = - destinationRectangles.get(index); + for (RectangleWithTextSelectionLayout rectangleWithTextSelectionLayout : + destinationRectangles) { final RectF rectangle = rectangleWithTextSelectionLayout.getRectangle(); if (contains(rectangle, start)) { centerRectangle = rectangleWithTextSelectionLayout; break; } startingOffset += rectangle.width(); - ++startingRectangleIndex; } if (centerRectangle == null) { @@ -459,9 +397,6 @@ final class SmartSelectSprite { final @RoundedRectangleShape.ExpansionDirection int[] expansionDirections = generateDirections(centerRectangle, destinationRectangles); - final @RoundedRectangleShape.RectangleBorderType int[] rectangleBorderTypes = - generateBorderTypes(rectangleCount); - for (int index = 0; index < rectangleCount; ++index) { final RectangleWithTextSelectionLayout rectangleWithTextSelectionLayout = destinationRectangles.get(index); @@ -469,10 +404,8 @@ final class SmartSelectSprite { final RoundedRectangleShape shape = new RoundedRectangleShape( rectangle, expansionDirections[index], - rectangleBorderTypes[index], rectangleWithTextSelectionLayout.getTextSelectionLayout() - == Layout.TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT, - mStrokeWidth); + == Layout.TEXT_SELECTION_LAYOUT_RIGHT_TO_LEFT); cornerAnimators.add(createCornerAnimator(shape, updateListener)); shapes.add(shape); } @@ -480,44 +413,23 @@ final class SmartSelectSprite { final RectangleList rectangleList = new RectangleList(shapes); final ShapeDrawable shapeDrawable = new ShapeDrawable(rectangleList); - final float startingOffsetLeft; - final float startingOffsetRight; - - final RoundedRectangleShape startingRectangleShape = shapes.get(startingRectangleIndex); - final float cornerRadius = startingRectangleShape.getCornerRadius(); - if (startingRectangleShape.mRectangleBorderType - == RoundedRectangleShape.RectangleBorderType.FIT) { - switch (startingRectangleShape.mExpansionDirection) { - case RoundedRectangleShape.ExpansionDirection.LEFT: - startingOffsetLeft = startingOffsetRight = startingOffset - cornerRadius / 2; - break; - case RoundedRectangleShape.ExpansionDirection.RIGHT: - startingOffsetLeft = startingOffsetRight = startingOffset + cornerRadius / 2; - break; - case RoundedRectangleShape.ExpansionDirection.CENTER: // fall through - default: - startingOffsetLeft = startingOffset - cornerRadius / 2; - startingOffsetRight = startingOffset + cornerRadius / 2; - break; - } - } else { - startingOffsetLeft = startingOffsetRight = startingOffset; - } - final Paint paint = shapeDrawable.getPaint(); - paint.setColor(mStrokeColor); - paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(mStrokeWidth); + paint.setColor(mFillColor); + paint.setStyle(Paint.Style.FILL); mExistingRectangleList = rectangleList; mExistingDrawable = shapeDrawable; - mActiveAnimator = createAnimator(rectangleList, startingOffsetLeft, startingOffsetRight, - cornerAnimators, updateListener, - onAnimationEnd); + mActiveAnimator = createAnimator(rectangleList, startingOffset, startingOffset, + cornerAnimators, updateListener, onAnimationEnd); mActiveAnimator.start(); } + /** Returns whether the sprite is currently animating. */ + public boolean isAnimationActive() { + return mActiveAnimator != null && mActiveAnimator.isRunning(); + } + private Animator createAnimator( final RectangleList rectangleList, final float startingOffsetLeft, @@ -625,36 +537,6 @@ final class SmartSelectSprite { return result; } - private static @RoundedRectangleShape.RectangleBorderType int[] generateBorderTypes( - final int numberOfRectangles) { - final @RoundedRectangleShape.RectangleBorderType int[] result = new int[numberOfRectangles]; - - for (int i = 1; i < result.length - 1; ++i) { - result[i] = RoundedRectangleShape.RectangleBorderType.OVERSHOOT; - } - - result[0] = RoundedRectangleShape.RectangleBorderType.FIT; - result[result.length - 1] = RoundedRectangleShape.RectangleBorderType.FIT; - return result; - } - - private static float dpToPixel(final Context context, final float dp) { - return TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - dp, - context.getResources().getDisplayMetrics()); - } - - @ColorInt - private static int getStrokeColor(final Context context) { - final TypedValue typedValue = new TypedValue(); - final TypedArray array = context.obtainStyledAttributes(typedValue.data, new int[]{ - android.R.attr.colorControlActivated}); - final int result = array.getColor(0, DEFAULT_STROKE_COLOR); - array.recycle(); - return result; - } - /** * A variant of {@link RectF#contains(float, float)} that also allows the point to reside on * the right boundary of the rectangle. diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java index 78ca0114b798..cb68bc30c0d5 100644 --- a/core/java/android/widget/VideoView2.java +++ b/core/java/android/widget/VideoView2.java @@ -27,8 +27,8 @@ import android.media.session.MediaController; import android.media.session.MediaSession; import android.media.session.PlaybackState; import android.media.update.ApiLoader; -import android.media.update.FrameLayoutHelper; import android.media.update.VideoView2Provider; +import android.media.update.ViewGroupHelper; import android.net.Uri; import android.os.Bundle; import android.util.AttributeSet; @@ -101,7 +101,7 @@ import java.util.concurrent.Executor; * * @hide */ -public class VideoView2 extends FrameLayoutHelper<VideoView2Provider> { +public class VideoView2 extends ViewGroupHelper<VideoView2Provider> { /** @hide */ @IntDef({ VIEW_TYPE_TEXTUREVIEW, @@ -139,10 +139,12 @@ public class VideoView2 extends FrameLayoutHelper<VideoView2Provider> { public VideoView2( @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super((instance, superProvider) -> + super((instance, superProvider, privateProvider) -> ApiLoader.getProvider(context).createVideoView2( - (VideoView2) instance, superProvider, attrs, defStyleAttr, defStyleRes), + (VideoView2) instance, superProvider, privateProvider, + attrs, defStyleAttr, defStyleRes), context, attrs, defStyleAttr, defStyleRes); + mProvider.initialize(attrs, defStyleAttr, defStyleRes); } /** @@ -150,9 +152,10 @@ public class VideoView2 extends FrameLayoutHelper<VideoView2Provider> { * instance if any. * * @param mediaControlView a media control view2 instance. + * @param intervalMs a time interval in milliseconds until VideoView2 hides MediaControlView2. */ - public void setMediaControlView2(MediaControlView2 mediaControlView) { - mProvider.setMediaControlView2_impl(mediaControlView); + public void setMediaControlView2(MediaControlView2 mediaControlView, long intervalMs) { + mProvider.setMediaControlView2_impl(mediaControlView, intervalMs); } /** @@ -179,11 +182,21 @@ public class VideoView2 extends FrameLayoutHelper<VideoView2Provider> { /** * Shows or hides closed caption or subtitles if there is any. - * The first subtitle track will be chosen by default if there multiple subtitle tracks exist. - * @param show shows closed caption or subtitles if this value is true, or hides. + * The first subtitle track will be chosen if there multiple subtitle tracks exist. + * Default behavior of VideoView2 is not showing subtitle. + * @param enable shows closed caption or subtitles if this value is true, or hides. */ - public void showSubtitle(boolean show) { - mProvider.showSubtitle_impl(show); + public void setSubtitleEnabled(boolean enable) { + mProvider.setSubtitleEnabled_impl(enable); + } + + /** + * Returns true if showing subtitle feature is enabled or returns false. + * Although there is no subtitle track or closed caption, it can return true, if the feature + * has been enabled by {@link #setSubtitleEnabled}. + */ + public boolean isSubtitleEnabled() { + return mProvider.isSubtitleEnabled_impl(); } /** @@ -487,4 +500,9 @@ public class VideoView2 extends FrameLayoutHelper<VideoView2Provider> { */ void onCustomAction(String action, Bundle extras); } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + mProvider.onLayout_impl(changed, l, t, r, b); + } } diff --git a/core/java/com/android/internal/alsa/AlsaCardsParser.java b/core/java/com/android/internal/alsa/AlsaCardsParser.java index bb75bf6e6fb8..fa8db96781ac 100644 --- a/core/java/com/android/internal/alsa/AlsaCardsParser.java +++ b/core/java/com/android/internal/alsa/AlsaCardsParser.java @@ -31,7 +31,9 @@ public class AlsaCardsParser { private static final String TAG = "AlsaCardsParser"; protected static final boolean DEBUG = false; - private static final String kCardsFilePath = "/proc/asound/cards"; + private static final String kAlsaFolderPath = "/proc/asound"; + private static final String kCardsFilePath = kAlsaFolderPath + "/cards"; + private static final String kDeviceAddressPrefix = "/dev/bus/usb/"; private static LineTokenizer mTokenizer = new LineTokenizer(" :[]"); @@ -47,14 +49,31 @@ public class AlsaCardsParser { private static final String TAG = "AlsaCardRecord"; private static final String kUsbCardKeyStr = "at usb-"; - public int mCardNum = -1; - public String mField1 = ""; - public String mCardName = ""; - public String mCardDescription = ""; - public boolean mIsUsb = false; + int mCardNum = -1; + String mField1 = ""; + String mCardName = ""; + String mCardDescription = ""; + + private String mUsbDeviceAddress = null; public AlsaCardRecord() {} + public int getCardNum() { + return mCardNum; + } + + public String getCardName() { + return mCardName; + } + + public String getCardDescription() { + return mCardDescription; + } + + public void setDeviceAddress(String usbDeviceAddress) { + mUsbDeviceAddress = usbDeviceAddress; + } + private boolean parse(String line, int lineIndex) { int tokenIndex = 0; int delimIndex = 0; @@ -87,8 +106,8 @@ public class AlsaCardsParser { tokenIndex = mTokenizer.nextToken(line, 0); if (tokenIndex != -1) { int keyIndex = line.indexOf(kUsbCardKeyStr); - mIsUsb = keyIndex != -1; - if (mIsUsb) { + boolean isUsb = keyIndex != -1; + if (isUsb) { mCardDescription = line.substring(tokenIndex, keyIndex - 1); } } @@ -97,14 +116,18 @@ public class AlsaCardsParser { return true; } + boolean isUsb() { + return mUsbDeviceAddress != null; + } + public String textFormat() { - return mCardName + " : " + mCardDescription; + return mCardName + " : " + mCardDescription + " [addr:" + mUsbDeviceAddress + "]"; } public void log(int listIndex) { Slog.d(TAG, "" + listIndex + " [" + mCardNum + " " + mCardName + " : " + mCardDescription + - " usb:" + mIsUsb); + " usb:" + isUsb()); } } @@ -112,7 +135,7 @@ public class AlsaCardsParser { public int scan() { if (DEBUG) { - Slog.i(TAG, "AlsaCardsParser.scan()...."); + Slog.d(TAG, "AlsaCardsParser.scan()...."); } mCardRecords = new ArrayList<AlsaCardRecord>(); @@ -125,7 +148,7 @@ public class AlsaCardsParser { while ((line = bufferedReader.readLine()) != null) { AlsaCardRecord cardRecord = new AlsaCardRecord(); if (DEBUG) { - Slog.i(TAG, " " + line); + Slog.d(TAG, " " + line); } cardRecord.parse(line, 0); @@ -134,10 +157,23 @@ public class AlsaCardsParser { break; } if (DEBUG) { - Slog.i(TAG, " " + line); + Slog.d(TAG, " " + line); } cardRecord.parse(line, 1); + // scan "usbbus" file + int cardNum = cardRecord.mCardNum; + String cardFolderPath = kAlsaFolderPath + "/card" + cardNum; + File usbbusFile = new File(cardFolderPath + "/usbbus"); + if (usbbusFile.exists()) { + // read it in + FileReader usbbusReader = new FileReader(usbbusFile); + String deviceAddress = (new BufferedReader(usbbusReader)).readLine(); + if (deviceAddress != null) { + cardRecord.setDeviceAddress(kDeviceAddressPrefix + deviceAddress); + } + usbbusReader.close(); + } mCardRecords.add(cardRecord); } reader.close(); @@ -147,14 +183,12 @@ public class AlsaCardsParser { mScanStatus = SCANSTATUS_EMPTY; } } catch (FileNotFoundException e) { - e.printStackTrace(); mScanStatus = SCANSTATUS_FAIL; } catch (IOException e) { - e.printStackTrace(); mScanStatus = SCANSTATUS_FAIL; } if (DEBUG) { - Slog.i(TAG, " status:" + mScanStatus); + Slog.d(TAG, " status:" + mScanStatus); } return mScanStatus; } @@ -163,142 +197,33 @@ public class AlsaCardsParser { return mScanStatus; } - public ArrayList<AlsaCardRecord> getScanRecords() { - return mCardRecords; - } - - public AlsaCardRecord getCardRecordAt(int index) { - return mCardRecords.get(index); - } - - public AlsaCardRecord getCardRecordFor(int cardNum) { - for (AlsaCardRecord rec : mCardRecords) { - if (rec.mCardNum == cardNum) { - return rec; + public AlsaCardRecord findCardNumFor(String deviceAddress) { + for(AlsaCardRecord cardRec : mCardRecords) { + if (cardRec.isUsb() && cardRec.mUsbDeviceAddress.equals(deviceAddress)) { + return cardRec; } } - return null; } - public int getNumCardRecords() { - return mCardRecords.size(); - } - - public boolean isCardUsb(int cardNum) { - for (AlsaCardRecord rec : mCardRecords) { - if (rec.mCardNum == cardNum) { - return rec.mIsUsb; - } - } - - return false; - } - - // return -1 if none found - public int getDefaultUsbCard() { - // save the current list of devices - ArrayList<AlsaCardsParser.AlsaCardRecord> prevRecs = mCardRecords; - if (DEBUG) { - LogDevices("Previous Devices:", prevRecs); - } - - // get the new list of devices - if (scan() != SCANSTATUS_SUCCESS) { - Slog.e(TAG, "Error scanning Alsa cards file."); - return -1; - } - - if (DEBUG) { - LogDevices("Current Devices:", mCardRecords); - } - - // Calculate the difference between the old and new device list - ArrayList<AlsaCardRecord> newRecs = getNewCardRecords(prevRecs); - if (DEBUG) { - LogDevices("New Devices:", newRecs); - } - - // Choose the most-recently added EXTERNAL card - // Check recently added devices - for (AlsaCardRecord rec : newRecs) { - if (DEBUG) { - Slog.d(TAG, rec.mCardName + " card:" + rec.mCardNum + " usb:" + rec.mIsUsb); - } - if (rec.mIsUsb) { - // Found it - return rec.mCardNum; - } - } - - // or return the first added EXTERNAL card? - for (AlsaCardRecord rec : prevRecs) { - if (DEBUG) { - Slog.d(TAG, rec.mCardName + " card:" + rec.mCardNum + " usb:" + rec.mIsUsb); - } - if (rec.mIsUsb) { - return rec.mCardNum; - } - } - - return -1; - } - - public int getDefaultCard() { - // return an external card if possible - int card = getDefaultUsbCard(); - if (DEBUG) { - Slog.d(TAG, "getDefaultCard() default usb card:" + card); - } - - if (card < 0 && getNumCardRecords() > 0) { - // otherwise return the (internal) card with the highest number - card = getCardRecordAt(getNumCardRecords() - 1).mCardNum; - } - if (DEBUG) { - Slog.d(TAG, " returns card:" + card); - } - return card; - } - - static public boolean hasCardNumber(ArrayList<AlsaCardRecord> recs, int cardNum) { - for (AlsaCardRecord cardRec : recs) { - if (cardRec.mCardNum == cardNum) { - return true; - } - } - return false; - } - - public ArrayList<AlsaCardRecord> getNewCardRecords(ArrayList<AlsaCardRecord> prevScanRecs) { - ArrayList<AlsaCardRecord> newRecs = new ArrayList<AlsaCardRecord>(); - for (AlsaCardRecord rec : mCardRecords) { - // now scan to see if this card number is in the previous scan list - if (!hasCardNumber(prevScanRecs, rec.mCardNum)) { - newRecs.add(rec); - } - } - return newRecs; - } - // // Logging // private void Log(String heading) { if (DEBUG) { - Slog.i(TAG, heading); + Slog.d(TAG, heading); for (AlsaCardRecord cardRec : mCardRecords) { - Slog.i(TAG, cardRec.textFormat()); + Slog.d(TAG, cardRec.textFormat()); } } } - static private void LogDevices(String caption, ArrayList<AlsaCardRecord> deviceList) { - Slog.d(TAG, caption + " ----------------"); - int listIndex = 0; - for (AlsaCardRecord device : deviceList) { - device.log(listIndex++); - } - Slog.d(TAG, "----------------"); - } +// static private void LogDevices(String caption, ArrayList<AlsaCardRecord> deviceList) { +// Slog.d(TAG, caption + " ----------------"); +// int listIndex = 0; +// for (AlsaCardRecord device : deviceList) { +// device.log(listIndex++); +// } +// Slog.d(TAG, caption + "----------------"); +// } } diff --git a/core/java/com/android/internal/alsa/AlsaDevicesParser.java b/core/java/com/android/internal/alsa/AlsaDevicesParser.java index 15261bafd299..8d92d016be24 100644 --- a/core/java/com/android/internal/alsa/AlsaDevicesParser.java +++ b/core/java/com/android/internal/alsa/AlsaDevicesParser.java @@ -27,6 +27,9 @@ import java.util.ArrayList; * @hide * Retrieves information from an ALSA "devices" file. */ +/* + * NOTE: This class is currently not being used, but may be needed in the future. + */ public class AlsaDevicesParser { private static final String TAG = "AlsaDevicesParser"; protected static final boolean DEBUG = false; @@ -207,12 +210,6 @@ public class AlsaDevicesParser { // // Predicates // -/* - public boolean hasPlaybackDevices() { - return mHasPlaybackDevices; - } -*/ - public boolean hasPlaybackDevices(int card) { for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && @@ -224,12 +221,6 @@ public class AlsaDevicesParser { return false; } -/* - public boolean hasCaptureDevices() { - return mHasCaptureDevices; - } -*/ - public boolean hasCaptureDevices(int card) { for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && @@ -241,12 +232,6 @@ public class AlsaDevicesParser { return false; } -/* - public boolean hasMIDIDevices() { - return mHasMIDIDevices; - } -*/ - public boolean hasMIDIDevices(int card) { for (AlsaDeviceRecord deviceRecord : mDeviceRecords) { if (deviceRecord.mCardNum == card && @@ -280,6 +265,7 @@ public class AlsaDevicesParser { if (isLineDeviceRecord(line)) { AlsaDeviceRecord deviceRecord = new AlsaDeviceRecord(); deviceRecord.parse(line); + Slog.i(TAG, deviceRecord.textFormat()); mDeviceRecords.add(deviceRecord); } } diff --git a/core/java/com/android/internal/app/UnlaunchableAppActivity.java b/core/java/com/android/internal/app/UnlaunchableAppActivity.java index 902c8c1662ea..6f7695ce8c34 100644 --- a/core/java/com/android/internal/app/UnlaunchableAppActivity.java +++ b/core/java/com/android/internal/app/UnlaunchableAppActivity.java @@ -21,24 +21,15 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import android.app.Activity; import android.app.AlertDialog; -import android.app.admin.DevicePolicyManager; import android.content.ComponentName; -import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; -import android.text.TextUtils; import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; import android.view.Window; -import android.widget.TextView; import com.android.internal.R; @@ -85,14 +76,9 @@ public class UnlaunchableAppActivity extends Activity return; } - View rootView = LayoutInflater.from(this).inflate(R.layout.unlaunchable_app_activity, null); - TextView titleView = (TextView)rootView.findViewById(R.id.unlaunchable_app_title); - TextView messageView = (TextView)rootView.findViewById(R.id.unlaunchable_app_message); - titleView.setText(dialogTitle); - messageView.setText(dialogMessage); - AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setView(rootView) + .setTitle(dialogTitle) + .setMessage(dialogMessage) .setOnDismissListener(this); if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) { builder.setPositiveButton(R.string.work_mode_turn_on, this) diff --git a/core/java/com/android/internal/net/OWNERS b/core/java/com/android/internal/net/OWNERS index 10d44bdecb83..ef44ef7452f4 100644 --- a/core/java/com/android/internal/net/OWNERS +++ b/core/java/com/android/internal/net/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com jsharkey@android.com lorenzo@google.com diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 39279b5055b1..74802c8bdf79 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -583,7 +583,7 @@ public class ZygoteInit { installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName, instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter, uuid, classLoaderContext, seInfo, false /* downgrade */, - targetSdkVersion, /*profileName*/ null); + targetSdkVersion, /*profileName*/ null, /*dexMetadataPath*/ null); } catch (RemoteException | ServiceSpecificException e) { // Ignore (but log), we need this on the classpath for fallback mode. Log.w(TAG, "Failed compiling classpath element for system server: " diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java index 245a66e4b566..1376687be019 100644 --- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java +++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java @@ -96,4 +96,14 @@ public class MetricsLoggerWrapper { context.getApplicationInfo().className, StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN); } + + public static void logAppOverlayEnter(int uid, String packageName, boolean usingAlertWindow) { + StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, usingAlertWindow, + StatsLog.OVERLAY_STATE_CHANGED__STATE__ENTERED); + } + + public static void logAppOverlayExit(int uid, String packageName, boolean usingAlertWindow) { + StatsLog.write(StatsLog.OVERLAY_STATE_CHANGED, uid, packageName, usingAlertWindow, + StatsLog.OVERLAY_STATE_CHANGED__STATE__EXITED); + } } diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 34b5ec8149a7..03a7cd26da36 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -3158,7 +3158,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { Bundle args = new Bundle(); args.putInt(Intent.EXTRA_ASSIST_INPUT_DEVICE_ID, event.getDeviceId()); return ((SearchManager)getContext().getSystemService(Context.SEARCH_SERVICE)) - .launchLegacyAssist(null, UserHandle.myUserId(), args); + .launchLegacyAssist(null, getContext().getUserId(), args); } return result; } diff --git a/core/java/com/android/internal/print/DumpUtils.java b/core/java/com/android/internal/print/DumpUtils.java index 3192d5cbbd1d..1916c11e9c9d 100644 --- a/core/java/com/android/internal/print/DumpUtils.java +++ b/core/java/com/android/internal/print/DumpUtils.java @@ -16,10 +16,9 @@ package com.android.internal.print; +import static com.android.internal.util.dump.DumpUtils.writeComponentName; + import android.annotation.NonNull; -import android.annotation.Nullable; -import android.content.ComponentName; -import android.content.ComponentNameProto; import android.content.Context; import android.print.PageRange; import android.print.PrintAttributes; @@ -40,42 +39,13 @@ import android.service.print.PrinterIdProto; import android.service.print.PrinterInfoProto; import android.service.print.ResolutionProto; +import com.android.internal.util.dump.DualDumpOutputStream; + /** * Utilities for dumping print related proto buffer */ public class DumpUtils { /** - * Write a string to a proto if the string is not {@code null}. - * - * @param proto The proto to write to - * @param idName Clear text name of the proto-id - * @param id The proto-id of the string - * @param string The string to write - */ - public static void writeStringIfNotNull(@NonNull DualDumpOutputStream proto, String idName, - long id, @Nullable String string) { - if (string != null) { - proto.write(idName, id, string); - } - } - - /** - * Write a {@link ComponentName} to a proto. - * - * @param proto The proto to write to - * @param idName Clear text name of the proto-id - * @param id The proto-id of the component name - * @param component The component name to write - */ - public static void writeComponentName(@NonNull DualDumpOutputStream proto, String idName, - long id, @NonNull ComponentName component) { - long token = proto.start(idName, id); - proto.write("package_name", ComponentNameProto.PACKAGE_NAME, component.getPackageName()); - proto.write("class_name", ComponentNameProto.CLASS_NAME, component.getClassName()); - proto.end(token); - } - - /** * Write a {@link PrinterId} to a proto. * * @param proto The proto to write to diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index ebb5f9f9e446..f70d3c2a27fd 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -132,6 +132,12 @@ oneway interface IStatusBar void clickQsTile(in ComponentName tile); void handleSystemKey(in int key); + /** + * Methods to show toast messages for screen pinning + */ + void showPinningEnterExitToast(boolean entering); + void showPinningEscapeToast(); + void showShutdownUi(boolean isReboot, String reason); // Used to show the dialog when FingerprintService starts authentication diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index cb0b53c495dc..adf42878ebb3 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -81,6 +81,12 @@ interface IStatusBarService void clickTile(in ComponentName tile); void handleSystemKey(in int key); + /** + * Methods to show toast messages for screen pinning + */ + void showPinningEnterExitToast(boolean entering); + void showPinningEscapeToast(); + // Used to show the dialog when FingerprintService starts authentication void showFingerprintDialog(in Bundle bundle, IFingerprintDialogReceiver receiver); // Used to hide the dialog when a finger is authenticated diff --git a/core/java/com/android/internal/usb/DumpUtils.java b/core/java/com/android/internal/usb/DumpUtils.java new file mode 100644 index 000000000000..cac22652ebd7 --- /dev/null +++ b/core/java/com/android/internal/usb/DumpUtils.java @@ -0,0 +1,237 @@ +/* + * Copyright (C) 2018 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.usb; + +import static android.hardware.usb.UsbPort.MODE_AUDIO_ACCESSORY; +import static android.hardware.usb.UsbPort.MODE_DEBUG_ACCESSORY; +import static android.hardware.usb.UsbPort.MODE_DFP; +import static android.hardware.usb.UsbPort.MODE_DUAL; +import static android.hardware.usb.UsbPort.MODE_NONE; +import static android.hardware.usb.UsbPort.MODE_UFP; + +import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; + +import android.annotation.NonNull; +import android.hardware.usb.UsbAccessory; +import android.hardware.usb.UsbConfiguration; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.hardware.usb.UsbPort; +import android.hardware.usb.UsbPortStatus; +import android.hardware.usb.V1_0.Constants; +import android.service.usb.UsbAccessoryProto; +import android.service.usb.UsbConfigurationProto; +import android.service.usb.UsbDeviceProto; +import android.service.usb.UsbEndPointProto; +import android.service.usb.UsbInterfaceProto; +import android.service.usb.UsbPortProto; +import android.service.usb.UsbPortStatusProto; +import android.service.usb.UsbPortStatusRoleCombinationProto; + +import com.android.internal.util.dump.DualDumpOutputStream; + +/** Dump methods for public USB classes */ +public class DumpUtils { + public static void writeAccessory(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbAccessory accessory) { + long token = dump.start(idName, id); + + dump.write("manufacturer", UsbAccessoryProto.MANUFACTURER, accessory.getManufacturer()); + dump.write("model", UsbAccessoryProto.MODEL, accessory.getModel()); + writeStringIfNotNull(dump, "description", UsbAccessoryProto.DESCRIPTION, + accessory.getManufacturer()); + dump.write("version", UsbAccessoryProto.VERSION, accessory.getVersion()); + writeStringIfNotNull(dump, "uri", UsbAccessoryProto.URI, accessory.getUri()); + dump.write("serial", UsbAccessoryProto.SERIAL, accessory.getSerial()); + + dump.end(token); + } + + public static void writeDevice(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbDevice device) { + long token = dump.start(idName, id); + + dump.write("name", UsbDeviceProto.NAME, device.getDeviceName()); + dump.write("vendor_id", UsbDeviceProto.VENDOR_ID, device.getVendorId()); + dump.write("product_id", UsbDeviceProto.PRODUCT_ID, device.getProductId()); + dump.write("class", UsbDeviceProto.CLASS, device.getDeviceClass()); + dump.write("subclass", UsbDeviceProto.SUBCLASS, device.getDeviceSubclass()); + dump.write("protocol", UsbDeviceProto.PROTOCOL, device.getDeviceProtocol()); + dump.write("manufacturer_name", UsbDeviceProto.MANUFACTURER_NAME, + device.getManufacturerName()); + dump.write("product_name", UsbDeviceProto.PRODUCT_NAME, device.getProductName()); + dump.write("version", UsbDeviceProto.VERSION, device.getVersion()); + dump.write("serial_number", UsbDeviceProto.SERIAL_NUMBER, device.getSerialNumber()); + + int numConfigurations = device.getConfigurationCount(); + for (int i = 0; i < numConfigurations; i++) { + writeConfiguration(dump, "configurations", UsbDeviceProto.CONFIGURATIONS, + device.getConfiguration(i)); + } + + dump.end(token); + } + + private static void writeConfiguration(@NonNull DualDumpOutputStream dump, + @NonNull String idName, long id, @NonNull UsbConfiguration configuration) { + long token = dump.start(idName, id); + dump.write("id", UsbConfigurationProto.ID, configuration.getId()); + dump.write("name", UsbConfigurationProto.NAME, configuration.getName()); + dump.write("attributes", UsbConfigurationProto.ATTRIBUTES, configuration.getAttributes()); + dump.write("max_power", UsbConfigurationProto.MAX_POWER, configuration.getMaxPower()); + + int numInterfaces = configuration.getInterfaceCount(); + for (int i = 0; i < numInterfaces; i++) { + writeInterface(dump, "interfaces", UsbConfigurationProto.INTERFACES, + configuration.getInterface(i)); + } + dump.end(token); + } + + private static void writeInterface(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbInterface iface) { + long token = dump.start(idName, id); + + dump.write("id", UsbInterfaceProto.ID, iface.getId()); + dump.write("alternate_settings", UsbInterfaceProto.ALTERNATE_SETTINGS, + iface.getAlternateSetting()); + dump.write("name", UsbInterfaceProto.NAME, iface.getName()); + dump.write("class", UsbInterfaceProto.CLASS, iface.getInterfaceClass()); + dump.write("subclass", UsbInterfaceProto.SUBCLASS, iface.getInterfaceSubclass()); + dump.write("protocol", UsbInterfaceProto.PROTOCOL, iface.getInterfaceProtocol()); + + int numEndpoints = iface.getEndpointCount(); + for (int i = 0; i < numEndpoints; i++) { + writeEndpoint(dump, "endpoints", UsbInterfaceProto.ENDPOINTS, iface.getEndpoint(i)); + } + dump.end(token); + } + + private static void writeEndpoint(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbEndpoint endpoint) { + long token = dump.start(idName, id); + + dump.write("endpoint_number", UsbEndPointProto.ENDPOINT_NUMBER, + endpoint.getEndpointNumber()); + dump.write("direction", UsbEndPointProto.DIRECTION, endpoint.getDirection()); + dump.write("address", UsbEndPointProto.ADDRESS, endpoint.getAddress()); + dump.write("type", UsbEndPointProto.TYPE, endpoint.getType()); + dump.write("attributes", UsbEndPointProto.ATTRIBUTES, + endpoint.getAttributes()); + dump.write("max_packet_size", UsbEndPointProto.MAX_PACKET_SIZE, + endpoint.getMaxPacketSize()); + dump.write("interval", UsbEndPointProto.INTERVAL, endpoint.getInterval()); + + dump.end(token); + } + + public static void writePort(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbPort port) { + long token = dump.start(idName, id); + + dump.write("id", UsbPortProto.ID, port.getId()); + + int mode = port.getSupportedModes(); + if (dump.isProto()) { + if (mode == MODE_NONE) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_NONE); + } else { + if ((mode & MODE_DUAL) == MODE_DUAL) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_DUAL); + } else { + if ((mode & MODE_DFP) == MODE_DFP) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_DFP); + } else if ((mode & MODE_UFP) == MODE_UFP) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, MODE_UFP); + } + } + + if ((mode & MODE_AUDIO_ACCESSORY) == MODE_AUDIO_ACCESSORY) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, + MODE_AUDIO_ACCESSORY); + } + + if ((mode & MODE_DEBUG_ACCESSORY) == MODE_DEBUG_ACCESSORY) { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, + MODE_DEBUG_ACCESSORY); + } + } + } else { + dump.write("supported_modes", UsbPortProto.SUPPORTED_MODES, UsbPort.modeToString(mode)); + } + + dump.end(token); + } + + private static void writePowerRole(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, int powerRole) { + if (dump.isProto()) { + dump.write(idName, id, powerRole); + } else { + dump.write(idName, id, UsbPort.powerRoleToString(powerRole)); + } + } + + private static void writeDataRole(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, int dataRole) { + if (dump.isProto()) { + dump.write(idName, id, dataRole); + } else { + dump.write(idName, id, UsbPort.dataRoleToString(dataRole)); + } + } + + + public static void writePortStatus(@NonNull DualDumpOutputStream dump, @NonNull String idName, + long id, @NonNull UsbPortStatus status) { + long token = dump.start(idName, id); + + dump.write("connected", UsbPortStatusProto.CONNECTED, status.isConnected()); + + if (dump.isProto()) { + dump.write("current_mode", UsbPortStatusProto.CURRENT_MODE, status.getCurrentMode()); + } else { + dump.write("current_mode", UsbPortStatusProto.CURRENT_MODE, + UsbPort.modeToString(status.getCurrentMode())); + } + + writePowerRole(dump, "power_role", UsbPortStatusProto.POWER_ROLE, + status.getCurrentPowerRole()); + writeDataRole(dump, "data_role", UsbPortStatusProto.DATA_ROLE, status.getCurrentDataRole()); + + int undumpedCombinations = status.getSupportedRoleCombinations(); + while (undumpedCombinations != 0) { + int index = Integer.numberOfTrailingZeros(undumpedCombinations); + undumpedCombinations &= ~(1 << index); + + int powerRole = (index / Constants.PortDataRole.NUM_DATA_ROLES + + Constants.PortPowerRole.NONE); + int dataRole = index % Constants.PortDataRole.NUM_DATA_ROLES; + + long roleCombinationToken = dump.start("role_combinations", + UsbPortStatusProto.ROLE_COMBINATIONS); + writePowerRole(dump, "power_role", UsbPortStatusRoleCombinationProto.POWER_ROLE, + powerRole); + writeDataRole(dump, "data_role", UsbPortStatusRoleCombinationProto.DATA_ROLE, + dataRole); + dump.end(roleCombinationToken); + } + + dump.end(token); + } +} diff --git a/core/java/com/android/internal/print/DualDumpOutputStream.java b/core/java/com/android/internal/util/dump/DualDumpOutputStream.java index 4b10ef2facbb..3ac38edaddb4 100644 --- a/core/java/com/android/internal/print/DualDumpOutputStream.java +++ b/core/java/com/android/internal/util/dump/DualDumpOutputStream.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.print; +package com.android.internal.util.dump; import android.annotation.NonNull; import android.annotation.Nullable; @@ -131,27 +131,27 @@ public class DualDumpOutputStream { } } - /** - * Create a new DualDumpOutputStream. Only one output should be set. + * Create a new DualDumpOutputStream. * - * @param proto If dumping to proto the {@link ProtoOutputStream} - * @param ipw If dumping to a print writer, the {@link IndentingPrintWriter} + * @param proto the {@link ProtoOutputStream} */ - public DualDumpOutputStream(@Nullable ProtoOutputStream proto, - @Nullable IndentingPrintWriter ipw) { - if ((proto == null) == (ipw == null)) { - Log.e(LOG_TAG, "Cannot dump to clear text and proto at once. Ignoring proto"); - proto = null; - } - + public DualDumpOutputStream(@NonNull ProtoOutputStream proto) { mProtoStream = proto; + mIpw = null; + } + + /** + * Create a new DualDumpOutputStream. + * + * @param ipw the {@link IndentingPrintWriter} + */ + public DualDumpOutputStream(@NonNull IndentingPrintWriter ipw) { + mProtoStream = null; mIpw = ipw; - if (!isProto()) { - // Add root object - mDumpObjects.add(new DumpObject(null)); - } + // Add root object + mDumpObjects.add(new DumpObject(null)); } public void write(@NonNull String fieldName, long fieldId, double val) { diff --git a/core/java/com/android/internal/util/dump/DumpUtils.java b/core/java/com/android/internal/util/dump/DumpUtils.java new file mode 100644 index 000000000000..0ee204e1acac --- /dev/null +++ b/core/java/com/android/internal/util/dump/DumpUtils.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2018 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.util.dump; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.ComponentName; +import android.content.ComponentNameProto; + +public class DumpUtils { + /** + * Write a string to a proto if the string is not {@code null}. + * + * @param proto The proto to write to + * @param idName Clear text name of the proto-id + * @param id The proto-id of the string + * @param string The string to write + */ + public static void writeStringIfNotNull(@NonNull DualDumpOutputStream proto, String idName, + long id, @Nullable String string) { + if (string != null) { + proto.write(idName, id, string); + } + } + + /** + * Write a {@link ComponentName} to a proto. + * + * @param proto The proto to write to + * @param idName Clear text name of the proto-id + * @param id The proto-id of the component name + * @param component The component name to write + */ + public static void writeComponentName(@NonNull DualDumpOutputStream proto, String idName, + long id, @NonNull ComponentName component) { + long token = proto.start(idName, id); + proto.write("package_name", ComponentNameProto.PACKAGE_NAME, component.getPackageName()); + proto.write("class_name", ComponentNameProto.CLASS_NAME, component.getClassName()); + proto.end(token); + } +} diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 5e0a986b432b..02822869f421 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -68,6 +68,7 @@ interface IInputMethodManager { void showInputMethodPickerFromClient(in IInputMethodClient client, int auxiliarySubtypeMode); void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId); + boolean isInputMethodPickerShownForTest(); void setInputMethod(in IBinder token, String id); void setInputMethodAndSubtype(in IBinder token, String id, in InputMethodSubtype subtype); void hideMySoftInput(in IBinder token, int flags); diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 5673814ca362..732534ccbcbe 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -66,6 +66,8 @@ interface ILockSettings { void initRecoveryService(in String rootCertificateAlias, in byte[] signedPublicKeyList); KeyChainSnapshot getKeyChainSnapshot(); byte[] generateAndStoreKey(String alias); + String generateKey(String alias, in byte[] account); + String getKey(String alias); void removeKey(String alias); void setSnapshotCreatedPendingIntent(in PendingIntent intent); Map getRecoverySnapshotVersions(); diff --git a/core/java/com/android/server/backup/SliceBackupHelper.java b/core/java/com/android/server/backup/SliceBackupHelper.java new file mode 100644 index 000000000000..8e5a5eecec89 --- /dev/null +++ b/core/java/com/android/server/backup/SliceBackupHelper.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2018 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.backup; + +import android.app.backup.BlobBackupHelper; +import android.app.slice.ISliceManager; +import android.content.Context; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.util.Log; +import android.util.Slog; + +public class SliceBackupHelper extends BlobBackupHelper { + static final String TAG = "SliceBackupHelper"; + static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + // Current version of the blob schema + static final int BLOB_VERSION = 1; + + // Key under which the payload blob is stored + static final String KEY_SLICES = "slices"; + + public SliceBackupHelper(Context context) { + super(BLOB_VERSION, KEY_SLICES); + // context is currently unused + } + + @Override + protected byte[] getBackupPayload(String key) { + byte[] newPayload = null; + if (KEY_SLICES.equals(key)) { + try { + ISliceManager sm = ISliceManager.Stub.asInterface( + ServiceManager.getService(Context.SLICE_SERVICE)); + // TODO: http://b/22388012 + newPayload = sm.getBackupPayload(UserHandle.USER_SYSTEM); + } catch (Exception e) { + // Treat as no data + Slog.e(TAG, "Couldn't communicate with slice manager"); + newPayload = null; + } + } + return newPayload; + } + + @Override + protected void applyRestoredPayload(String key, byte[] payload) { + if (DEBUG) Slog.v(TAG, "Got restore of " + key); + + if (KEY_SLICES.equals(key)) { + try { + ISliceManager sm = ISliceManager.Stub.asInterface( + ServiceManager.getService(Context.SLICE_SERVICE)); + // TODO: http://b/22388012 + sm.applyRestore(payload, UserHandle.USER_SYSTEM); + } catch (Exception e) { + Slog.e(TAG, "Couldn't communicate with slice manager"); + } + } + } + +} diff --git a/core/java/com/android/server/backup/SystemBackupAgent.java b/core/java/com/android/server/backup/SystemBackupAgent.java index a96b5dd3ed70..47e7a0e74563 100644 --- a/core/java/com/android/server/backup/SystemBackupAgent.java +++ b/core/java/com/android/server/backup/SystemBackupAgent.java @@ -51,6 +51,7 @@ public class SystemBackupAgent extends BackupAgentHelper { private static final String USAGE_STATS_HELPER = "usage_stats"; private static final String SHORTCUT_MANAGER_HELPER = "shortcut_manager"; private static final String ACCOUNT_MANAGER_HELPER = "account_manager"; + private static final String SLICES_HELPER = "slices"; // These paths must match what the WallpaperManagerService uses. The leaf *_FILENAME // are also used in the full-backup file format, so must not change unless steps are @@ -88,6 +89,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); + addHelper(SLICES_HELPER, new SliceBackupHelper(this)); super.onBackup(oldState, data, newState); } @@ -116,6 +118,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); + addHelper(SLICES_HELPER, new SliceBackupHelper(this)); super.onRestore(data, appVersionCode, newState); } diff --git a/core/java/com/android/server/net/OWNERS b/core/java/com/android/server/net/OWNERS index 6f77e04da3c0..ce50558bf4f6 100644 --- a/core/java/com/android/server/net/OWNERS +++ b/core/java/com/android/server/net/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com lorenzo@google.com satk@google.com diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 8a04bf7253e4..0b0ed8386c60 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -42,6 +42,7 @@ import "frameworks/base/core/proto/android/service/notification.proto"; import "frameworks/base/core/proto/android/service/package.proto"; import "frameworks/base/core/proto/android/service/print.proto"; import "frameworks/base/core/proto/android/service/procstats.proto"; +import "frameworks/base/core/proto/android/service/usb.proto"; import "frameworks/base/core/proto/android/util/event_log_tags.proto"; import "frameworks/base/core/proto/android/util/log.proto"; import "frameworks/base/libs/incident/proto/android/os/header.proto"; @@ -254,4 +255,9 @@ message IncidentProto { (section).type = SECTION_DUMPSYS, (section).args = "jobscheduler --proto" ]; + + optional android.service.usb.UsbServiceDumpProto usb = 3021 [ + (section).type = SECTION_DUMPSYS, + (section).args = "usb --proto" + ]; } diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto index bfd575a5b18d..ff0f4fd4d3ac 100644 --- a/core/proto/android/providers/settings.proto +++ b/core/proto/android/providers/settings.proto @@ -208,7 +208,7 @@ message GlobalSettingsProto { optional SettingProto wifi_on = 136 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto wifi_scan_always_available = 137 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto wifi_wakeup_enabled = 138 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto wifi_wakeup_available = 305 [ (android.privacy).dest = DEST_AUTOMATIC ]; + reserved 305; // Removed wifi_wakeup_available optional SettingProto network_scoring_ui_enabled = 306 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto speed_label_cache_eviction_age_millis = 307 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto recommended_network_evaluator_cache_expiry_ms = 308 [ (android.privacy).dest = DEST_AUTOMATIC ]; diff --git a/core/proto/android/server/alarmmanagerservice.proto b/core/proto/android/server/alarmmanagerservice.proto index aa2663fa2cc4..0342c9c89527 100644 --- a/core/proto/android/server/alarmmanagerservice.proto +++ b/core/proto/android/server/alarmmanagerservice.proto @@ -27,6 +27,7 @@ package com.android.server; option java_multiple_files = true; +// next ID: 43 message AlarmManagerServiceProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; @@ -114,7 +115,14 @@ message AlarmManagerServiceProto { optional int32 uid = 1; // In the 'elapsed' timebase. optional int64 time_ms = 2; + + // Time when the next while-idle is allowed, in the 'elapsed' timebase. + optional int64 next_allowed_ms = 3; } + + // Whether the short or long while-idle timeout should be used for each UID. + repeated int32 use_allow_while_idle_short_time = 42; + // For each uid, this is the last time we dispatched an "allow while idle" // alarm, used to determine the earliest we can dispatch the next such alarm. repeated LastAllowWhileIdleDispatch last_allow_while_idle_dispatch_times = 36; diff --git a/core/proto/android/server/forceappstandbytracker.proto b/core/proto/android/server/forceappstandbytracker.proto index 43c869c76705..5296e4764f0c 100644 --- a/core/proto/android/server/forceappstandbytracker.proto +++ b/core/proto/android/server/forceappstandbytracker.proto @@ -24,14 +24,19 @@ package com.android.server; option java_multiple_files = true; // Dump from com.android.server.ForceAppStandbyTracker. +// +// Next ID: 12 message ForceAppStandbyTrackerProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; // Whether all apps are forced standby or not. optional bool force_all_apps_standby = 1; + // UIDs currently active. + repeated int32 active_uids = 2; + // UIDs currently in the foreground. - repeated int32 foreground_uids = 2; + repeated int32 foreground_uids = 11; // App ids that are in power-save whitelist. repeated int32 power_save_whitelist_app_ids = 3; diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index c11058a22107..449e54672207 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -295,7 +295,6 @@ message WindowStateProto { optional bool animating_exit = 14; repeated WindowStateProto child_windows = 15; optional .android.graphics.RectProto surface_position = 16; - optional .android.graphics.RectProto shown_position = 17; optional int32 requested_width = 18; optional int32 requested_height = 19; optional int32 view_visibility = 20; diff --git a/core/proto/android/service/enums.proto b/core/proto/android/service/enums.proto new file mode 100644 index 000000000000..b64e685104b7 --- /dev/null +++ b/core/proto/android/service/enums.proto @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2018 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. + */ + +syntax = "proto2"; +package android.service; + +option java_outer_classname = "ServiceProtoEnums"; +option java_multiple_files = true; + +enum UsbEndPointType { + USB_ENDPOINT_TYPE_XFER_CONTROL = 0; + USB_ENDPOINT_TYPE_XFER_ISOC = 1; + USB_ENDPOINT_TYPE_XFER_BULK = 2; + USB_ENDPOINT_TYPE_XFER_INT = 3; +} + +enum UsbEndPointDirection { + USB_ENDPOINT_DIR_OUT = 0; + USB_ENDPOINT_DIR_IN = 0x80; +} + +enum UsbConnectionRecordMode { + USB_CONNECTION_RECORD_MODE_CONNECT = 0; + USB_CONNECTION_RECORD_MODE_CONNECT_BADPARSE = 1; + USB_CONNECTION_RECORD_MODE_CONNECT_BADDEVICE = 2; + USB_CONNECTION_RECORD_MODE_DISCONNECT = -1; +}
\ No newline at end of file diff --git a/core/proto/android/service/network_watchlist.proto b/core/proto/android/service/network_watchlist.proto new file mode 100644 index 000000000000..fb03b93974aa --- /dev/null +++ b/core/proto/android/service/network_watchlist.proto @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 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. + */ + +syntax = "proto2"; +package com.android.service; + +option java_multiple_files = true; + +// It will be used by com.android.server.net.watchlist.ReportEncoder to +// generate network watchlist report. +message NetworkWatchlistReportProto { + + optional int32 report_version = 1; + + optional string watchlist_config_hash = 2; + + repeated NetworkWatchlistAppResultProto app_result = 3; +} + +message NetworkWatchlistAppResultProto { + optional string app_digest = 1; + optional bool encoded_result = 2; +} diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto new file mode 100644 index 000000000000..b60c56995223 --- /dev/null +++ b/core/proto/android/service/usb.proto @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2018 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. + */ + +syntax = "proto2"; +package android.service.usb; + +option java_multiple_files = true; +option java_outer_classname = "UsbServiceProto"; + +import "frameworks/base/core/proto/android/content/component_name.proto"; +import "frameworks/base/core/proto/android/service/enums.proto"; +import "frameworks/base/libs/incident/proto/android/privacy.proto"; + +message UsbServiceDumpProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbDeviceManagerProto device_manager = 1; + optional UsbHostManagerProto host_manager = 2; + optional UsbPortManagerProto port_manager = 3; + optional UsbAlsaManagerProto alsa_manager = 4; + optional UsbSettingsManagerProto settings_manager = 5; +} + +message UsbDeviceManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbHandlerProto handler = 1; + optional UsbDebuggingManagerProto debugging_manager = 2; +} + +message UsbHandlerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + /* Same as android.hardware.usb.gadget.V1_0.GadgetFunction.* */ + enum Function { + FUNCTION_ADB = 1; + FUNCTION_ACCESSORY = 2; + FUNCTION_MTP = 4; + FUNCTION_MIDI = 8; + FUNCTION_PTP = 16; + FUNCTION_RNDIS = 32; + FUNCTION_AUDIO_SOURCE = 64; + } + + repeated Function current_functions = 1; + optional bool current_functions_applied = 2; + repeated Function screen_unlocked_functions = 3; + optional bool screen_locked = 4; + optional bool connected = 5; + optional bool configured = 6; + optional UsbAccessoryProto current_accessory = 7; + optional bool host_connected = 8; + optional bool source_power = 9; + optional bool sink_power = 10; + optional bool usb_charging = 11; + optional bool hide_usb_notification = 12; + optional bool audio_accessory_connected = 13; + optional bool adb_enabled = 14; + optional string kernel_state = 15; + optional string kernel_function_list = 16; +} + +message UsbAccessoryProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string manufacturer = 1; + optional string model = 2; + optional string description = 3; + optional string version = 4; + optional string uri = 5; + optional string serial = 6 [ (android.privacy).dest = DEST_EXPLICIT ]; +} + +message UsbDebuggingManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional bool connected_to_adb = 1; + optional string last_key_recevied = 2 [ (android.privacy).dest = DEST_EXPLICIT ]; + optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ]; + optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ]; +} + +message UsbHostManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional android.content.ComponentNameProto default_usb_host_connection_handler = 1; + repeated UsbDeviceProto devices = 2; + optional int32 num_connects = 3; + repeated UsbConnectionRecordProto connections = 4; +} + +message UsbDeviceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string name = 1; + optional int32 vendor_id = 2; + optional int32 product_id = 3; + optional int32 class = 4; + optional int32 subclass = 5; + optional int32 protocol = 6; + optional string manufacturer_name = 7; + optional string product_name = 8; + optional string version = 9; + optional string serial_number = 10 [ (android.privacy).dest = DEST_EXPLICIT ]; + repeated UsbConfigurationProto configurations = 11; +} + +message UsbConfigurationProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 id = 1; + optional string name = 2; + optional uint32 attributes = 3; + optional int32 max_power = 4; + repeated UsbInterfaceProto interfaces = 5; +} + +message UsbInterfaceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 id = 1; + optional int32 alternate_settings = 2; + optional string name = 3; + optional int32 class = 4; + optional int32 subclass = 5; + optional int32 protocol = 6; + repeated UsbEndPointProto endpoints = 7; +} + +message UsbEndPointProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 endpoint_number = 1; + optional android.service.UsbEndPointDirection direction = 2; + optional int32 address = 3; + optional android.service.UsbEndPointType type = 4; + optional uint32 attributes = 5; + optional int32 max_packet_size = 6; + optional int32 interval = 7; +} + +message UsbConnectionRecordProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string device_address = 1; + optional android.service.UsbConnectionRecordMode mode = 2; + optional int64 timestamp = 3; + optional int32 manufacturer = 4; + optional int32 product = 5; + optional UsbIsHeadsetProto is_headset = 6; +} + +message UsbIsHeadsetProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional bool in = 1; + optional bool out = 2; +} + +message UsbPortManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional bool is_simulation_active = 1; + repeated UsbPortInfoProto usb_ports = 2; +} + +message UsbPortInfoProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbPortProto port = 1; + optional UsbPortStatusProto status = 2; + optional bool can_change_mode = 3; + optional bool can_change_power_role = 4; + optional bool can_change_data_role = 5; +} + +message UsbPortProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + /* Same as android.hardware.usb.V1_1.Constants.PortMode_1_1 */ + enum Mode { + MODE_NONE = 0; + MODE_UFP = 1; + MODE_DFP = 2; + MODE_DRP = 3; + MODE_AUDIO_ACCESSORY = 4; + MODE_DEBUG_ACCESSORY = 8; + } + + optional string id = 1; + repeated Mode supported_modes = 2; +} + +message UsbPortStatusProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + /* Same as android.hardware.usb.V1_0.Constants.PortPowerRole */ + enum PowerRole { + POWER_ROLE_NONE = 0; + POWER_ROLE_SOURCE = 1; + POWER_ROLE_SINK = 2; + } + + /* Same as android.hardware.usb.V1_0.Constants.PortDataRole */ + enum DataRole { + DATA_ROLE_NONE = 0; + DATA_ROLE_HOST = 1; + DATA_ROLE_DEVICE = 2; + } + + optional bool connected = 1; + optional UsbPortProto.Mode current_mode = 2; + optional PowerRole power_role = 3; + optional DataRole data_role = 4; + repeated UsbPortStatusRoleCombinationProto role_combinations = 5; +} + +message UsbPortStatusRoleCombinationProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbPortStatusProto.PowerRole power_role = 1; + optional UsbPortStatusProto.DataRole data_role = 2; +} + +message UsbAlsaManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 cards_parser = 1; + repeated UsbAlsaDeviceProto alsa_devices = 2; + repeated UsbMidiDeviceProto midi_devices = 3; +} + +message UsbAlsaDeviceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 card = 1; + optional int32 device = 2; + optional string name = 3; + optional bool has_playback = 4; + optional bool has_capture = 5; + optional string address = 6; +} + +message UsbMidiDeviceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 card = 1; + optional int32 device = 2; + optional string device_address = 3; +} + +message UsbSettingsManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + repeated UsbUserSettingsManagerProto user_settings = 1; + repeated UsbProfileGroupSettingsManagerProto profile_group_settings = 2; +} + +message UsbUserSettingsManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 user_id = 1; + repeated UsbSettingsDevicePermissionProto device_permissions = 2; + repeated UsbSettingsAccessoryPermissionProto accessory_permissions = 3; +} + +message UsbSettingsDevicePermissionProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string device_name = 1; + repeated int32 uids = 2; +} + +message UsbSettingsAccessoryPermissionProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string accessory_description = 1; + repeated int32 uids = 2; +} + +message UsbProfileGroupSettingsManagerProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 parent_user_id = 1; + repeated UsbSettingsDevicePreferenceProto device_preferences = 2; + repeated UsbSettingsAccessoryPreferenceProto accessory_preferences = 3; +} + +message UsbSettingsDevicePreferenceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbDeviceFilterProto filter = 1; + optional UserPackageProto user_package = 2; +} + +message UsbDeviceFilterProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 vendor_id = 1; + optional int32 product_id = 2; + optional int32 class = 3; + optional int32 subclass = 4; + optional int32 protocol = 5; + optional string manufacturer_name = 6; + optional string product_name = 7; + optional string serial_number = 8 [ (android.privacy).dest = DEST_EXPLICIT ]; +} + +message UserPackageProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional int32 user_id = 1; + optional string package_name =2; +} + +message UsbSettingsAccessoryPreferenceProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional UsbAccessoryFilterProto filter = 1; + optional UserPackageProto user_package = 2; +} + +message UsbAccessoryFilterProto { + option (android.msg_privacy).dest = DEST_AUTOMATIC; + + optional string manufacturer = 1; + optional string model = 2; + optional string version = 3; +}
\ No newline at end of file diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index d58b95a6697c..f627aaa7751e 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -323,6 +323,7 @@ <protected-broadcast android:name="com.android.server.usb.ACTION_OPEN_IN_APPS" /> <protected-broadcast android:name="com.android.server.am.DELETE_DUMPHEAP" /> <protected-broadcast android:name="com.android.server.net.action.SNOOZE_WARNING" /> + <protected-broadcast android:name="com.android.server.net.action.SNOOZE_RAPID" /> <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.USER_DISMISSED_NOTIFICATION" /> <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.CONNECT_TO_NETWORK" /> <protected-broadcast android:name="com.android.server.wifi.ConnectToNetworkNotification.PICK_WIFI_NETWORK" /> @@ -1792,14 +1793,23 @@ <permission android:name="android.permission.BIND_IMS_SERVICE" android:protectionLevel="signature|privileged|vendorPrivileged" /> - <!-- Must be required by a DataService to ensure that only the + <!-- Must be required by a telephony data service to ensure that only the system can bind to it. - <p>Protection level: signature|privileged|vendorPrivileged + <p>Protection level: signature @SystemApi @hide --> - <permission android:name="android.permission.BIND_DATA_SERVICE" - android:protectionLevel="signature|privileged|vendorPrivileged" /> + <permission android:name="android.permission.BIND_TELEPHONY_DATA_SERVICE" + android:protectionLevel="signature" /> + + <!-- Must be required by a NetworkService to ensure that only the + system can bind to it. + <p>Protection level: signature + @SystemApi + @hide + --> + <permission android:name="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" + android:protectionLevel="signature" /> <!-- Allows an application to manage embedded subscriptions (those on a eUICC) through EuiccManager APIs. @@ -4179,6 +4189,16 @@ <service android:name="com.android.server.display.BrightnessIdleJob" android:permission="android.permission.BIND_JOB_SERVICE" > </service> + + <service + android:name="com.android.server.autofill.AutofillCompatAccessibilityService" + android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" + android:exported="true"> + <meta-data + android:name="android.accessibilityservice" + android:resource="@xml/autofill_compat_accessibility_service" /> + </service> + </application> </manifest> diff --git a/core/res/res/layout/unlaunchable_app_activity.xml b/core/res/res/layout/unlaunchable_app_activity.xml deleted file mode 100644 index 429d5edea8b7..000000000000 --- a/core/res/res/layout/unlaunchable_app_activity.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 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="wrap_content" - android:layout_height="wrap_content" - android:padding="@dimen/dialog_padding" - android:orientation="vertical"> - <TextView android:id="@+id/unlaunchable_app_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="@dimen/dialog_padding" - android:paddingBottom="@dimen/dialog_padding" - android:textAppearance="@android:style/TextAppearance.Material.Title" /> - - <TextView android:id="@+id/unlaunchable_app_message" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingStart="@dimen/dialog_padding" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="?android:attr/textColorSecondary" /> -</LinearLayout> - diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index f3db59883233..ab54ad84a785 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Veiligmodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-stelsel"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Skakel oor na persoonlike profiel"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Skakel oor na werkprofiel"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"in te gaan by jou kontakte"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Gee <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot jou kontakte"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Laat die program toe om toegang tot die foonfunksies van die toestel te verkry. Hierdie toestemming laat die program toe om te bepaal wat die foonnommer en toestel-IDs is, of die oproep aan die gang is, en die afgeleë nommer wat deur \'n oproep verbind word."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"roeteer oproepe deur die stelsel"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Laat die program toe om sy oproepe deur die stelsel te stuur om die oproepervaring te verbeter."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"gaan voort met \'n oproep uit \'n ander program"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Laat die program toe om \'n oproep voort te sit wat in \'n ander program begin is."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lees foonnommers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Laat die program toe om toegang tot die toestel se foonnommers te kry."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"verhoed dat tablet slaap"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan nie gestoor word nie. Verwyder asseblief \'n bestaande vingerafdruk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukhandeling is gekanselleer."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Vingerafdrukhandeling is deur gebruiker gekanselleer."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogings. Probeer later weer."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Te veel pogings. Vingerafdruksensor is gedeaktiveer."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer weer."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Maak oop"</string> <string name="sms" msgid="4560537514610063430">"SMS"</string> <string name="add_contact" msgid="7867066569670597203">"Voeg by"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Bekyk"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Skeduleer"</string> + <string name="view_flight" msgid="7691640491425680214">"Spoor na"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Bergingspasie word min"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Sommige stelselfunksies werk moontlik nie"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nie genoeg berging vir die stelsel nie. Maak seker jy het 250 MB spasie beskikbaar en herbegin."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Oop Wi-Fi-netwerk beskikbaar</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Koppel aan oop Wi-Fi-netwerk"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koppel aan diensverskaffer se Wi‑Fi-netwerk"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Koppel tans aan oop Wi‑Fi-netwerk"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Aan Wi-Fi-netwerk gekoppel"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kon nie aan Wi-Fi-netwerk koppel nie"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Geen toestemmings benodig nie"</string> <string name="perm_costs_money" msgid="4902470324142151116">"dit kan jou dalk geld kos"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB laai tans hierdie toestel"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB verskaf tans krag aan gekoppelde toestel"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB vir lêeroordrag"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB vir foto-oordrag"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB vir MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Gekoppel aan \'n USB-toebehoorsel"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tik vir meer opsies."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoë oudiobykomstigheid bespeur"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Die aangehegde toestel is nie met hierdie foon versoenbaar nie. Tik om meer te wete te kom."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e werk-<xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Raak en hou die Terug- en Oorsig-knoppie om hierdie skerm te ontspeld"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Skerm vasgespeld"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Skerm ontspeld"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vra PIN voordat jy ontspeld"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vra ontsluitpatroon voordat jy ontspeld"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vra wagwoord voordat jy ontspeld"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle tale"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Allle streke"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Soek"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Skakel werkprofiel aan?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Jou werkprogramme, kennisgewings, data en ander werkprofielkenmerke sal aangeskakel word"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Skakel aan"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Hierdie program is vir \'n ouer weergawe van Android gebou en sal dalk nie behoorlik werk nie. Probeer kyk vir opdaterings, of kontak die ontwikkelaar."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Kyk vir opdatering"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Jy het nuwe boodskappe"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Maak SMS-program oop om te bekyk"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Sommige funksies kan beperk wees"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Foon nie toegelaat vir stem nie"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Opspringvenster"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Hierdie kortpad vereis die jongste program"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Kon nie die kortpad teruglaai nie omdat die program nie rugsteun en teruglaai steun nie"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Kon nie teruglaai nie omdat programondertekening nie ooreenstem nie"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kon nie kortpad teruglaai nie"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Kortpad is gedeaktiveer"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEΪNSTALLEER"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"MAAK TOG OOP"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Skadelike program is bespeur"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Wysig"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 0dbda7f927da..54b913e20001 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>፣ <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"የሚያስተማምን ሁነታ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android ስርዓት"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"ወደ የግል መገለጫ ቀይር"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"ወደ የስራ መገለጫ ቀይር"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ዕውቂያዎች"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"የእርስዎ እውቂያዎች ላይ ይድረሱባቸው"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> እውቂያዎችዎን እንዲደርስ ይፍቀዱለት"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"መተግበሪያው የመሳሪያውን የስልክ ባህሪያት ላይ እንዲደርስ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው የስልክ ቁጥሩን እና የመሳሪያውን መታወቂያዎች፣ ጥሪ የነቃ እንደሆነ፣ እና በጥሪ የተገናኘውን የሩቅ ቁጥር እንዲወስን ይፈቅድለታል።"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ጥሪዎችን በስርዓቱ በኩል አዙር"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"መተግበሪያው የጥሪ ተሞክሮን እንዲያሻሽል ጥሪዎቹን በስርዓቱ በኩል እንዲያዞር ያስችለዋል።"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"በሌላ መተግበሪያ የተጀመረ ጥሪን መቀጠል"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"መተግበሪያው በሌላ መተግበሪያ ውስጥ የተጀመረ ጥሪ እንዲቀጥል ያስችለዋል።"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ስልክ ቁጥሮች ያንብቡ"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"መተግበሪያው የመሣሪያውን የስልክ ቁጥሮች እንዲደርስባቸው ይፈቅድለታል።"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ጡባዊ ከማንቀላፋት ተከላከል"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"የጣት አሻራ ሊከማች አይችልም። እባክዎ አሁን ያለውን የጣት አሻራ ያስወግዱ።"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"የጣት አሻራ ስርዓተ ክወና ተትቷል።"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"የጣት አሻራ ክወና በተጠቃሚ ተሰርዟል።"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"በጣም ብዙ ሙከራዎች። የጣት አሻራ ዳሳሽ ተሰናክሏል።"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"እንደገና ይሞክሩ።"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"ጣት <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ክፈት"</string> <string name="sms" msgid="4560537514610063430">"መልዕክት"</string> <string name="add_contact" msgid="7867066569670597203">"አክል"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"ይመልከቱ"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"መርሐግብር"</string> + <string name="view_flight" msgid="7691640491425680214">"ተከታተል"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"የማከማቻ ቦታ እያለቀ ነው"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"አንዳንድ የስርዓት ተግባራት ላይሰሩ ይችላሉ"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ለስርዓቱ የሚሆን በቂ ቦታ የለም። 250 ሜባ ነጻ ቦታ እንዳለዎት ያረጋግጡና ዳግም ያስጀምሩ።"</string> @@ -1131,8 +1127,7 @@ <item quantity="other">የሚገኙ የWi-Fi አውታረ መረቦችን ክፈት</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ከክፍት የWi‑Fi አውታረ መረብ ጋር ያገናኙ"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ከአገልግሎት አቅራቢ Wi-Fi አውታረ መረብ ጋር ይገናኙ"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ከክፍት የWi‑Fi አውታረ መረብ ጋር በመገናኘት ላይ"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"ከWi‑Fi አውታረ መረብ ጋር ተገናኝቷል"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ከWi‑Fi አውታረ መረብ ጋር መገናኘት አልተቻለም"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"ምንም ፍቃዶች አይጠየቁም"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ይህ ገንዘብ ሊያስወጣዎት ይችላል"</string> <string name="dlg_ok" msgid="7376953167039865701">"እሺ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ዩኤስቢ የዚህን መሣሪያ ኃይል በመሙላት ላይ"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"ዩኤስቢ ለተያያዘው መሣሪያ ኃይል በማቅረብ ላይ"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ዩኤስቢ ለፋይል ሽግግር"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ዩኤስቢ ለፎቶ ሽግግር"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"ዩኤስቢ ለMIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ለUSB ተቀጥላ ተያይዟል"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"ለተጨማሪ አማራጮች መታ ያድርጉ።"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"የአናሎግ ኦዲዮ ረዳት እንዳለ ተደርሶበታል"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ዓባሪ የተያያዘው መሣሪያ ከዚህ ስልክ ጋር ተኳዃኝ አይደለም። የበለጠ ለመረዳት መታ ያድርጉ።"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ይህን ማያ ገጽ ለመንቀል ተመለስ እና አጠቃላይ ዕይታን ተጭነው ይያዙ"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"ማያ ገጽ ተሰክቷል"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"ማያ ገጽ ተነቅሏል"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ከመንቀል በፊት ፒን ጠይቅ"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ከመንቀል በፊት የማስከፈቻ ስርዓተ-ጥለት ጠይቅ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ከመንቀል በፊት የይለፍ ቃል ጠይቅ"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"ሁሉም ቋንቋዎች"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"ሁሉም ክልሎች"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ፈልግ"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"የስራ መገለጫ ይብራ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"የእርስዎ የስራ መተግበሪያዎች፣ ማሳወቂያዎች፣ ውሂብ እና ሌሎች የስራ መገለጫ ባህሪያት ይበራሉ"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"አብራ"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ይህ መተግበሪያ ለቆየ የAndroid ስሪት ነው የተገነባው፣ እና በአግባቡ ላይሰራ ይችላል። ዝማኔዎች ካሉ ለመመልከት ይሞክሩ፣ ወይም ደግሞ ገንቢውን ያነጋግሩ።"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ዝማኔ ካለ አረጋግጥ"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"አዲስ መልእክቶች አለዎት"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ለመመልከት የኤስኤምኤስ መተግበሪያ ይክፈቱ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"አንዳንድ ተግባሮች የተገደቡ ሊሆኑ ይችላሉ"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ስልክ ለድምጽ አይፈቀድም"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"ብቅ-ባይ መስኮት"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ይህ አቋራጭ በጣም የቅርብ ጊዜውን መተግበሪያ ይፈልጋል"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"መተግበሪያ ምትኬን እና ወደ ነበረበት መመለስን ሳለማይደግፍ አቋራጭ ወደ ነበረበት ሊመለስ አልቻለም"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"በመተግበሪያ ፊርማ አለመዛመድ አቋራጭን ወደነበረበት መመለስ አልተቻለም"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"አቋራጭን ወደ ነበረበት መመለስ አልተቻለም"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"አቋራጭ ተሰናክሏል"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"አራግፍ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ለማንኛውም ክፈት"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ጎጂ መተግበሪያ ተገኝቷል"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን ማሳየት ይፈልጋል"</string> <string name="screenshot_edit" msgid="7867478911006447565">"አርትዕ"</string> </resources> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 5255a12673c5..5254fcd45981 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tətbiqə cihazın telefon funksiyalarına giriş icazəsi verir. Belə icazəli tətbiq bu telefonun nömrəsini və cihaz İD\'ni, zəngin aktiv olub-olmadığını və zəng edilən nömrəni müəyyən edə bilər."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"zəngləri sistem üzərindən yönləndirin"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Tətbiqə, zəng təcrübəsini yaxşılaşdırmaq üçün, zəngləri sistem üzərindən yönləndirməyə icazə verilir."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"zəngə digər tətbiqdən davam edin"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Tətbiqə digər tətbiqdə başlayan zəngə davam etmək icazəsi verilir."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"telefon nömrələrini oxuyun"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Tətbiqə cihazın telefon nömrələrinə daxil olmağa icazə verir."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planşetin yuxu rejiminin qarşısını almaq"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Cəhdlər çox oldu. Sonraya saxlayın."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Həddindən çox cəhd. Barmaq izi sensoru deaktiv edilib."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yenidən cəhd edin."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Barmaq <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Açın"</string> <string name="sms" msgid="4560537514610063430">"Mesaj"</string> <string name="add_contact" msgid="7867066569670597203">"Əlavə edin"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Baxın"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Cədvəl"</string> + <string name="view_flight" msgid="7691640491425680214">"Trek"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Yaddaş yeri bitir"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bəzi sistem funksiyaları işləməyə bilər"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistem üçün yetərincə yaddaş ehtiyatı yoxdur. 250 MB yaddaş ehtiyatının olmasına əmin olun və yenidən başladın."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Əlçatan açıq Wi-Fi şəbəkəsi</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Açıq Wi‑Fi şəbəkəsinə qoşulun"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Operatorun Wi‑Fi şəbəkəsinə qoşulun"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açıq Wi‑Fi şəbəkəsinə qoşulur"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi şəbəkəsinə qoşuldu"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi şəbəkəsinə qoşulmaq mümkün deyil"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Heç bir icazə tələb olunmur"</string> <string name="perm_costs_money" msgid="4902470324142151116">"bununla sizdən xərc tutula bilər"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB bu cihaza enerji doldurur"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Qolulmuş cihaz üçün USB enerji tədarükü"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Fayl transferi üçün USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Foto transfer üçün USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI üçün USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuara qoşuldu"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Əlavə seçimlər üçün tıklayın."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoq audio aksesuar aşkarlandı"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Əlavə edilən cihaz bu telefonla uyğun deyil. Ətraflı məlumat üçün klikləyin."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"İş <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ci İş <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-cü İş <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Bu ekrandan sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ayırmadan öncə PIN istənilsin"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ayırmadan öncə kilid modeli istənilsin"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ayırmadan öncə parol istənilsin"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"İş profili aktiv edilsin?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"İş tətbiqləri, bildirişləri, data və digər iş profili funksiyaları aktiv ediləcək"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivləşdirin"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Bu tətbiq köhnə Android versiyası üçün hazırlanıb və düzgün işləməyə bilər. Güncəlləməni yoxlayın və ya developer ilə əlaqə saxlayın."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Güncəlləməni yoxlayın"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Yeni mesajlarınız var"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Baxmaq üçün SMS tətbiqini açın"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Bir neçə funksionallıq məhdudlaşdırıla bilər"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Səs üçün telefona icazə verilmir"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Popap Pəncərəsi"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Bu qısayol ən son tətbiqi tələb edir"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Qısayolu bərpa etmək mümkün olmadı, çünki tətbiq yedəkləməni və bərpa etməyi dəstəkləmir"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Tətbiqin imza uyğunsuzluğu səbəbilə qısayolu bərpa etmək mümkün olmadı"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Qısayolu bərpa etmək mümkün olmadı"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Qısayol deaktiv edildi"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"SİSTEMDƏN SİLİN"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"İSTƏNİLƏN HALDA AÇIN"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Zərərli tətbiq aşkarlandı"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> tətbiqindən bölmələr göstərmək istəyir"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Redaktə edin"</string> </resources> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index ecadbbf38b2f..21cf7d6a5b87 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"নিরাপদ মোড"</string> <string name="android_system_label" msgid="6577375335728551336">"Android সিস্টেম"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"এর বদলে ব্যক্তিগত প্রোফাইল ব্যবহার করুন"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"এর বদলে কাজের প্রোফাইল ব্যবহার করুন"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"পরিচিতি"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"আপনার পরিচিতিগুলিতে অ্যাক্সেস"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> কে আপনার পরিচিতিগুলি অ্যাক্সেস করতে দিন"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"অ্যাপ্লিকেশানটিকে ডিভাইসের ফোন বৈশিষ্ট্যগুলিকে অ্যাক্সেস করার অনুমতি দেয়৷ এই অনুমতিটি অ্যাপ্লিকেশানটিকে একটি কল সক্রিয় থাকা অবস্থায় এবং দূরবর্তী নম্বর একটি কল দ্বারা সংযুক্ত থাকাকালীনও ফোন নম্বর এবং ডিভাইসের IDগুলি নির্ধারণ করার অনুমতি দেয়৷"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"সিস্টেমের মাধ্যমে কলগুলি রুট করতে দিন"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"কল করার অভিজ্ঞতা উন্নত করার জন্য অ্যাপকে সিস্টেমের মাধ্যমে তার কলগুলি রুট করতে দেয়।"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"অন্য কোনও অ্যাপ দিয়ে করে থাকা কল চালিয়ে যান"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"অন্য কোনও অ্যাপ দিয়ে কল করলে এই অ্যাপটিকে সেটি চালিয়ে যেতে দেয়।"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ফোন নম্বরগুলি পড়া হোক"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"অ্যাপটিকে এই ডিভাইসের ফোন নম্বরগুলি অ্যাক্সেস করতে দেয়।"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ঘুমানো থেকে ট্যাবলেটকে প্রতিরোধ করে"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"আঙ্গুলের ছাপ সংরক্ষণ করা যাবে না৷ অনুগ্রহ করে একটি বিদ্যমান আঙ্গুলের ছাপ সরান৷"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"আঙ্গুলের ছাপ অপারেশন বাতিল করা হয়েছে৷"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ব্যবহারকারী আঙ্গুলের ছাপের অপারেশনটি বাতিল করেছেন।"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"অনেকবার প্রচেষ্টা করা হয়েছে৷ পরে আবার চেষ্টা করুন৷"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"বহুবার চেষ্টা করেছেন। আঙ্গুলের ছাপ নেওয়ার সেন্সর অক্ষম করা হয়েছে।"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আবার চেষ্টা করুন৷"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"আঙ্গুল <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"খুলুন"</string> <string name="sms" msgid="4560537514610063430">"মেসেজ"</string> <string name="add_contact" msgid="7867066569670597203">"যোগ করুন"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"দেখুন"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"সময়সূচী"</string> + <string name="view_flight" msgid="7691640491425680214">"ট্র্যাক"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"স্টোরেজ পূর্ণ হতে চলেছে"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"কিছু কিছু সিস্টেম ক্রিয়াকলাপ কাজ নাও করতে পারে"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"সিস্টেমের জন্য যথেষ্ট স্টোরেজ নেই৷ আপনার কাছে ২৫০এমবি ফাঁকা স্থান রয়েছে কিনা সে বিষয়ে নিশ্চিত হন এবং সিস্টেম চালু করুন৷"</string> @@ -1131,8 +1127,7 @@ <item quantity="other">খোলা ওয়াই-ফাই নেটওয়ার্কগুলি উপলব্ধ রয়েছে</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"পরিষেবা প্রদানকারীর ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা হচ্ছে"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করা হয়েছে"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা গেল না"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"কোনো অনুমতির প্রয়োজন নেই"</string> <string name="perm_costs_money" msgid="4902470324142151116">"এর জন্য অর্থপ্রদান করতে হতে পারে"</string> <string name="dlg_ok" msgid="7376953167039865701">"ঠিক আছে"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"এই ডিভাইসটি USB দ্বারা চার্জ করা হচ্ছে"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"সংযুক্ত ডিভাইসটিতে USB পাওয়ার সরবরাহ করছে"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ফাইল স্থানান্তরের জন্য USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ফটো স্থানান্তরের জন্য USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI এর জন্য USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"একটি USB যন্ত্রাংশতে সংযুক্ত হয়েছে"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"আরও বিকল্পের জন্য আলতো চাপুন৷"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"কর্মক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"দ্বিতীয় কার্যক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"তৃতীয় কার্যক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"এই স্ক্রিনটিকে আনপিন করতে ফিরে যাওয়া এবং এক নজরে বোতামদুটি ট্যাপ করে ধরে রাখুন"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"স্ক্রিন পিন করা হয়েছে"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"পিন না করা স্ক্রীন"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"আনপিন করার আগে পিন চান"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"আনপিন করার আগে আনলক প্যাটার্ন চান"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"আনপিন করার আগে পাসওয়ার্ড চান"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"সকল ভাষা"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"সমস্ত অঞ্চল"</string> <string name="locale_search_menu" msgid="2560710726687249178">"খুঁজুন"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"কাজের প্রোফাইল চালু করবেন?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"আপনার কাজের অ্যাপ, বিজ্ঞপ্তি, ডেটা এবং কাজের প্রোফাইলের অন্যান্য বৈশিষ্ট্য চালু করা হবে"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"চালু করুন"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"এই অ্যাপটি Android এর একটি পুরনো ভার্সনের জন্য তৈরি করা হয়েছিল, তাই এখানে সেটি ঠিকমতো কাজ নাও করতে পারে। আপডেট পাওয়া যাচ্ছে কিনা দেখুন বা ডেভেলপারের সাথে যোগাযোগ করুন।"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"আপডেট পাওয়া যাচ্ছে কিনা দেখুন"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"আপনার নতুন মেসেজ আছে"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"দেখার জন্য SMS অ্যাপ্লিকেশান খুলুন"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"কিছু ক্রিয়াকলাপ সীমিত হতে পারে"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"এই ফোন দিয়ে ভয়েস কল করা যাবে না"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"পপ-আপ উইন্ডো"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>টি"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"এই শর্টকাটটির জন্য লেটেস্ট অ্যাপ প্রয়োজন"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপটিতে \'ব্যাক-আপ এবং রিস্টোর\' করার সুবিধা নেই"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপের সিগ্নেচারটি মিল হচ্ছে না"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"শর্টকাট ফিরিয়ে আনা যায়নি"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"শর্টকাট অক্ষম করা আছে"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"আন-ইনস্টল করুন"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"যাই হোক, খুলতে চাই"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string> <string name="screenshot_edit" msgid="7867478911006447565">"এডিট করুন"</string> </resources> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index f143d4e13a44..6eef37cc26f5 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -267,10 +267,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string> <string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Pređite na lični profil"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Pređite na radni profil"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupa vašim kontaktima"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dozvolite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristup vašim kontaktima"</string> @@ -422,10 +420,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Omogućava aplikaciji pristup telefonskim funkcijama uređaja. Ovo odobrenje omogućava aplikaciji određivanje telefonskog i identifikacionog broja uređaja, bez obzira da li je poziv aktivan i da li je uspostavljena veza sa pozivanim brojem."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"usmjeravanje poziva preko sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Dopušta aplikaciji da pozive usmjeri preko sistema radi poboljšanja iskustva pozivanja."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"nastavlja poziv iz druge aplikacije"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Dozvoljava aplikaciji nastavljanje poziva koji je započet u drugoj aplikaciji."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"čitanje telefonskih brojeva"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Dozvoljava aplikaciji pristup telefonskim brojevima uređaja."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"sprečavanje tableta da uđe u režim mirovanja"</string> @@ -500,11 +496,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta se ne može pohraniti. Uklonite postojeći otisak prsta."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Korisnik je otkazao radnju s otiskom prsta."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Previše pokušaja. Senzor za otisak prsta je onemogućen."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -567,8 +566,8 @@ <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Dozvoljava vlasniku povezivanje s interfejsom najvišeg nivoa u servisu za poruke operatera. Nije potrebno za obične aplikacije."</string> <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"povezivanje na usluge operatera"</string> <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Omogućava vlasniku povezivanje sa uslugama operatera. Obično nije potrebno za obične aplikacije."</string> - <string name="permlab_access_notification_policy" msgid="4247510821662059671">"pristup opciji Ne ometaj"</string> - <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Omogućava aplikaciji da čita i upisuje konfiguraciju opcije Ne ometaj."</string> + <string name="permlab_access_notification_policy" msgid="4247510821662059671">"pristup načinu rada Ne ometaj"</string> + <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Omogućava aplikaciji da čita i upisuje konfiguraciju načina rada Ne ometaj."</string> <string name="policylab_limitPassword" msgid="4497420728857585791">"Postavljanje pravila za lozinke"</string> <string name="policydesc_limitPassword" msgid="2502021457917874968">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string> <string name="policylab_watchLogin" msgid="5091404125971980158">"Prati pokušaje otključavanja ekrana"</string> @@ -1020,12 +1019,9 @@ <string name="browse" msgid="1245903488306147205">"Otvorite"</string> <string name="sms" msgid="4560537514610063430">"Poruka"</string> <string name="add_contact" msgid="7867066569670597203">"Dodajte"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Prikaži"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Zakaži"</string> + <string name="view_flight" msgid="7691640491425680214">"Prati"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ponestaje prostora za pohranu"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke funkcije sistema možda neće raditi"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno prostora za sistem. Obezbijedite 250MB slobodnog prostora i ponovo pokrenite uređaj."</string> @@ -1155,8 +1151,7 @@ <item quantity="other">Otvorene Wi-Fi mreže su dostupne</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Povežite se na otvorenu Wi‑Fi mrežu"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se na Wi‑Fi mrežu mobilnog operatera"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje na otvorenu Wi‑Fi mrežu"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezani ste na Wi‑Fi mrežu"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije se moguće povezati na Wi‑Fi mrežu"</string> @@ -1240,13 +1235,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string> <string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Punjenje uređaja putem USB-a"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB napaja priključeni uređaj"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prijenos fajlova"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prijenos slika"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Uspostavljena veza sa USB pohranom"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni periferni uređaj"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da saznate više."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string> @@ -1688,9 +1693,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Da otkačite ovaj ekran, dodirnite i držite dugmad Nazad i Pregled."</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Ekran je zakačen"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran je otkačen"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Traži PIN prije nego se otkači"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Traži uzorak za otključavanje prije nego se otkači"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Traži lozinku prije nego se otkači"</string> @@ -1744,7 +1746,7 @@ <string name="zen_mode_until" msgid="7336308492289875088">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="9128205721301330797">"Do <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (sljedeći alarm)"</string> <string name="zen_mode_forever" msgid="931849471004038757">"Dok ne isključite"</string> - <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dok ne isključite opciju Ne ometaj"</string> + <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Dok ne isključite način rada Ne ometaj"</string> <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="2821479483960330739">"Skupi"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string> @@ -1793,15 +1795,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Pretraga"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Uključiti radni profil?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Uključit će se poslovne aplikacije, obavještenja, podaci i druge funkcije radnog profila"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ova aplikacija je pravljena za stariju verziju Androida i možda neće ispravno raditi. Provjerite jesu li dostupna ažuriranja ili kontaktirajte programera."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Provjeri je li dostupno ažuriranje"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite SMS aplikaciju da biste pregledali poruke"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Neke funkcije mogu biti ograničene"</string> @@ -1869,17 +1867,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije dozvoljen za govor"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Iskočni prozor"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Za ovu prečicu potrebna je najnovija aplikacija"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Prečica nije uspješno vraćena jer aplikacija ne podržava izradu sigurnosne kopije i vraćanje"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Prečica nije uspješno vraćena zbog nepodudaranja potpisa aplikacije"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Prečica nije uspješno vraćena"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Prečica je onemogućena"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEINSTALIRAJ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"IPAK OTVORI"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string> <string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Uredi"</string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index bf91550ceeeb..abdb966c13f3 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Mode segur"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Canvia al perfil personal"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Canvia al perfil professional"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactes"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accedir als contactes"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permet que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> accedeixi als contactes"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permet que l\'aplicació accedeixi a les funcions de telèfon del dispositiu. Aquest permís permet que l\'aplicació determini el número de telèfon i els identificadors del dispositiu, si hi ha una trucada activa i el número remot connectat amb una trucada."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"encaminar trucades a través del sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permet que l\'aplicació encamini les trucades a través del sistema per millorar-ne l\'experiència."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"Continua una trucada d\'una altra aplicació"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permet que l\'aplicació continuï una trucada que s\'havia iniciat en una altra aplicació."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"llegir els números de telèfon"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permet que l\'aplicació accedeixi als números de telèfon del dispositiu."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"evita que la tauleta entri en mode de repòs"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empremta digital no es pot desar. Suprimeix-ne una."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"S\'ha cancel·lat l\'operació d\'empremta digital."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"L\'usuari ha cancel·lat l\'operació d\'empremta digital."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"S\'han produït massa intents. Torna-ho a provar més tard."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"S\'han fet massa intents. S\'ha desactivat el sensor d\'empremtes digitals."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Torna-ho a provar."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dit <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Obre"</string> <string name="sms" msgid="4560537514610063430">"Missatge"</string> <string name="add_contact" msgid="7867066569670597203">"Afegeix"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Mostra"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Programa"</string> + <string name="view_flight" msgid="7691640491425680214">"Fes un seguiment"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"L\'espai d\'emmagatzematge s\'està esgotant"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"És possible que algunes funcions del sistema no funcionin"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hi ha prou espai d\'emmagatzematge per al sistema. Comprova que tinguis 250 MB d\'espai lliure i reinicia."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Xarxa Wi-Fi oberta disponible</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connecta\'t a una xarxa Wi-Fi oberta"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connecta\'t a la xarxa Wi-Fi de l\'operador de telefonia mòbil"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"S\'està connectant a una xarxa Wi-Fi oberta"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"S\'ha connectat a la xarxa Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No s\'ha pogut connectar a una xarxa Wi-Fi"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No cal cap permís"</string> <string name="perm_costs_money" msgid="4902470324142151116">"pot ser que comporti càrrecs"</string> <string name="dlg_ok" msgid="7376953167039865701">"D\'acord"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"El dispositiu s\'està carregant per USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"L\'USB subministra energia al dispositiu connectat"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB per transferir fitxers"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB per transferir fotos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB per a MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connectat a un accessori USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Toca per veure més opcions."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S\'ha detectat un accessori d\'àudio analògic"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositiu connectat no és compatible amb aquest telèfon. Toca per obtenir més informació."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2n <xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3r <xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Toca i mantén premuts els botons Enrere i Aplicacions recents per deixar de fixar aquesta pantalla"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Fixació de la pantalla anul·lada"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Sol·licita el codi PIN per deixar de fixar"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sol·licita el patró de desbloqueig per deixar de fixar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demana la contrasenya per deixar de fixar"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Tots els idiomes"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Totes les regions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Activar el perfil professional?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"S\'activaran les teves aplicacions per a la feina, les notificacions, les dades i altres funcions del perfil professional"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activa"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Aquesta aplicació es va crear per a una versió antiga d\'Android i pot ser que no funcioni correctament. Prova de cercar actualitzacions o contacta amb el desenvolupador."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Cerca actualitzacions"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tens missatges nous"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Obre l\'aplicació d\'SMS per veure\'ls"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algunes funcions es limitaran"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"El telèfon no és compatible per a la veu"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string> <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Per fer servir aquesta drecera has de tenir l\'última versió de l\'aplicació"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"No s\'ha pogut restaurar la drecera perquè l\'aplicació no permet la còpia de seguretat ni la restauració"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"No s\'ha pogut restaurar la drecera perquè la signatura de l\'aplicació no coincideix"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"No s\'ha pogut restaurar la drecera"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"S\'ha desactivat la drecera"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTAL·LA"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OBRE IGUALMENT"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"S\'ha detectat una aplicació perjudicial"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vol mostrar porcions de l\'aplicació <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edita"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 32d4294e0292..89b6e296528d 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -270,10 +270,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Nouzový režim"</string> <string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Přepnout na osobní profil"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Přepnout na pracovní profil"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"přístup ke kontaktům"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Povolte aplikaci <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> přístup ke kontaktům"</string> @@ -425,10 +423,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Umožňuje aplikaci získat přístup k telefonním funkcím zařízení. Toto oprávnění umožňuje aplikaci zjistit telefonní číslo telefonu, identifikační čísla zařízení, zda zrovna probíhá hovor, a vzdálené číslo, ke kterému je hovor připojen."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"směrování volání prostřednictvím systému"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Umožňuje aplikaci směrovat volání prostřednictvím systému za účelem vylepšení funkcí volání."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"pokračování v hovoru v jiné aplikaci"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Umožňuje aplikace pokračovat v hovoru, který byl zahájen v jiné aplikaci."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"přístup k telefonním číslům"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Umožňuje aplikaci přístup k telefonním číslům v zařízení."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"bránění přechodu tabletu do režimu spánku"</string> @@ -503,11 +499,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisk prstu nelze uložit. Odstraňte existující otisk prstu."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operace otisku prstu byla zrušena."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Uživatel operaci s otiskem prstu zrušil."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Příliš mnoho pokusů. Zkuste to později."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Příliš mnoho pokusů. Snímač otisků prstů byl deaktivován."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zkuste to znovu."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1040,12 +1039,9 @@ <string name="browse" msgid="1245903488306147205">"Otevřít"</string> <string name="sms" msgid="4560537514610063430">"Zpráva"</string> <string name="add_contact" msgid="7867066569670597203">"Přidat"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Zobrazit"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Naplánovat"</string> + <string name="view_flight" msgid="7691640491425680214">"Sledovat"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"V úložišti je málo místa"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Některé systémové funkce nemusí fungovat"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Pro systém není dostatek místa v úložišti. Uvolněte alespoň 250 MB místa a restartujte zařízení."</string> @@ -1175,8 +1171,7 @@ <item quantity="one">K dispozici je veřejná síť Wi-Fi</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Připojení k otevřené síti Wi-Fi"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Připojte se k síti Wi-Fi operátora"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Připojování k otevřené síti Wi-Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Připojeno k síti Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Připojení k síti Wi-Fi se nezdařilo"</string> @@ -1260,13 +1255,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nejsou vyžadována žádná oprávnění"</string> <string name="perm_costs_money" msgid="4902470324142151116">"může vás to něco stát"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Nabíjení zařízení přes USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Připojené zařízení se nabíjí přes USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB na přenos souborů"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB na přenos fotek"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB v režimu MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Připojeno k perifernímu zařízení USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Klepnutím zobrazíte další možnosti."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Bylo zjištěno analogové zvukové příslušenství"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Připojené zařízení není s tímto telefonem kompatibilní. Klepnutím zobrazíte další informace."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string> @@ -1711,9 +1716,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Pracovní <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Chcete-li tuto obrazovku uvolnit, podržte tlačítka Zpět a Přehled"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka připnuta"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka uvolněna"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Před uvolněním požádat o PIN"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Před uvolněním požádat o bezpečnostní gesto"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Před uvolněním požádat o heslo"</string> @@ -1825,15 +1827,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Všechny jazyky"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Všechny oblasti"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Vyhledávání"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Zapnout pracovní profil?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Vaše pracovní aplikace, oznámení, data a ostatní funkce pracovního účtu budou zapnuty"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnout"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Tato aplikace byla vytvořena pro starší verzi systému Android a nemusí fungovat správně. Zkuste vyhledat aktualizace, případně kontaktujte vývojáře."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Zkontrolovat aktualizace"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Máte nové zprávy"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Zobrazíte je v aplikaci pro SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funkce mohou být omezeny"</string> @@ -1902,17 +1900,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon není povolen pro hlasovou komunikaci"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Vyskakovací okno"</string> <string name="slice_more_content" msgid="8504342889413274608">"a ještě <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Tato zkratka vyžaduje nejnovější verzi aplikace"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Zkratku nelze obnovit, protože aplikace nepodporuje zálohování a obnovu"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Zkratku nelze obnovit, protože se neshoduje podpis aplikace"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Zkratku nelze obnovit"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Zkratka nefunguje"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ODINSTALOVAT"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"PŘESTO OTEVŘÍT"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Byla zjištěna škodlivá aplikace"</string> <string name="slices_permission_request" msgid="8484943441501672932">"Aplikace <xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Upravit"</string> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 0f774d6b5ff6..873dd61581eb 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continue a call from another app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Allows the app to continue a call which was started in another app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"read phone numbers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Allows the app to access the phone numbers of the device."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Open"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Add"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"View"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string> + <string name="view_flight" msgid="7691640491425680214">"Track"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Open Wi-Fi network available</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No permission required"</string> <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB charging this device"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB supplying power to attached device"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"To unpin this screen, touch & hold Back and Overview buttons"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ask for unlock pattern before unpinning"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Check for update"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"This shortcut requires latest app"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shortcut is disabled"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTALL"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPEN ANYWAY"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string> </resources> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 0f774d6b5ff6..873dd61581eb 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continue a call from another app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Allows the app to continue a call which was started in another app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"read phone numbers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Allows the app to access the phone numbers of the device."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Open"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Add"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"View"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string> + <string name="view_flight" msgid="7691640491425680214">"Track"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Open Wi-Fi network available</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No permission required"</string> <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB charging this device"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB supplying power to attached device"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"To unpin this screen, touch & hold Back and Overview buttons"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ask for unlock pattern before unpinning"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Check for update"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"This shortcut requires latest app"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shortcut is disabled"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTALL"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPEN ANYWAY"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 0f774d6b5ff6..873dd61581eb 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continue a call from another app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Allows the app to continue a call which was started in another app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"read phone numbers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Allows the app to access the phone numbers of the device."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Open"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Add"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"View"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string> + <string name="view_flight" msgid="7691640491425680214">"Track"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Open Wi-Fi network available</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No permission required"</string> <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB charging this device"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB supplying power to attached device"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"To unpin this screen, touch & hold Back and Overview buttons"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ask for unlock pattern before unpinning"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Check for update"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"This shortcut requires latest app"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shortcut is disabled"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTALL"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPEN ANYWAY"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 0f774d6b5ff6..873dd61581eb 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active and the remote number connected by a call."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continue a call from another app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Allows the app to continue a call which was started in another app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"read phone numbers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Allows the app to access the phone numbers of the device."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Open"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Add"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"View"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string> + <string name="view_flight" msgid="7691640491425680214">"Track"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure that you have 250 MB of free space and restart."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Open Wi-Fi network available</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to operator Wi‑Fi network"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No permission required"</string> <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB charging this device"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB supplying power to attached device"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"To unpin this screen, touch & hold Back and Overview buttons"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ask for unlock pattern before unpinning"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data and other work profile features will be turned on"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"This app was built for an older version of Android and may not work properly. Try checking for updates or contact the developer."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Check for update"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"This shortcut requires latest app"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shortcut is disabled"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTALL"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPEN ANYWAY"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string> </resources> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 8160f0d3a0fa..85cfb87ba63d 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Allows the app to access the phone features of the device. This permission allows the app to determine the phone number and device IDs, whether a call is active, and the remote number connected by a call."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continue a call from another app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Allows the app to continue a call which was started in another app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"read phone numbers"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Allows the app to access the phone numbers of the device."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"prevent tablet from sleeping"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Open"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Add"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"View"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Schedule"</string> + <string name="view_flight" msgid="7691640491425680214">"Track"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Storage space running out"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Some system functions may not work"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Not enough storage for the system. Make sure you have 250MB of free space and restart."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Open Wi-Fi network available</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Connect to carrier Wi‑Fi network"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No permissions required"</string> <string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB charging this device"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB supplying power to attached device"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for file transfer"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for photo transfer"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connected to a USB accessory"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analog audio accessory detected"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2nd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3rd Work <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"To unpin this screen, touch & hold Back and Overview buttons"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Screen pinned"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Screen unpinned"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Ask for PIN before unpinning"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ask for unlock pattern before unpinning"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ask for password before unpinning"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Turn on work profile?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Your work apps, notifications, data, and other work profile features will be turned on"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Turn on"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"This app was built for an older version of Android and may not work properly. Try checking for updates, or contact the developer."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Check for update"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"You have new messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Open SMS app to view"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Some functionality may be limited"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Popup Window"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"This shortcut requires latest app"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shortcut is disabled"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTALL"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPEN ANYWAY"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index d1a2fa337330..487d68af53fd 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Cambiar al perfil personal"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a tus contactos"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permite que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tus contactos"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que la aplicación acceda a las funciones de teléfono del dispositivo. La aplicación puede utilizar este permiso para descubrir identificadores de dispositivos y números de teléfono, para saber si una llamada está activa y para conocer el número remoto con el que se ha establecido conexión mediante una llamada."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"direccionar llamadas a través del sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite a la aplicación direccionar sus llamadas hacia el sistema para mejorar la calidad de estas."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar una llamada de otra aplicación"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite que la aplicación continúe una llamada que se ha iniciado en otra aplicación."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"leer números de teléfono"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite que la aplicación acceda a los números de teléfono del dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir que el tablet entre en modo de suspensión"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una ya creada."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se ha cancelado la operación de huella digital."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"El usuario ha cancelado la operación de huella digital."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiados intentos. Se ha inhabilitado el sensor de huellas digitales."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Abrir"</string> <string name="sms" msgid="4560537514610063430">"Mensaje"</string> <string name="add_contact" msgid="7867066569670597203">"Añadir"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Ver"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string> + <string name="view_flight" msgid="7691640491425680214">"Buscar"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Queda poco espacio"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Es posible que algunas funciones del sistema no funcionen."</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hay espacio suficiente para el sistema. Comprueba que haya 250 MB libres y reinicia el dispositivo."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Red Wi-Fi abierta disponible</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi‑Fi de un operador"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a la red Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No se ha podido conectar a la red Wi-Fi"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"No es necesario ningún permiso"</string> <string name="perm_costs_money" msgid="4902470324142151116">"es posible que esto te cueste dinero"</string> <string name="dlg_ok" msgid="7376953167039865701">"Aceptar"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Cargando este dispositivo por USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"El dispositivo conectado recibe la alimentación por USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferir archivos"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferir fotos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Toca para ver más opciones."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Se ha detectado un accesorio de audio analógico"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 2"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 3"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Mantén pulsado el botón Atrás y el de aplicaciones recientes para dejar de fijar esta pantalla"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fijada"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"La pantalla ya no está fija"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar PIN para desactivar"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar patrón de desbloqueo para desactivar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para desactivar"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Todas las regiones"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"¿Activar el perfil de trabajo?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Tus aplicaciones, notificaciones, datos y otras funciones del perfil de trabajo se activarán"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Esta aplicación se ha diseñado para una versión anterior de Android y es posible que no funcione correctamente. Busca actualizaciones o ponte en contacto con el desarrollador."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Comprobar actualizaciones"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tienes mensajes nuevos"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abre la aplicación de SMS para ver el mensaje"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algunas funciones limitadas"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Teléfono no permitido para voz"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string> <string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Para usar este acceso directo, necesitas la última versión de la aplicación"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"No se ha podido restaurar el acceso directo porque la aplicación no es compatible con la función de copia de seguridad y restauración"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"No se ha podido restaurar el acceso directo porque la firma de la aplicación no coincide"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"No se ha podido restaurar el acceso directo"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"El acceso directo está inhabilitado"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR IGUALMENTE"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Se ha detectado una aplicación dañina"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index e5ed2a37af35..8d1350a6f226 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Suojattu tila"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-järjestelmä"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Vaihda henkilökohtaiseen profiiliin"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Vaihda työprofiiliin"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktit"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"käyttää yhteystietoja"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Anna sovellukselle <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> yhteystietojesi käyttöoikeus."</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Antaa sovelluksen käyttää laitteen puhelinominaisuuksia. Sovellus voi määrittää puhelinnumeron ja laitteen tunnuksen, puhelun tilan sekä soitetun numeron."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ohjata puhelut järjestelmän kautta"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Tämä sallii sovelluksen ohjata puhelut järjestelmän kautta, mikä auttaa parantamaan puhelujen laatua."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"jatkaa toisen sovelluksen puhelua"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Antaa sovelluksen jatkaa puhelua, joka aloitettiin toisessa sovelluksessa."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lukea puhelinnumeroita"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Anna sovelluksen käyttää laitteella olevia puhelinnumeroita."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"estä tablet-laitetta menemästä virransäästötilaan"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sormenjälkeä ei voida tallentaa. Poista aiemmin lisätty sormenjälki."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sormenjälkitoiminto peruutettiin."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Käyttäjä peruutti sormenjälkitoiminnon."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Liian monta yritystä. Sormenjälkitunnistin poistettu käytöstä."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yritä uudelleen."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Sormi <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Avaa"</string> <string name="sms" msgid="4560537514610063430">"Viesti"</string> <string name="add_contact" msgid="7867066569670597203">"Lisää"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Näytä"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Aikataulu"</string> + <string name="view_flight" msgid="7691640491425680214">"Seuraa"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Tallennustila loppumassa"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Kaikki järjestelmätoiminnot eivät välttämättä toimi"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tallennustila ei riitä. Varmista, että vapaata tilaa on 250 Mt, ja käynnistä uudelleen."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Avoin Wi-Fi-verkko käytettävissä</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Yhdistä avoimeen Wi‑Fi-verkkoon"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Yhdistä operaattorin Wi-Fi-verkkoon"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Yhdistetään avoimeen Wi‑Fi-verkkoon"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Yhdistetty Wi-Fi-verkkoon"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi-verkkoon yhdistäminen epäonnistui"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Lupia ei tarvita"</string> <string name="perm_costs_money" msgid="4902470324142151116">"tämä voi maksaa"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Laitetta ladataan USB-yhteyden kautta"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Liitetty laite saa virtaa USB-yhteyden kautta"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB on tiedonsiirtotilassa"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB on kuvansiirtotilassa"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB on MIDI-tilassa"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Liitetty USB-laitteeseen"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Näet lisää vaihtoehtoja napauttamalla."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoginen äänilaite havaittu"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Liitetty laite ei ole yhteensopiva puhelimen kanssa. Napauta, niin näet lisätietoja."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (työ)"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Toinen <xliff:g id="LABEL">%1$s</xliff:g>, työ"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Kolmas <xliff:g id="LABEL">%1$s</xliff:g>, työ"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Irrota näyttö koskettamalla pitkään Takaisin- ja Viimeisimmät-painikkeita"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Näyttö kiinnitetty"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Näyttö irrotettu"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pyydä PIN ennen irrotusta"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pyydä lukituksenpoistokuvio ennen irrotusta"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pyydä salasana ennen irrotusta"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Kaikki kielet"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Kaikki alueet"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Haku"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Otetaanko työprofiili käyttöön?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Työsovellukset, ‑ilmoitukset, ‑tiedot ja muut työprofiiliominaisuudet otetaan käyttöön"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ota käyttöön"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Tämä sovellus on suunniteltu vanhemmalle Android-versiolle eikä välttämättä toimi oikein. Kokeile tarkistaa päivitykset tai ottaa yhteyttä kehittäjään."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Tarkista päivitykset"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Sinulle on uusia viestejä"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Katso avaamalla tekstiviestisovellus."</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Toimintorajoitus mahdollinen"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Äänipalvelujen käyttö ei sallittua puhelimella"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Ponnahdusikkuna"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Tämä pikakuvake edellyttää uusinta sovellusta."</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Pikakuvakkeen palautus epäonnistui, koska sovellus ei tue varmuuskopiointia eikä palauttamista."</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Pikakuvakkeen palautus epäonnistui sovelluksen allekirjoituksen yhteensopimattomuuden vuoksi."</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Pikakuvakkeen palautus epäonnistui."</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Pikakuvake on poistettu käytöstä."</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"POISTA"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"AVAA SILTI"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Haitallinen sovellus havaittu"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> haluaa näyttää osia sovelluksesta <xliff:g id="APP_2">%2$s</xliff:g>."</string> <string name="screenshot_edit" msgid="7867478911006447565">"Muokkaa"</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index aa6608aeaa5c..2891b8ca28f7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -181,6 +181,7 @@ <string name="network_logging_notification_text" msgid="7930089249949354026">"Votre organisation gère cet appareil et peut surveiller le trafic réseau. Touchez ici pour obtenir plus d\'information."</string> <string name="factory_reset_warning" msgid="5423253125642394387">"Le contenu de votre appareil sera effacé"</string> <string name="factory_reset_message" msgid="7972496262232832457">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, communiquez avec l\'administrateur de votre organisation."</string> + <string name="printing_disabled_by" msgid="8936832919072486965">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string> <string name="me" msgid="6545696007631404292">"Moi"</string> <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Options de la tablette"</string> <string name="power_dialog" product="tv" msgid="6153888706430556356">"Options du téléviseur"</string> @@ -263,8 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Mode sans échec"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> - <string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string> - <string name="managed_profile_label" msgid="5289992269827577857">"Passer au profil professionnel"</string> + <string name="user_owner_label" msgid="8836124313744349203">"Passer au profil personnel"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Autoriser « <xliff:g id="APP_NAME">%1$s</xliff:g> » à accéder à vos contacts"</string> @@ -416,6 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"acheminer les appels dans le système"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permet à l\'application d\'acheminer ses appels dans le système afin d\'améliorer l\'expérience d\'appel."</string> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuer un appel d\'une autre application"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permet à l\'application de continuer un appel commencé dans une autre application."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lire les numéros de téléphone"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permet à l\'application d\'accéder aux numéros de téléphone de l\'appareil."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"empêcher la tablette de passer en mode veille"</string> @@ -485,13 +488,19 @@ <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Vous avez déplacé votre doigt trop lentement. Veuillez réessayer."</string> <string-array name="fingerprint_acquired_vendor"> </string-array> + <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Doigt non reconnu"</string> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"L\'empreinte digitale ne peut pas être enregistrée. Veuillez supprimer une empreinte existante."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"L\'opération d\'empreinte digitale a été annulée par l\'utilisateur."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Trop de tentatives. Capteur d\'empreintes digitales désactivé."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Réessayer."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -990,6 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Ouvrir"</string> <string name="sms" msgid="4560537514610063430">"Message"</string> <string name="add_contact" msgid="7867066569670597203">"Ajouter"</string> + <string name="view_calendar" msgid="979609872939597838">"Afficher"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Calendrier"</string> + <string name="view_flight" msgid="7691640491425680214">"Effectuer le suivi"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string> @@ -1115,6 +1127,7 @@ <item quantity="other">Réseaux Wi-Fi ouverts à proximité</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Connectez-vous pour ouvrir un réseau Wi-Fi"</string> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi du fournisseur de services"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion en cours au réseau Wi-Fi ouvert…"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string> @@ -1198,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string> <string name="perm_costs_money" msgid="4902470324142151116">"cela peut engendrer des frais"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Cet appareil est en cours de charge par USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Un connecteur USB alimente cet appareil"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB pour le transfert de fichiers"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB pour le transfert de photos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB pour MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connecté à un accessoire USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Touchez pour afficher plus d\'options."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Un accessoire audio analogique a été détecté"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Touchez ici en savoir plus."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string> @@ -1412,6 +1435,8 @@ <string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée."</string> <string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string> <string name="data_usage_restricted_body" msgid="469866376337242726">"Touchez pour suppr. restriction."</string> + <string name="data_usage_rapid_title" msgid="4579994056245665351">"Consomm. importante de données"</string> + <string name="data_usage_rapid_body" msgid="4899922842674185567">"Votre consommation récente de données est plus importante que d\'habitude. Touchez l\'écran pour afficher l\'usage et les paramètres."</string> <string name="ssl_certificate" msgid="6510040486049237639">"Certificat de sécurité"</string> <string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ce certificat est valide."</string> <string name="issued_to" msgid="454239480274921032">"Émis à :"</string> @@ -1641,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g> professionnel(le)"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g> professionnel(le)"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Pour annuler l\'épinglage de cet écran, maintenez enfoncés les boutons Retour et Aperçu."</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Demander le NIP avant d\'annuler l\'épinglage"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Demander le schéma de déverrouillage avant d\'annuler l\'épinglage"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string> @@ -1688,7 +1710,7 @@ </plurals> <string name="zen_mode_until" msgid="7336308492289875088">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="9128205721301330797">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string> - <string name="zen_mode_forever" msgid="1916263162129197274">"Jusqu\'à ce que vous désactiviez ce mode"</string> + <string name="zen_mode_forever" msgid="931849471004038757">"Jusqu\'à la désactivation"</string> <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Jusqu\'à ce que vous désactiviez le mode « Ne pas déranger »"</string> <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string> @@ -1737,9 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Toutes les régions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string> - <string name="work_mode_off_title" msgid="2615362773958585967">"Activer le mode professionnel?"</string> - <string name="work_mode_off_message" msgid="2961559609199223594">"Votre profil professionnel sera activé, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées"</string> + <string name="work_mode_off_title" msgid="1118691887588435530">"Activer le profil professionnel?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Vos applications professionnelles, vos notifications, vos données et les autres fonctionnalités de profil professionnel seront activées"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Cette application a été conçue pour une ancienne version d\'Android et pourrait ne pas fonctionner correctement. Essayez de vérifier les mises à jour ou communiquez avec son concepteur."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Vérifier la présence de mises à jour"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Vous avez de nouveaux messages"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Ouvrez l\'application de messagerie texte pour l\'afficher"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Certaines fonct. sont limitées"</string> @@ -1806,12 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ce téléphone n\'est pas autorisé pour la voix"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre contextuelle"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Ce raccourci nécessite la dernière version de l\'application"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Impossible de restaurer le raccourci, car l\'application ne prend pas en charge la sauvegarde et la restauration"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Impossible de restaurer le raccourci en raison d\'une erreur de correspondance des signature d\'applications"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Impossible de restaurer le raccourci"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Le raccourci est désactivé"</string> - <string name="harmful_app_warning_uninstall" msgid="3846265696369136266">"Désinstaller"</string> - <string name="harmful_app_warning_launch_anyway" msgid="5784428382367400530">"Lancer quand même"</string> - <string name="harmful_app_warning_title" msgid="2229996292333310435">"Désinstaller l\'application nuisible?"</string> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DÉSINSTALLER"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OUVRIR QUAND MÊME"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Une application nuisible a été détectée"</string> + <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches"</string> + <string name="screenshot_edit" msgid="7867478911006447565">"Modifier"</string> </resources> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 0ed3d6d412dd..9356c969ed03 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"સુરક્ષિત મોડ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android સિસ્ટમ"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"વ્યક્તિગત પ્રોફાઇલ પર સ્વિચ કરો"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"કાર્યાલયની પ્રોફાઇલ પર સ્વિચ કરો"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"સંપર્કો"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"તમારા સંપર્કોને ઍક્સેસ કરવાની"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ને તમારા સંપર્કોને ઍક્સેસ કરવાની મંજૂરી આપો"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"એપ્લિકેશનને ફોન સુવિધાઓને ઍક્સેસ કરવાની મંજૂરી આપે છે. આ પરવાનગી એપ્લિકેશનને ફોન નંબર અને ઉપકરણ ID, કૉલ સક્રિય છે અને કોઈ કૉલ દ્વારા કનેક્ટ થયેલ રિમોટ નંબર નિર્ધારિત કરવાની મંજૂરી આપે છે."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"સિસ્ટમ મારફતે કૉલ બીજે વાળો"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"કૉલિંગ અનુભવ સુધારવા માટે ઍપ્લિકેશનને સિસ્ટમ મારફતે કૉલ બીજે વાળવાની મંજૂરી આપે છે."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"તૃતીય પક્ષ ઍપમાંનો કૉલ ચાલુ રાખો"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"એક અન્ય તૃતીય પક્ષ ઍપમાં ચાલુ થયેલા કૉલને આ ઍપમાં ચાલુ રાખવાની મંજૂરી આપે છે."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ફોન નંબર વાંચો"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ઍપ્લિકેશનને ઉપકરણનાં ફોન નંબરને ઍક્સેસ કરવાની મંજૂરી આપે છે."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ટેબ્લેટને નિષ્ક્રિય થતું અટકાવો"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ફિંગરપ્રિન્ટ સંગ્રહિત કરી શકાતી નથી. કૃપા કરીને અસ્તિત્વમાંની ફિંગરપ્રિન્ટ દૂર કરો."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ફિંગરપ્રિન્ટ ઓપરેશન રદ કર્યું."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ફિંગરપ્રિન્ટ ચકાસવાની પ્રક્રિયા વપરાશકર્તાએ રદ કરી."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ઘણા બધા પ્રયત્નો. પછીથી ફરી પ્રયાસ કરો."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ઘણા વધુ પ્રયત્નો. ફિંગરપ્રિન્ટ સેન્સર અક્ષમ કરવામાં આવ્યું છે."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ફરી પ્રયાસ કરો."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"આંગળી <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ખોલો"</string> <string name="sms" msgid="4560537514610063430">"સંદેશ મોકલો"</string> <string name="add_contact" msgid="7867066569670597203">"ઉમેરો"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"જુઓ"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"શેડ્યૂલ કરો"</string> + <string name="view_flight" msgid="7691640491425680214">"ટ્રૅક કરો"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"સ્ટોરેજ સ્થાન સમાપ્ત થયું"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"કેટલાક સિસ્ટમ કાર્યો કામ કરી શકશે નહીં"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"સિસ્ટમ માટે પર્યાપ્ત સ્ટોરેજ નથી. ખાતરી કરો કે તમારી પાસે 250MB ખાલી સ્થાન છે અને ફરીથી પ્રારંભ કરો."</string> @@ -1131,8 +1127,7 @@ <item quantity="other">ખુલ્લા વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ છે</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ખુલ્લા વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"કૅરિઅરના વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરો"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ખુલ્લા વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરી રહ્યાં છીએ"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કર્યુ"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"વાઇ-ફાઇ નેટવર્ક સાથે કનેક્ટ કરી શકાયું નથી"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"કોઈ પરવાનગીઓ જરૂરી નથી"</string> <string name="perm_costs_money" msgid="4902470324142151116">"આનાથી તમારા પૈસા ખર્ચ થઈ શકે છે"</string> <string name="dlg_ok" msgid="7376953167039865701">"ઓકે"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"આ ઉપકરણને USB થી ચાર્જ કરે છે"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"જોડાયેલ ઉપકરણ માટે USB પાવર પૂરો પાડે છે"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ફાઇલ ટ્રાન્સફર માટે USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ફોટો ટ્રાન્સફર માટે USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI માટે USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ઍક્સેસરીથી કનેક્ટ થયાં"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"વધુ વિકલ્પો માટે ટૅપ કરો."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"એનાલોગ ઑડિઓ ઍક્સેસરી મળી"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેક્ટ થયું."</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"કાર્યાલય <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3જું કાર્ય <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને ઝલક બટનોને સ્પર્શ કરી રાખો"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"સ્ક્રીન પિન કરી"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"સ્ક્રીન અનપિન કરી"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"અનપિન કરતા પહેલાં પિન માટે પૂછો"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"અનપિન કરતા પહેલાં અનલૉક પૅટર્ન માટે પૂછો"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"અનપિન કરતાં પહેલાં પાસવર્ડ માટે પૂછો"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"બધી ભાષાઓ"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"તમામ પ્રદેશ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"શોધ"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"કાર્યાલયની પ્રોફાઇલ ચાલુ કરીએ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"તમારી કાર્યાલયની ઍપ, નોટિફિકેશન, ડેટા અને અન્ય કાર્યાલયની પ્રોફાઇલ સુવિધાઓ ચાલુ કરવામાં આવશે"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ચાલુ કરો"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"આ ઍપ Androidના જૂના વર્ઝન માટે બનાવવામાં આવ્યું હતું અને તે કદાચ તે યોગ્ય રીતે કાર્ય કરી શકશે નહીં. અપડેટ માટે તપાસવાનો પ્રયાસ કરો અથવા ડેવલપરનો સંપર્ક કરો."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"અપડેટ માટે તપાસો"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"તમારી પાસે નવા સંદેશા છે"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"જોવા માટે SMS ઍપ્લિકેશન ખોલો"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"કેટલીક કાર્યક્ષમતા મર્યાદિત હોઈ શકે છે"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"વૉઇસ માટે આ ફોનને મંજૂરી નથી"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"આ શૉર્ટકટ માટે નવી ઍપ જરૂરી છે"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપ બૅકઅપ અને ફરી મેળવવાનું સમર્થન કરતી નથી"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપમાં છે તે સહી મેળ ખાતી નથી"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"શૉર્ટકટ પાછો મેળવી શકાયો નથી"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"શૉર્ટકટને બંધ કરવામાં આવ્યો છે"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"અનઇન્સ્ટૉલ કરો"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"કોઈપણ રીતે ખોલો"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"નુકસાનકારક ઍપ મળી આવી છે"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>એ <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવા માગે છે"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ફેરફાર કરો"</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index d9f592c396a1..9dc0e2f23ec9 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"प्रोफ़ाइल बदलकर निजी प्रोफ़ाइल पर जाएं"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"प्रोफ़ाइल बदलकर कार्य प्रोफ़ाइल पर जाएं"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"अपने संपर्कों को ऐक्सेस करने की"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> को अपने संपर्क तक पहुंचने दें"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ऐप्स को डिवाइस की फ़ोन सुविधाओं तक पहुंचने देता है. यह अनुमति ऐप्स को फ़ोन नंबर और डिवाइस आईडी, कॉल सक्रिय है या नहीं, और कॉल द्वारा कनेक्ट किया गया दूरस्थ नंबर निर्धारित करने देती है."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"सिस्टम के माध्यम से कॉल रूट करें"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"कॉल करने के अनुभव को बेहतर बनाने के लिए ऐप्लिकेशन को सिस्टम के माध्यम से उसके कॉल रूट करने देती है."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"दूसरे ऐप्लिकेशन से शुरू किया गया कॉल जारी रखें"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"इसके ज़रिए आप, किसी ऐप्लिकेशन में शुरू किया गया कॉल दूसरे ऐप्लिकेशन में जारी रख सकते हैं."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"फ़ोन नंबर पढ़ना"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ऐप को डिवाइस के फ़ोन नंबर का इस्तेमाल करने देती है."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टैबलेट को सोने (कम बैटरी मोड) से रोकें"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फ़िंगरप्रिंट को संग्रहित नहीं किया जा सका. कृपया कोई मौजूदा फ़िंगरप्रिंट निकालें."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"फ़िंगरप्रिंट क्रियान्वयन रोक दिया गया."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"उपयोगकर्ता ने फिंगरप्रिंट की पुष्टि की कार्रवाई रद्द कर दी है."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"बहुत अधिक प्रयास कर लिए गए हैं. बाद में पुन: प्रयास करें."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"बहुत अधिक कोशिशें. फ़िंगरप्रिंट सेंसर अक्षम है."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"उंगली <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"खोलें"</string> <string name="sms" msgid="4560537514610063430">"मैसेज"</string> <string name="add_contact" msgid="7867066569670597203">"जोड़ें"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"देखें"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"शेड्यूल करें"</string> + <string name="view_flight" msgid="7691640491425680214">"मौजूदा स्थिति जानें"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"मेमोरी में जगह नहीं बची है"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"हो सकता है कुछ सिस्टम फ़ंक्शन कार्य न करें"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टम के लिए ज़रूरी मेमोरी नहीं है. पक्का करें कि आपके पास 250एमबी की खाली जगह है और फिर से शुरू करें."</string> @@ -1131,8 +1127,7 @@ <item quantity="other">खुले वाई-फ़ाई नेटवर्क उपलब्ध</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"मोबाइल और इंटरनेट सेवा देने वाली कंपनी के वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट हो रहा है"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"वाई-फ़ाई नेटवर्क से कनेक्ट हो गया है"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाई-फ़ाई नेटवर्क से कनेक्ट नहीं हो सका"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"किसी अनुमति की आवश्यकता नहीं है"</string> <string name="perm_costs_money" msgid="4902470324142151116">"इससे आपको धन देना पड़ सकता है"</string> <string name="dlg_ok" msgid="7376953167039865701">"ठीक है"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"यह डिवाइस USB से चार्ज हो रहा है"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"अटैच किए गए डिवाइस को USB से पावर मिल रही है"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"फ़ाइल स्थानांतरण के लिए USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"फ़ोटो स्थानांतरण के लिए USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI के लिए USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायक सामग्री से कनेक्ट किया गया"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"ज़्यादा विकल्पों के लिए टैप करें."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालॉग ऑडियो एक्सेसरी का पता चला"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. अधिक जानने के लिए टैप करें."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग कनेक्ट किया गया"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्यस्थल का <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"दूसरा कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"तीसरा कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"इस स्क्रीन को अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' के बटन को दबाकर रखें"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रीन पिन की गई"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रीन अनपिन की गई"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करने से पहले पिन के लिए पूछें"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"अनपिन करने से पहले लॉक खोलने के पैटर्न के लिए पूछें"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"अनपिन करने से पहले पासवर्ड के लिए पूछें"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"सभी भाषाएं"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"सभी क्षेत्र"</string> <string name="locale_search_menu" msgid="2560710726687249178">"सर्च करें"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफ़ाइल चालू करें?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"आपके काम से जुड़े ऐप्लिकेशन, सूचनाएं, डेटा और कार्य प्रोफ़ाइल से जुड़ी दूसरी सुविधाएं चालू हो जाएंगी"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करें"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"यह ऐप्लिकेशन Android के पुराने वर्शन के लिए बनाया गया था, इसलिए हो सकता है कि यह सही से काम न करे. देखें कि अपडेट मौजूद हैं या नहीं, या फिर डेवलपर से संपर्क करें."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"देखें कि अपडेट मौजूद है या नहीं"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"आपके पास नए संदेश हैं"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"देखने के लिए मैसेज (एसएमएस) ऐप खोलें"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"कुछ कार्य क्षमताएं सीमित हो सकती हैं"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"फ़ोन से कॉल करने की इजाज़त नहीं है"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"इस शॉर्टकट वाला ऐप चलाने के लिए इसका नया वर्शन डाउनलोड करें"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"शॉर्टकट बहाल नहीं किया जा सका क्योंकि इस ऐप में बैकअप लेने और उसे बहाल करने की सुविधा नहीं है"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ऐप सिग्नेचर अलग होने के कारण शॉर्टकट बहाल नहीं किया जा सका"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"शॉर्टकट बहाल नहीं किया जा सका"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"शॉर्टकट बंद है"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"अनइंस्टॉल करें"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"फिर भी खोलें"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"नुकसान पहुंचाने वाले ऐप का पता चला"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाना चाहता है"</string> <string name="screenshot_edit" msgid="7867478911006447565">"बदलाव करें"</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 880728253d3a..e0df831e949c 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Consente all\'applicazione di accedere alle funzioni telefoniche del dispositivo. Questa autorizzazione consente all\'applicazione di determinare il numero di telefono e gli ID dei dispositivi, se una chiamata è attiva e il numero remoto connesso da una chiamata."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"indirizzamento delle chiamate tramite il sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Consente all\'app di indirizzare le proprie chiamate tramite il sistema al fine di migliorare l\'esperienza di chiamata."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"Continuazione di una chiamata da un\'altra app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Consente all\'app di continuare una chiamata che è stata iniziata in un\'altra app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lettura dei numeri di telefono"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Consente all\'app di accedere ai numeri di telefono del dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"disattivazione stand-by del tablet"</string> @@ -495,10 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossibile memorizzare l\'impronta digitale. Rimuovi un\'impronta esistente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operazione associata all\'impronta digitale annullata."</string> - <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Operazione associata all\'impronta digitale annullata dall\'utente."</string> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Operazione di autenticazione dell\'impronta digitale annullata dall\'utente."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Troppi tentativi. Riprova più tardi."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Troppi tentativi. Sensore di impronte digitali disattivato."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Riprova."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Apri"</string> <string name="sms" msgid="4560537514610063430">"Invia messaggio"</string> <string name="add_contact" msgid="7867066569670597203">"Aggiungi"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Visualizza"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Pianifica"</string> + <string name="view_flight" msgid="7691640491425680214">"Monitora"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Spazio di archiviazione in esaurimento"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Alcune funzioni di sistema potrebbero non funzionare"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Memoria insufficiente per il sistema. Assicurati di avere 250 MB di spazio libero e riavvia."</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Apri rete Wi-Fi disponibile</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Stabilisci la connessione per aprire la rete Wi‑Fi"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Collegati alla rete Wi-Fi dell\'operatore"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connessione per aprire la rete Wi‑Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connessione alla rete Wi-Fi stabilita"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossibile connettersi alla rete Wi-Fi"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nessuna autorizzazione richiesta"</string> <string name="perm_costs_money" msgid="4902470324142151116">"potrebbe comportare dei costi"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Dispositivo in carica tramite USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Dispositivo collegato alimentato tramite USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB per il trasferimento di file"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB per il trasferimento di foto"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB per la modalità MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Collegato a un accessorio USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Tocca per altre opzioni."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessorio audio analogico rilevato"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Il dispositivo collegato non è compatibile con questo telefono. Tocca per avere ulteriori informazioni."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> lavoro"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> di lavoro (2°)"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> di lavoro (3°)"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Per sganciare la schermata, tieni premuti i pulsanti Indietro e Panoramica"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Schermata fissata"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Schermata sganciata"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Richiedi il PIN per lo sblocco"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Richiedi sequenza di sblocco prima di sbloccare"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Richiedi password prima di sbloccare"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Attivare il profilo di lavoro?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Le tue app di lavoro, le notifiche, i dati e altri elementi del profilo di lavoro saranno attivati."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Attiva"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Questa app è stata realizzata per una versione precedente di Android e potrebbe non funzionare correttamente. Prova a verificare la disponibilità di aggiornamenti o contatta lo sviluppatore."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Verifica la presenza di aggiornamenti"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Hai nuovi messaggi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Apri l\'app SMS per la visualizzazione"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Funzioni potenzial. limitate"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefono non consentito per la voce"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Finestra popup"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Per questa scorciatoia è necessaria l\'app più recente"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Impossibile ripristinare la scorciatoia perché l\'app non supporta il backup e il ripristino"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Impossibile ripristinare la scorciatoia perché la firma dell\'app non corrisponde"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Impossibile ripristinare la scorciatoia"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"La scorciatoia è disattivata"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DISINSTALLA"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"APRI COMUNQUE"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"App dannosa rilevata"</string> <string name="slices_permission_request" msgid="8484943441501672932">"L\'app <xliff:g id="APP_0">%1$s</xliff:g> vuole mostrare porzioni dell\'app <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Modifica"</string> </resources> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index ee690b549421..14c295f4c599 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"ಸುರಕ್ಷಿತ ಮೋಡ್"</string> <string name="android_system_label" msgid="6577375335728551336">"Android ಸಿಸ್ಟಂ"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ಗೆ ಬದಲಾಯಿಸಿ"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಬದಲಿಸಿ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ಸಂಪರ್ಕಗಳು"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಪ್ರವೇಶಿಸಲು <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ಗೆ ಅನುಮತಿಸಿ"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ಸಾಧನದ ಫೋನ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ಫೋನ್ ಸಂಖ್ಯೆ ಮತ್ತು ಸಾಧನದ ID ಗಳನ್ನು ನಿರ್ಧರಿಸಲು, ಕರೆಯು ಸಕ್ರಿಯವಾಗಿದೆಯೇ ಮತ್ತು ಕರೆಯ ಮೂಲಕ ರಿಮೋಟ್ ಸಂಖ್ಯೆಯು ಸಂಪರ್ಕಗೊಂಡಿವೆಯೇ ಎಂಬುದನ್ನೂ ನಿರ್ಧರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ಕರೆಗಳನ್ನು ಸಿಸ್ಟಂ ಮೂಲಕ ರವಾನಿಸಿ"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"ಕರೆಯ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ನ ಕರೆಗಳನ್ನು ಸಿಸ್ಟಂ ಮೂಲಕ ರವಾನಿಸಲು ಅನುಮತಿಸುತ್ತದೆ."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಪ್ರಾರಂಭವಾದ ಕರೆಯನ್ನು ಮುಂದುವರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡಿ."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ಫೋನ್ ಸಂಖ್ಯೆಗಳನ್ನು ಓದಿ"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ಸಾಧನದ ಫೋನ್ ಸಂಖ್ಯೆಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ಟ್ಯಾಬ್ಲೆಟ್ ನಿದ್ರಾವಸ್ಥೆಯನ್ನು ತಡೆಯಿರಿ"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ಬೆರಳಚ್ಚು ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬೆರಳಚ್ಚು ತೆಗೆದುಹಾಕಿ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಬೆರಳಚ್ಚು ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ಬೆರಳಚ್ಚು ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ಬಳಕೆದಾರರಿಂದ ಫಿಂಗರ್ ಫ್ರಿಂಟ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಪಡಿಸಲಾಗಿದೆ."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫಿಂಗರ್ ಫ್ರಿಂಟ್ ಸೆನ್ಸಾರ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"ಫಿಂಗರ್ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ತೆರೆ"</string> <string name="sms" msgid="4560537514610063430">"ಸಂದೇಶ"</string> <string name="add_contact" msgid="7867066569670597203">"ಸೇರಿಸಿ"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"ವೀಕ್ಷಿಸಿ"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"ಅವಧಿ"</string> + <string name="view_flight" msgid="7691640491425680214">"ಟ್ರ್ಯಾಕ್"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ಸಂಗ್ರಹಣೆ ಸ್ಥಳವು ತುಂಬಿದೆ"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"ಕೆಲವು ಸಿಸ್ಟಂ ಕಾರ್ಯವಿಧಾನಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ಸಿಸ್ಟಂನಲ್ಲಿ ಸಾಕಷ್ಟು ಸಂಗ್ರಹಣೆಯಿಲ್ಲ. ನೀವು 250MB ನಷ್ಟು ಖಾಲಿ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮರುಪ್ರಾರಂಭಿಸಿ."</string> @@ -1131,8 +1127,7 @@ <item quantity="other">ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿವೆ</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ವಾಹಕ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"ಯಾವುದೇ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿಲ್ಲ"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ಇದು ನಿಮ್ಮ ಹಣವನ್ನು ವ್ಯಯಿಸಬಹುದು"</string> <string name="dlg_ok" msgid="7376953167039865701">"ಸರಿ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ಈ ಸಾಧನಕ್ಕೆ USB ಅನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB, ಲಗತ್ತಿಸಲಾದ ಸಾಧನಕ್ಕೆ ಪವರ್ ಪೂರೈಸುತ್ತಿದೆ"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ಫೈಲ್ ವರ್ಗಾವಣೆಗೆ USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ಫೋಟೋ ವರ್ಗಾವಣೆಗೆ USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI ಗೆ USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ಪರಿಕರಕ್ಕೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ಅನ್ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗ್ ಸಂಪರ್ಕ"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"ಕೆಲಸ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 ನೇ ಕೆಲಸದ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 ನೇ ಕೆಲಸದ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಸಮಗ್ರ ನೋಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"ಸ್ಕ್ರೀನ್ ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"ಸ್ಕ್ರೀನ್ ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ಅನ್ಪಿನ್ ಮಾಡಲು ಪಿನ್ ಕೇಳು"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ಅನ್ಪಿನ್ ಮಾಡಲು ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಕೇಳಿ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ಅನ್ಪಿನ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ಕೇಳು"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕಿ"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಆನ್ ಮಾಡುವುದೇ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"ನಿಮ್ಮ ಕೆಲಸದ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಅಧಿಸೂಚನೆಗಳು, ಡೇಟಾ ಮತ್ತು ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ನ ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಆನ್ ಮಾಡಲಾಗುತ್ತದೆ"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡಿ"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು Android ನ ಹಳೆಯ ಆವೃತ್ತಿಗೆ ರಚಿಸಲಾಗಿದೆ ಮತ್ತು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು. ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ಡೆವಲಪರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ಅಪ್ಡೇಟ್ಗಾಗಿ ಪರಿಶೀಲಿಸಿ"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ನೀವು ಹೊಸ ಸಂದೇಶಗಳನ್ನು ಹೊಂದಿರುವಿರಿ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ವೀಕ್ಷಿಸಲು SMS ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ಕೆಲವು ಕಾರ್ಯನಿರ್ವಹಣೆಗಳು ಸೀಮಿತವಾಗಿರಬಹುದು"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ಧ್ವನಿಗಾಗಿ ಫೋನ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"ಪಾಪ್ಅಪ್ ವಿಂಡೋ"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ಈ ಶಾರ್ಟ್ಕಟ್ಗೆ ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ ಅಗತ್ಯವಿದೆ"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ಅಪ್ಲಿಕೇಶನ್ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ಅಪ್ಲಿಕೇಶನ್ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃ ಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ಶಾರ್ಟ್ಕಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ಹೇಗಿದ್ದರೂ ತೆರೆಯಿರಿ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ಎಡಿಟ್"</string> </resources> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 088d44f931bc..cc568d388960 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Safe mode"</string> <string name="android_system_label" msgid="6577375335728551336">"ລະບົບ Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"ສະຫຼັບໄປໂປຣໄຟລ໌ສ່ວນຕົວ"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"ສະຫຼັບໄປໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ລາຍຊື່"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ເຂົ້າຫາລາຍຊື່ຂອງທ່ານ"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"ອະນຸຍາດ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ໃຫ້ເຂົ້າເຖິງລາຍຊື່ຜູ້ຕິດຕໍ່ຂອງທ່ານ"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ອະນຸຍາດໃຫ້ແອັບຯ ເຂົ້າເຖິງຄວາມສາມາດການໂທລະສັບຂອງອຸປະກອນ. ການກຳນົດສິດນີ້ເຮັດໃຫ້ແອັບຯສາມາດກວດສອບເບີໂທລະສັບ ແລະ ID ຂອງອຸປະກອນ, ບໍ່ວ່າການໂທຈະຍັງດຳເນີນຢູ່ ແລະເບີປາຍທາງເຊື່ອມຕໍ່ຢູ່ຫຼືບໍ່ກໍຕາມ."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"route calls through the system"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Allows the app to route its calls through the system in order to improve the calling experience."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"ສືບຕໍ່ການໂທຈາກແອັບອື່ນ"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ອະນຸຍາດໃຫ້ແອັບສືບຕໍ່ການໂທເຊິ່ງອາດຖືກເລີ່ມຕົ້ນໃນແອັບອື່ນ."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ອ່ານເບີໂທລະສັບ"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ອະນຸຍາດໃຫ້ແອັບເຂົ້າເຖິງເບີໂທລະສັບຂອງອຸປະກອນໄດ້."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ຂັດຂວາງບໍ່ໃຫ້ປິດໜ້າຈໍແທັບເລັດ"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ບໍ່ສາມາດເກັບຮັກສາລາຍນີ້ວມືໄວ້ໄດ້. ກະລຸນາເອົາລາຍນີ້ວມືທີ່ມີຢູ່ອອກໄປ."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ຍົກເລີກການດຳເນີນການລາຍນີ້ວມືແລ້ວ."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ຜູ້ໃຊ້ໄດ້ຍົກເລີກຄຳສັ່ງລາຍນິ້ວມືແລ້ວ."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ລອງໃໝ່ພາຍຫຼັງ."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ລະບົບປິດການເຮັດວຽກຂອງເຊັນເຊີລາຍນິ້ວມືແລ້ວ."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ລອງໃໝ່ອີກຄັ້ງ."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"ນີ້ວມື <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ເປີດ"</string> <string name="sms" msgid="4560537514610063430">"ຂໍ້ຄວາມ"</string> <string name="add_contact" msgid="7867066569670597203">"ເພີ່ມ"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"ເບິ່ງ"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"ຕັ້ງເວລາ"</string> + <string name="view_flight" msgid="7691640491425680214">"ແທຣັກ"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ພື້ນທີ່ຈັດເກັບຂໍ້ມູນກຳລັງຈະເຕັມ"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"ການເຮັດວຽກບາງຢ່າງຂອງລະບົບບາງອາດຈະໃຊ້ບໍ່ໄດ້"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ບໍ່ມີບ່ອນເກັບຂໍ້ມູນພຽງພໍສຳລັບລະບົບ. ກວດສອບໃຫ້ແນ່ໃຈວ່າທ່ານມີພື້ນທີ່ຫວ່າງຢ່າງໜ້ອຍ 250MB ແລ້ວລອງໃໝ່."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">ເປີດເຄືອຂ່າຍ Wi-Fi ທີ່ມີໃຫ້</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແບບເປີດ"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ຜູ້ໃຫ້ບໍລິການ"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ກຳລັງເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແລ້ວ"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ໄດ້"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"ບໍ່ຕ້ອງການການອະນຸຍາດ"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ລາຍການນີ້ອາດມີການເກັບເງິນ"</string> <string name="dlg_ok" msgid="7376953167039865701">"ຕົກລົງ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ກຳລັງສາກໄຟ USB ອຸປະກອນນີ້"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB ກຳລັງສະໜອງໄຟໃຫ້ກັບອຸປະກອນທີ່ເຊື່ອມຕໍ່ກັນ"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB ສຳລັບການໂອນໄຟລ໌"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB ສຳລັບການໂອນໄຟລ໌"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB ສຳລັບ MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ເຊື່ອມຕໍ່ກັບອຸປະກອນເສີມ USB ແລ້ວ"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ກວດພົບອຸປະກອນເສີມສຽງ"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່ນັ້ນບໍ່ສາມາດໃຊ້ຮ່ວມກັບໂທລະສັບນີ້ໄດ້. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"ບ່ອນເຮັດວຽກ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ບ່ອນເຮັດວຽກທີ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"ບ່ອນເຮັດວຽກທີ 3 <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ເພື່ອຍົກເລີກການປັກໝຸດໜ້າຈໍນີ້, ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"ຍົກເລີກການປັກໝຸນຫນ້າຈໍແລ້ວ"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ຖາມຫາ PIN ກ່ອນຍົກເລີກການປັກໝຸດ"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ຖາມຫາຮູບແບບປົດລັອກກ່ອນຍົກເລີກການປັກໝຸດ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ຖາມຫາລະຫັດຜ່ານກ່ອນຍົກເລີກການປັກໝຸດ"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"ທຸກພາສາ"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"ທຸກຂົງເຂດ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ຄົ້ນຫາ"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"ເປີດໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກບໍ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"ແອັບວຽກຂອງທ່ານ, ການແຈ້ງເຕືອນ, ຂໍ້ມູນ ແລະ ຄຸນສົມບັດໂປຣໄຟລ໌ວຽກຈະຖືກເປີດໃຊ້"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ເປີດ"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ແອັບນີ້ຖືກສ້າງຂຶ້ນສຳລັບ Android ເວີຊັນທີ່ເກົ່າກວ່າ ແລະ ອາດເຮັດວຽກໄດ້ບໍ່ປົກກະຕິ. ໃຫ້ລອງກວດສອບເບິ່ງອັບເດດ ຫຼື ຕິດຕໍ່ຜູ້ພັດທະນາ."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ກວດເບິ່ງອັບເດດ"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ທ່ານມີຂໍ້ຄວາມໃໝ່"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ເປີດແອັບ SMS ເພື່ອເບິ່ງ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ບາງຄວາມສາມາດນຳໃຊ້ອາດຈະຖືກຈຳກັດ"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບສຳລັບການໂທສຽງ"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"ໜ້າຈໍປັອບອັບ"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ທາງລັດນີ້ຕ້ອງໃຊ້ແອັບເວີຊັນຫຼ້າສຸດ"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ບໍ່ສາມາດກູ້ທາງລັດຂຶ້ນມາໄດ້ເນື່ອງຈາກແອັບບໍ່ຮອງຮັບການສຳຮອງ ແລະ ກູ້ຂໍ້ມູນ"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້ເນື່ອງຈາກລາຍເຊັນແອັບບໍ່ກົງກັນ"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ທາງລັດຖືກປິດການນຳໃຊ້"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ຖອນການຕິດຕັ້ງ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ຢືນຢັນການເປີດ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ແກ້ໄຂ"</string> </resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 746ac524c25d..7c6f7f017c73 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Овозможува апликацијата да пристапи кон карактеристиките на телефонот на уредот. Оваа дозвола овозможува апликацијата да ги утврди телефонскиот број и ID на уредот, дали повикот е активен и далечинскиот број поврзан со повикот."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"пренасочи повици преку системот"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Дозволете ѝ на апликацијата да ги пренасочи повиците преку системот за да го подобри искуството при јавувањето."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"продолжување повик од друга апликација"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Овозможува апликацијата да продолжи повик започнат на друга апликација."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"да чита телефонски броеви"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Ѝ дозволува на апликацијата да пристапи до телефонските броеви на уредот."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"спречи режим на штедење кај таблет"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Премногу обиди. Обидете се повторно подоцна."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Премногу обиди. Сензорот за отпечатоци е оневозможен."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Обидете се повторно."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Отвори"</string> <string name="sms" msgid="4560537514610063430">"Порака"</string> <string name="add_contact" msgid="7867066569670597203">"Додај"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Прикажи"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Распоред"</string> + <string name="view_flight" msgid="7691640491425680214">"Песна"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Капацитетот е речиси полн"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некои системски функции може да не работат"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема доволно меморија во системот. Проверете дали има слободен простор од 250 МБ и рестартирајте."</string> @@ -1128,8 +1127,7 @@ <item quantity="other">Отворени Wi-Fi мрежи се достапни</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Поврзете се на отворена Wi‑Fi-мрежа"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Поврзете се на Wi‑Fi-мрежа на оператор"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Поврзување на отворена Wi‑Fi-мрежа"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Се поврзавте на Wi‑Fi-мрежа"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можеше да се поврзе на Wi‑Fi-мрежа"</string> @@ -1214,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Не се потребни дозволи"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ова може да ве чини пари"</string> <string name="dlg_ok" msgid="7376953167039865701">"Во ред"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Уредов се полни преку USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Прикачениот уред се напојува преку USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB за пренос на датотеки"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB за пренос на фотографии"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB за МИДИ"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Поврзан со USB додаток"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Допрете за повеќе опции."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Откриен е аналоген аудиододаток"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Приложениот уред не е компатибилен со телефонов. Допрете за да дознаете повеќе."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку USB"</string> @@ -1661,9 +1669,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Работа <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Втора деловна <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трета деловна <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"За откачување на екранов, допрете и задржете ги копчињата „Назад“ и „Краток преглед“."</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Екранот е закачен"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Екранот е откачен"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Прашај за PIN пред откачување"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Побарај шема за откл. пред откачување"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Прашај за лозинка пред откачување"</string> @@ -1760,10 +1765,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Да се вклучи работниот профил?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Вашите работни апликации, известувања, податоци и други функции на работниот профил ќе бидат вклучени"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Вклучи"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Апликацијава е создадена за постара верзија на Android и може да не функционира правилно. Проверете за ажурирања или контактирајте со програмерот."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Проверка за ажурирање"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нови пораки"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Отворете ја апликацијата за SMS за приказ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Некои функции се ограничени"</string> @@ -1830,17 +1833,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Не е дозволен телефон за глас"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Појавен прозорец"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"За кратенкава е потребна најновата апликација"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не можеше да се врати кратенката бидејќи апликацијата не поддржува бекап и враќање"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не можеше да се врати кратенката бидејќи потписот на апликацијата не се совпаѓа"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не можеше да се врати кратенката"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Кратенката е оневозможена"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ДЕИНСТАЛИРАЈ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"СЕПАК ОТВОРИ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Откриена е штетна апликација"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> сака да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Измени"</string> </resources> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 022e07776d1e..cfde3c6df8db 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"സുരക്ഷിത മോഡ്"</string> <string name="android_system_label" msgid="6577375335728551336">"Android സിസ്റ്റം"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"വ്യക്തിഗത പ്രൊഫൈലിലേക്ക് മാറുക"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് മാറുക"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"കോൺടാക്റ്റുകൾ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ ആക്സസ്സ് ചെയ്യുക"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"നിങ്ങളുടെ കോണ്ടാക്റ്റുകള് ആക്സസ് ചെയ്യാൻ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ആപ്പിനെ അനുവദിക്കുക"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ഉപകരണത്തിന്റെ ഫോൺ സവിശേഷതകൾ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഈ അനുമതി ഫോൺ നമ്പർ, ഉപകരണ ഐഡികൾ, ഒരു കോൾ സജീവമാണോയെന്നത്, ഒരു കോൾ കണക്റ്റുചെയ്ത വിദൂര നമ്പർ എന്നിവ നിർണ്ണയിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"കോളുകൾ സിസ്റ്റത്തിലൂടെ വിടുക"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"കോളിംഗ് അനുഭവം മെച്ചപ്പെടുത്തുന്നതിനായി തങ്ങളുടെ കോളുകൾ സിസ്റ്റത്തിലേയ്ക്ക് വഴിതിരിച്ചുവിടാൻ ആപ്പുകളെ അനുവദിക്കുന്നു."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"മറ്റൊരു ആപ്പിൽ നിന്നുള്ള കോൾ തുടരുക"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"മറ്റൊരു ആപ്പിൽ ആരംഭിച്ച കോൾ തുടരാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ഫോൺ നമ്പറുകൾ റീഡുചെയ്യൽ"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ഉപകരണത്തിന്റെ ഫോൺ നമ്പറുകൾ ആക്സസ് ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"സുഷുപ്തിയിലാകുന്നതിൽ നിന്ന് ടാബ്ലെറ്റിനെ തടയുക"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"വിരലടയാളം സംഭരിക്കാനാവില്ല. നിലവിലുള്ള വിരലടയാളം നീക്കംചെയ്യുക."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ഫിംഗർപ്രിന്റ് പ്രവർത്തനം റദ്ദാക്കി."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ഉപയോക്താവ് റദ്ദാക്കിയ ഫിംഗർപ്രിന്റ് പ്രവർത്തനം."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"നിരവധി തവണ ശ്രമിച്ചതിനാൽ, വിരലടയാള സെൻസർ പ്രവർത്തനരഹിതമായി."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"വീണ്ടും ശ്രമിക്കൂ."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"കൈവിരൽ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"തുറക്കുക"</string> <string name="sms" msgid="4560537514610063430">"സന്ദേശം"</string> <string name="add_contact" msgid="7867066569670597203">"ചേർക്കുക"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"കാണുക"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"ഷെഡ്യൂള്"</string> + <string name="view_flight" msgid="7691640491425680214">"ട്രാക്ക്"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"സംഭരണയിടം കഴിഞ്ഞു"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"ചില സിസ്റ്റം പ്രവർത്തനങ്ങൾ പ്രവർത്തിക്കണമെന്നില്ല."</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"സിസ്റ്റത്തിനായി മതിയായ സംഭരണമില്ല. 250MB സൗജന്യ സംഭരണമുണ്ടെന്ന് ഉറപ്പുവരുത്തി പുനരാരംഭിക്കുക."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്ക് തുറക്കുക</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"കാരിയർ വൈഫൈ നെറ്റ്വര്ക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുന്നു"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്തു"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"വൈ-ഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"അനുമതികളൊന്നും ആവശ്യമില്ല"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ഇത് നിങ്ങൾക്ക് പണച്ചെലവിനിടയാക്കാം"</string> <string name="dlg_ok" msgid="7376953167039865701">"ശരി"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB ഈ ഉപകരണം ചാർജജ് ചെയ്യുന്നു"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"ഘടിപ്പിച്ചിട്ടുള്ള ഉപകരണത്തിന് USB വൈദ്യുതി നൽകുന്നു"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ഫയൽ കൈമാറ്റത്തിനുള്ള USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ഫോട്ടോ കൈമാറ്റത്തിനായുള്ള USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI-യ്ക്കായുള്ള USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ഒരു USB ആക്സസ്സറി കണക്റ്റുചെയ്തു"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"അനലോഗ് ഓഡിയോ ആക്സസറി കണ്ടെത്തി"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"അറ്റാച്ചുചെയ്ത ഉപകരണം ഈ ഫോണിന് അനുയോജ്യമല്ല. കൂടുതലറിയാൻ ടാപ്പുചെയ്യുക."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"ഔദ്യോഗികം <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"രണ്ടാമത്തെ ഔദ്യോഗിക <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"മൂന്നാമത്തെ ഔദ്യോഗിക <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, ബാക്ക്, ചുരുക്കവിവരണം എന്നീ ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"സ്ക്രീൻ പിൻ ചെയ്തു"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"സ്ക്രീൻ അൺപിൻ ചെയ്തു"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ചെയ്യുംമുമ്പ് പിൻ ചോദിക്കൂ"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"അൺപിന്നിനുമുമ്പ് അൺലോക്ക് പാറ്റേൺ ആവശ്യപ്പെടൂ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"അൺപിന്നിനുമുമ്പ് പാസ്വേഡ് ആവശ്യപ്പെടൂ"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"എല്ലാ ഭാഷകളും"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"എല്ലാ പ്രദേശങ്ങളും"</string> <string name="locale_search_menu" msgid="2560710726687249178">"തിരയുക"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"ഔദ്യോഗിക പ്രൊഫൈൽ ഓണാക്കണോ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"നിങ്ങളുടെ ഔദ്യോഗിക ആപ്പുകൾ, അറിയിപ്പുകൾ, ഡാറ്റ, മറ്റ് ഔദ്യോഗിക പ്രൊഫൈൽ ഫീച്ചറുകൾ എന്നിവ ഓണാക്കും"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ഓണാക്കുക"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ഈ ആപ്പ് Android-ന്റെ പഴയ പതിപ്പിനായി നിർമ്മിച്ചിരിക്കുന്നതിനാൽ ശരിയായി പ്രവർത്തിച്ചേക്കില്ല. അപ്ഡേറ്റിനായി പരിശോധിക്കുക, അല്ലെങ്കിൽ ഡെവലപ്പറുമായി ബന്ധപ്പെടുക."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"അപ്ഡേറ്റിനായി പരിശോധിക്കുക"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"നിങ്ങൾക്ക് പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"കാണുന്നതിന് SMS ആപ്പ് തുറക്കുക"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ചില പ്രവർത്തനക്ഷമതകൾ പരിമിതപ്പെടാം"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ഫോൺ വോയ്സിന് അനുവദനീയമല്ല"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"പോപ്പ് അപ്പ് വിൻഡോ"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ഈ കുറുക്കുവഴിക്ക് ഏറ്റവും പുതിയ ആപ്പ് ആവശ്യമാണ്"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ആപ്പ് \'ബാക്കപ്പും പുനഃസ്ഥാപിക്കലും\' പിന്തുണയ്ക്കാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ആപ്പ് സിഗ്നേച്ചർ പൊരുത്തപ്പെടാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"കുറുക്കുവഴി പ്രവർത്തനരഹിതമാണ്"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"അൺഇൻസ്റ്റാള് ചെയ്യുക"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"എന്തായാലും തുറക്കുക"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ദോഷകരമായ ആപ്പ് കണ്ടെത്തി"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു"</string> <string name="screenshot_edit" msgid="7867478911006447565">"എഡിറ്റ് ചെയ്യുക"</string> </resources> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 0da8708d9311..d1a5455b6775 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"Android सिस्टम"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"वैयक्तिक प्रोफाइलवर स्विच करा"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलवर स्विच करा"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"संपर्क"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"आपल्या संपर्कांवर प्रवेश"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ला तुमचे संपर्क अॅक्सेस करू द्या"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"प्रणालीच्या माध्यमातून कॉल रूट करा"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"कॉल करण्याचा अनुभव सुधारण्यासाठी अॅपला त्याचे कॉल प्रणालीच्या माध्यमातून रूट करू देते."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"दुसऱ्या अॅपवरून कॉल करणे सुरू ठेवा"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"दुसऱ्या अॅपमध्ये सुरू झालेल्या कॉलला पुढे सुरू ठेवण्याची अॅपला अनुमती देते."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"फोन नंबर वाचा"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"अॅपला डिव्हाइसच्या फोन नंबरमध्ये प्रवेश करण्याची अनुमती देते."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टॅबलेट निष्क्रिय होण्यापासून प्रतिबंधित करा"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"फिंगरप्रिंट स्टोअर केले जाऊ शकत नाही. कृपया विद्यमान फिंगरप्रिंट काढा."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट टाइमआउट झाले. पुन्हा प्रयत्न करा."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"फिंगरप्रिंट ऑपरेशन रद्द झाले."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"वापरकर्त्याने फिंगरप्रिंट ऑपरेशन रद्द केले."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"खूप प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"खूप प्रयत्न करून झाले. फिंगरप्रिंट सेंसर बंद आहे."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन्हा प्रयत्न करा."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> बोट"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"उघडा"</string> <string name="sms" msgid="4560537514610063430">"संदेश"</string> <string name="add_contact" msgid="7867066569670597203">"जोडा"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"पहा"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"शेड्यूल"</string> + <string name="view_flight" msgid="7691640491425680214">"ट्रॅक"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"संचयन स्थान संपत आहे"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"काही सिस्टम कार्ये कार्य करू शकत नाहीत"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टीमसाठी पुरेसे संचयन नाही. आपल्याकडे 250MB मोकळे स्थान असल्याचे सुनिश्चित करा आणि रीस्टार्ट करा."</string> @@ -1131,8 +1127,7 @@ <item quantity="other">खुले वाय-फाय नेटवर्क उपलब्ध</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करा"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"वाहक वाय-फाय नेटवर्कशी कनेक्ट करा"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करत आहे"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"वाय-फाय नेटवर्कशी कनेक्ट केले"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाय-फाय नेटवर्कशी कनेक्ट करू शकत नाही"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"परवानग्या आवश्यक नाहीत"</string> <string name="perm_costs_money" msgid="4902470324142151116">"यासाठी आपले पैसे खर्च होऊ शकतात"</string> <string name="dlg_ok" msgid="7376953167039865701">"ठीक"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB हे डिव्हाइस चार्ज करत आहे"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB संलग्न केलेल्या डिव्हाइसला पॉवरचा पुरवठा करत आहे"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"स्थानांतरणासाठी USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"फोटो स्थानांतरणासाठी USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI साठी USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB उपसाधनावर कनेक्ट केले"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"अधिक पर्यायांसाठी टॅप करा."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"अॅनालॉग ऑडिओ अॅक्सेसरी आढळली"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"या फोनसह संलग्न केलेले डीव्हाइस सुसंगत नाही. अधिक जाणून घेण्यासाठी टॅप करा."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेक्ट केले"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 रे कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 रे कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"हा स्क्रीन अनपिन करण्यासाठी, मागे आणि अवलोकन बटणांना स्पर्श करून धरून ठेवा"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रीन पिन केली"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रीन अनपिन केली"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करण्यापूर्वी पिन साठी विचारा"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"अनपिन करण्यापूर्वी अनलॉक नमुन्यासाठी विचारा"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"अनपिन करण्यापूर्वी संकेतशब्दासाठी विचारा"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"सर्व भाषा"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"सर्व प्रदेश"</string> <string name="locale_search_menu" msgid="2560710726687249178">"शोध"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफाइल चालू ठेवायची?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"तुमची कार्य अॅप्स, सूचना, डेटा आणि अन्य कार्य प्रोफाइल वैशिष्ट्ये चालू केली जातील"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"चालू करा"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"हे अॅप Android च्या जुन्या आवृत्ती साठी तयार करण्यात आले होते आणि योग्यरितीने कार्य करू शकणार नाही. अपडेट आहेत का ते तपासून पाहा, किंवा डेव्हलपरशी संपर्क साधण्याचा प्रयत्न करा."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"अपडेट आहे का ते तपासा"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"आपल्याकडे नवीन संदेश आहेत"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"पाहण्यासाठी SMS अॅप उघडा"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"काही कार्यक्षमता मर्यादित असू शकतात"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"व्हॉइसची फोनला अनुमती नाही"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"या शॉर्टकटला नवीनतम अॅपची आवश्यकता आहे"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"अॅप बॅकअप आणि रिस्टोअर करण्यास सपोर्ट देत नसल्यामुळे शॉर्टकट रिस्टोअर करू शकलो नाही"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"अॅप स्वाक्षरी न जुळल्यामुळे शॉर्टकट रिस्टोअर करू शकलो नाही"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"शॉर्टकट रिस्टोअर करू शकलो नाही"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"शॉर्टकट बंद केलेला आहे"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"अनइंस्टॉल करा"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"तरीही उघडा"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अॅप आढळला"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवायचे आहेत"</string> <string name="screenshot_edit" msgid="7867478911006447565">"संपादित करा"</string> </resources> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index afccd7975c0b..4c757df93e74 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"အပလီကေးရှင်းအား ဖုန်းရဲ့ စွမ်းဆောင်ချက်များအား သုံးခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် ဖုန်းနံပါတ်၊ စက်နံပါတ်၊ ဖုန်းခေါ်နေမှု ရှိမရှိနှင့် တဖက်မှ ဖုန်းနံပါတ် များအား သိရှိနိုင်ပါသည်"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ခေါ်ဆိုမှုများကို စနစ်မှတစ်ဆင့် ဖြတ်သန်းခွင့်ပြုပါ"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"ခေါ်ဆိုမှု အတွေ့အကြုံ ပိုမိုကောင်းမွန်လာစေရန်အတွက် အက်ပ်၏ ခေါ်ဆိုမှုအား စနစ်မှတစ်ဆင့် ဖြတ်သန်းရန် ခွင့်ပြုပါသည်။"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"အခြားအက်ပ်မှ ဖုန်းခေါ်ဆိုမှုကို ဆက်လက်ပြုလုပ်ပါ"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"အခြားအက်ပ်တွင် စတင်ထားသည့် ဖုန်းခေါ်ဆိုမှုကို ဆက်လက်ပြုလုပ်ရန် ဤအက်ပ်ကို ခွင့်ပြုသည်။"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ဖုန်းနံပါတ်များကို ဖတ်ရန်"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"အက်ပ်ကို စက်ပစ္စည်း၏ ဖုန်းနံပါတ်များအား အသုံးပြုခွင့်ပေးပါ။"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"တက်ပလက်အား ပိတ်ခြင်းမှ ကာကွယ်ခြင်း"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ကြိုးစာမှု အကြိမ်များနေ၏။ နောက်မှ ထပ်မံကြိုးစားပါ။"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"အကြိမ်အရေအတွက် အလွန်များနေပါပြီ။ လက်ဗွေဖတ်စနစ်ကို ပိတ်ထားပါသည်။"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ပြန်ကြိုးစားပါ"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ဖွင့်ရန်"</string> <string name="sms" msgid="4560537514610063430">"စာပို့ရန်"</string> <string name="add_contact" msgid="7867066569670597203">"ထည့်ရန်"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"ကြည့်ရန်"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"အချိန်ဇယား"</string> + <string name="view_flight" msgid="7691640491425680214">"ရှာရန်"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"တချို့ စနစ်လုပ်ငန်းများ အလုပ် မလုပ်ခြင်း ဖြစ်နိုင်ပါသည်"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string> @@ -1128,8 +1127,7 @@ <item quantity="one">Wi-Fi ကွန်ယက်ရရှိနိုင်သည်အား ဖွင့်ပါ</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ဝန်ဆောင်မှုပေးသူ Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်နေသည်"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပြီးပါပြီ"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်၍ မရပါ"</string> @@ -1214,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"ခွင့်ပြုချက်မလိုအပ်ပါ"</string> <string name="perm_costs_money" msgid="4902470324142151116">"သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်"</string> <string name="dlg_ok" msgid="7376953167039865701">"အိုကေ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ဤစက်ကို USB ဖြင့် အားသွင်းနေသည်"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို USB မှတစ်ဆင့် အားသွင်းနေသည်"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ဖိုင်လွှဲပြောင်းရန်အတွက် USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ဓာတ်ပုံလွှဲပြောင်းရန်အတွက် USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI အတွက် USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USBတွဲဖက်ပစ္စည်းအား ချိတ်ဆက်ထားသည်"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"အန်နာလော့ အသံကိရိယာကို တွေ့ထားပါသည်"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"တပ်ဆင်ထားသော ကိရိယာကို ဤဖုန်းနှင့် တွဲသုံး၍မရပါ။ ပိုမိုလေ့လာရန် တို့ပါ။"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်"</string> @@ -1659,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"အလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ဒုတိယအလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"တတိယအလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် \'နောက်သို့\' နှင့် \'အနှစ်ချုပ်\' ခလုတ်များကို အတူတို့၍ ထိထားပါ"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"မျက်နှာပြင်ကို ပင်ထိုးထား"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"မျက်နှာပြင် ပင်ထိုးမှု ဖြတ်လိုက်ပြီ"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ပင်မဖြုတ်မီမှာ PIN ကို မေးကြည့်ရန်"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ပင်မဖြုတ်မီမှာ သော့ဖွင့် ရေးဆွဲမှုပုံစံကို မေးကြည့်ရန်"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ပင်မဖြုတ်မီမှာ စကားဝှက်ကို မေးကြည့်ရန်"</string> @@ -1758,10 +1763,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"အလုပ်ပရိုဖိုင် ဖွင့်လိုသလား။"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"သင်၏ အလုပ်အက်ပ်၊ အကြောင်းကြားချက်၊ ဒေတာနှင့် အခြားအလုပ်ပရိုဖိုင် ဝန်ဆောင်မှုများကို ဖွင့်လိုက်ပါမည်"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ဖွင့်ပါ"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ဤအက်ပ်ကို Android ဗားရှင်းဟောင်းအတွက် ပြုလုပ်ထားခြင်းဖြစ်ပြီး ပုံမှန်အလုပ်မလုပ်နိုင်ပါ။ အပ်ဒိတ်များအတွက် ရှာကြည့်ပါ သို့မဟုတ် ဆော့ဖ်ဝဲအင်ဂျင်နီယာကို ဆက်သွယ်ပါ။"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"အပ်ဒိတ်အတွက် စစ်ကြည့်ရန်"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"သင့်ထံတွင် စာအသစ်များရောက်နေသည်"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ကြည့်ရှုရန် SMS အက်ပ်ကိုဖွင့်ပါ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"အချို့လုပ်ဆောင်ချက်များ ကန့်သတ်ချက်ရှိနိုင်သည်"</string> @@ -1828,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"စကားသံအတွက် ဖုန်းကို ခွင့်မပြုပါ"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"ပေါ့ပ်အပ် ဝင်းဒိုး"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ဤဖြတ်လမ်းလင့်ခ်ကို အသုံးပြုနိုင်ရန် နောက်ဆုံးထွက်အက်ပ် လိုအပ်ပါသည်"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"အက်ပ်သည် မိတ္တူကူးခြင်းနှင့် ပြန်ယူခြင်းကို ပံ့ပိုးခြင်းမရှိသည့်အတွက် ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"အက်ပ်လက်မှတ် မတူညီသည့်အတွက် ဖြတ်လမ်းလင့်ခ်များကို ပြန်ယူ၍မရပါ"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ဖြတ်လမ်းလင့်ခ် ပိတ်ထားသည်"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ဖြုတ်ရန်"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ဘာဖြစ်ဖြစ် ဖွင့်ရန်"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> သည် <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များကို ပြသလိုသည်"</string> <string name="screenshot_edit" msgid="7867478911006447565">"တည်းဖြတ်ရန်"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 4cbdd17a1b34..1b73237e2619 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Sikkermodus"</string> <string name="android_system_label" msgid="6577375335728551336">"Android-system"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Bytt til personlig profil"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Bytt til jobbprofil"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"se kontaktene dine"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Gi <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tilgang til kontaktene dine"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Lar appen bruke enhetens telefonfunksjoner. Med denne tillatelsen kan appen finne telefonnummer og enhets-ID-er, registrere om en samtale pågår, og se det eksterne nummeret det opprettes en forbindelse med via oppringing."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"send anrop gjennom systemet"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Lar appen sende anrop gjennom systemet for å forbedre anropsopplevelsen."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"fortsette et anrop fra en annen app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Lar appen fortsette et anrop som ble startet i en annen app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"les telefonnumre"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Gir appen tilgang til telefonnumrene til enheten."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"hindre nettbrettet fra å gå over til sovemodus"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrykket kan ikke lagres. Fjern et eksisterende fingeravtrykk."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrykk-operasjonen ble avbrutt."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Fingeravtrykk-operasjonen ble avbrutt av brukeren."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"For mange forsøk. Prøve på nytt senere."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"For mange forsøk. Fingeravtrykkssensoren er slått av."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igjen."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Åpne"</string> <string name="sms" msgid="4560537514610063430">"Melding"</string> <string name="add_contact" msgid="7867066569670597203">"Legg til"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Se"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Oversikt"</string> + <string name="view_flight" msgid="7691640491425680214">"Spor"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Lite ledig lagringsplass"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Enkelte systemfunksjoner fungerer muligens ikke slik de skal"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Det er ikke nok lagringsplass for systemet. Kontrollér at du har 250 MB ledig plass, og start på nytt."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Åpent Wi-Fi-nettverk er tilgjengelig</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Koble til et åpent Wi‑Fi-nettverk"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Koble til operatørens Wi-Fi-nettverk"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kobler til åpent Wi-Fi-nettverk"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Koblet til Wi-Fi-nettverk"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kunne ikke koble til Wi-Fi-nettverket"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Trenger ingen rettigheter"</string> <string name="perm_costs_money" msgid="4902470324142151116">"dette kan koste deg penger"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Enheten lades via USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Den tilkoblede enheten får strøm via USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB for filoverføring"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB for bildeoverføring"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB for MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Koblet til et USB-tilbehør"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Trykk for å få flere alternativ."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogt lydtilbehør ble oppdaget"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den tilkoblede enheten er ikke kompatibel med denne telefonen. Trykk for å finne ut mer."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Jobb-<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Andre <xliff:g id="LABEL">%1$s</xliff:g> for jobben"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Tredje <xliff:g id="LABEL">%1$s</xliff:g> for jobben"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"For å løsne denne skjermen, trykk på og hold inne Tilbake- og Oversikt-knappene"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Skjermen er festet"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Skjermen er løsnet"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"PIN-kode for å løsne apper"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Krev opplåsingsmønster for å løsne apper"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Krev passord for å løsne apper"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle språk"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Søk"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Vil du slå på jobbprofilen?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Jobbappene dine samt varsler, data og andre funksjoner i jobbprofilen din blir slått på"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Slå på"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Denne appen er utviklet for en eldre versjon av Android og fungerer kanskje ikke som den skal. Prøv å se etter oppdateringer, eller kontakt utvikleren."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Se etter oppdatering"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nye meldinger"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Åpne SMS-appen for å se"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Enkelte funksjoner kan være begrenset"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonen har ikke tillatelse til tale"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Forgrunnsvindu"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Denne snarveien krever den nyeste appen"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Kunne ikke gjenopprette snarveien fordi appen ikke støtter sikkerhetskopiering og gjenoppretting"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Kunne ikke gjenopprette snarveien på grunn av manglende samsvar for appsignaturen"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kunne ikke gjenopprette snarveien"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Snarveien er slått av"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"AVINSTALLER"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ÅPNE LIKEVEL"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"En skadelig app ble oppdaget"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vil vise <xliff:g id="APP_2">%2$s</xliff:g>-utsnitt"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Endre"</string> </resources> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 014d4f2ba9d3..4a2aad61085a 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -235,7 +235,7 @@ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खुला छ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बन्द छ"</string> - <string name="global_action_settings" msgid="1756531602592545966">"सेटिङ्हरू"</string> + <string name="global_action_settings" msgid="1756531602592545966">"सेटिङहरू"</string> <string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string> <string name="global_action_lockdown" msgid="2277328351790053477">"लकडाउन प्रविष्ट गर्नुहोस्"</string> @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> <string name="android_system_label" msgid="6577375335728551336">"एन्ड्रोइड प्रणाली"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"व्यक्तिगत प्रोफाइलमा बदल्नुहोस्"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"कार्य प्रोफाइलमा बदल्नुहोस्"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"सम्पर्कहरू"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"तपाईँको सम्पर्कमाथि पहुँच गर्नुहोस्"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> लाई आफ्ना सम्पर्क ठेगानाहरूमाथि पहुँच राख्न दिनुहोस्"</string> @@ -402,7 +400,7 @@ <string name="permdesc_accessCoarseLocation" product="tv" msgid="1884022719818788511">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको TV मा उपलब्ध हुनुपर्छ।"</string> <string name="permdesc_accessCoarseLocation" product="default" msgid="7788009094906196995">"यस अनुप्रयोगले सेलका टावर र Wi-Fi नेटवर्कहरू जस्ता नेटवर्कका स्रोतहरूको आधारमा तपाईंको स्थान बारे जानकारी प्राप्त गर्न सक्छ। यो अनुप्रयोग ती स्रोतहरूको प्रयोग गर्न सक्षम होस् भन्नका खातिर यी स्थान सम्बन्धी सेवाहरूलाई अनिवार्य रूपमा सक्रिय पार्नुपर्छ र यी तपाईंको फोनमा उपलब्ध हुनुपर्छ।"</string> <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"तपाईँका अडियो सेटिङहरू परिवर्तन गर्नुहोस्"</string> - <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङ्हरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string> + <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"अनुप्रयोगलाई ग्लोबल अडियो सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ, जस्तै आवाजको मात्रा र आउटपुटको लागि कुन स्पिकर प्रयोग गर्ने।"</string> <string name="permlab_recordAudio" msgid="3876049771427466323">"अडियो रेकर्ड गर्नुहोस्"</string> <string name="permdesc_recordAudio" msgid="4245930455135321433">"यस अनुप्रयोगले जुनसुकै समय माइक्रोफोनको प्रयोग गरी अडियो रेकर्ड गर्न सक्छ।"</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"SIM मा आदेशहरू पठाउन दिनुहोस्"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"उपकरणको फोन विशेषताहरूको पहुँच गर्न अनुप्रयोगलाई अनुमति दिन्छ। यस अनुमतिले फोन नम्बर र उपकरणको IDs, कल सक्षम छ कि छैन र कलद्वारा जोडिएको टाढाको नम्बर निर्धारण गर्न अनुमति दिन्छ।"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"प्रणाली मार्फत कल गर्न दिनुहोस्"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"कल गर्दाको अनुभवलाई सुधार्न यस अनुप्रयोगलाई प्रणाली मार्फत कलहरू गर्न अनुमति दिन्छ।"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"अर्को अनुप्रयोगमा सुरु गरिएको कल जारी राख्नुहोस्"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"यस अनुप्रयोगलाई अर्को अनुप्रयोगमा सुरु गरिएको कल जारी राख्ने अनुमति दिन्छ।"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"फोन नम्बरहरू पढ्ने"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"उक्त अनुप्रयोगलाई यस यन्त्रको फोन नम्बरहरूमाथि पहुँच राख्न दिनुहोस्।"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ट्याब्लेटलाई निन्द्रामा जानबाट रोक्नुहोस्"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"औँठाछाप भण्डारण गर्न सकिँदैन। कृपया अवस्थित औठाछाप हटाउनुहोस्।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"औँठाछाप सञ्चालन रद्द गरियो।"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"प्रयोगकर्ताले फिंगरप्रिन्टसम्बन्धी कारबाही रद्द गर्नुभयो।"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"धेरै प्रयासहरू। केहि समय पछि पुन: प्रयास गर्नुहोला"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"अत्यन्त धेरै प्रयासहरू। फिंगरप्रिन्ट सेन्सरलाई असक्षम पारियो।"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास गर्नुहोला।"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"औंला <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"खोल्नुहोस्"</string> <string name="sms" msgid="4560537514610063430">"सन्देश"</string> <string name="add_contact" msgid="7867066569670597203">"थप्नुहोस्"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"हेर्नुहोस्"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"समयतालिका"</string> + <string name="view_flight" msgid="7691640491425680214">"ट्र्याक गर्नुहोस्"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"भण्डारण ठाउँ सकिँदै छ"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"सायद केही प्रणाली कार्यक्रमहरूले काम गर्दैनन्"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"प्रणालीको लागि पर्याप्त भण्डारण छैन। तपाईँसँग २५० मेगा बाइट ठाउँ खाली भएको निश्चित गर्नुहोस् र फेरि सुरु गर्नुहोस्।"</string> @@ -1024,7 +1020,7 @@ <!-- no translation found for whichApplicationNamed (8260158865936942783) --> <skip /> <string name="whichApplicationLabel" msgid="7425855495383818784">"पूर्ण कारबाही"</string> - <string name="whichViewApplication" msgid="3272778576700572102">"साथमा खोल्नुहोस्"</string> + <string name="whichViewApplication" msgid="3272778576700572102">"निम्नमार्फत खोल्नुहोस्"</string> <!-- String.format failed for translation --> <!-- no translation found for whichViewApplicationNamed (2286418824011249620) --> <skip /> @@ -1137,8 +1133,7 @@ <item quantity="one">खुल्ला Wi-Fi सञ्जाल उपलब्ध छ</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"खुला Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"सेवा प्रदायकको Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुला Wi‑Fi नेटवर्कमा जडान गर्दै"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi नेटवर्कमा जडान गरियो"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi नेटवर्कमा जडान गर्न सकिएन"</string> @@ -1222,13 +1217,23 @@ <string name="no_permissions" msgid="7283357728219338112">"कुनै अनुमति आवश्यक छैन"</string> <string name="perm_costs_money" msgid="4902470324142151116">"सायद तपाईँलाई पैसा पर्न सक्छ।"</string> <string name="dlg_ok" msgid="7376953167039865701">"ठीक छ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"यस यन्त्रलाई USB मार्फत चार्ज गर्दै"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"संलग्न गरिएको यन्त्रमा USB मार्फत पावर आपूर्ति गरिँदै"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"फाइल स्थानान्तरणको लागि USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"तस्बिर स्थानान्तरणको लागि USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI को लागि USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB सहायकमा जोडिएको छ"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालग अडियोको सहायक उपकरण पत्ता लाग्यो"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने सुविधा सुचारू छ"</string> @@ -1459,7 +1464,7 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"कल स्वीकार गर्नुहुन्छ?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"सधैँ"</string> - <string name="activity_resolver_use_once" msgid="2404644797149173758">"एउटा मात्र"</string> + <string name="activity_resolver_use_once" msgid="2404644797149173758">"एक पटक मात्र"</string> <string name="activity_resolver_work_profiles_support" msgid="185598180676883455">"%1$s कार्य प्रोफाइल समर्थन गर्दैन"</string> <string name="default_audio_route_name" product="tablet" msgid="4617053898167127471">"ट्याब्लेट"</string> <string name="default_audio_route_name" product="tv" msgid="9158088547603019321">"TV"</string> @@ -1667,9 +1672,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"कार्यालयको दोस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"कार्यालयको तेस्रो <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"यस स्क्रिनलाई अनपनि गर्न पछाडि जाने र परिदृश्य बटनहरूलाई छोएर थिची राख्नुहोस्"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रिन पिन गरियो"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रिन अनपिन गरियो"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"पिन निकाल्नुअघि PIN सोध्नुहोस्"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"पिन निकाल्नुअघि खोल्ने ढाँचा सोध्नुहोस्"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"पिन निकाल्नुअघि पासवर्ड सोध्नुहोस्"</string> @@ -1763,15 +1765,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"सम्पूर्ण भाषाहरू"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"सबै क्षेत्रहरू"</string> <string name="locale_search_menu" msgid="2560710726687249178">"खोज"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"कार्य प्रोफाइल सक्रिय गर्ने?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"तपाईंका कार्यसम्बन्धी अनुप्रयोग, सूचना, डेटा र कार्य प्रोफाइलका अन्य सुविधाहरू सक्रिय गरिने छन्"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"सक्रिय गर्नुहोस्"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"यो अनुप्रयोग Android को पुरानो संस्करणका लागि बनाइएको हुनाले यसले सही ढङ्गले काम नगर्न सक्छ। अद्यावधिकहरू उपलब्ध छन् वा छैनन् भनी जाँच गरी हेर्नुहोस् वा यसको विकासकर्तालाई सम्पर्क गर्नुहोस्।"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"अद्यावधिक उपलब्ध छ वा छैन भनी जाँच गर्नुहोस्"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"तपाईंलाई नयाँ सन्देश आएको छ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"हेर्नका लागि SMS अनुप्रयोग खोल्नुहोस्"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"केही कार्य सीमित हुनसक्छ"</string> @@ -1791,7 +1789,7 @@ <string name="conference_call" msgid="3751093130790472426">"सम्मेलन कल"</string> <string name="tooltip_popup_title" msgid="5253721848739260181">"उपकरणको वर्णन"</string> <string name="app_category_game" msgid="5431836943981492993">"खेलहरू"</string> - <string name="app_category_audio" msgid="1659853108734301647">"संगीत तथा अडियो"</string> + <string name="app_category_audio" msgid="1659853108734301647">"सङ्गीत तथा अडियो"</string> <string name="app_category_video" msgid="2728726078629384196">"चलचित्र तथा भिडियो"</string> <string name="app_category_image" msgid="4867854544519846048">"तस्बिर तथा छविहरू"</string> <string name="app_category_social" msgid="5842783057834965912">"सामाजिक तथा सञ्चार"</string> @@ -1838,17 +1836,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"फोनमार्फत भ्वाइस कल गर्न मिल्दैन"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"पपअप विन्डो"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"यो सर्टकटलाई पछिल्लो अनुप्रयोग आवश्यक हुन्छ"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"अनुप्रयोगले ब्याकअप तथा पुनर्स्थापनालाई समर्थन नगर्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"अनुप्रयोगमा प्रयोग गरिने हस्ताक्षर नमिल्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"सर्टकट पुनर्स्थापित गर्न सकिएन"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"सर्टकट असक्षम पारिएको छ"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"स्थापना रद्द गर्नु…"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"जे भए पनि खोल्नुहोस्"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अनुप्रयोग भेटियो"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string> <string name="screenshot_edit" msgid="7867478911006447565">"सम्पादन गर्नुहोस्"</string> </resources> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 5412d47d06c2..ae3014d2906b 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"ਸੁਰੱਖਿਅਤ ਮੋਡ"</string> <string name="android_system_label" msgid="6577375335728551336">"Android System"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"ਨਿੱਜੀ ਪ੍ਰੋਫਾਈਲ ਵਰਤੋ"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਰਤੋ"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"ਸੰਪਰਕ"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ਨੂੰ ਤੁਹਾਡੇ ਸੰਪਰਕਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦਿਓ"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫ਼ੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਜਾਜ਼ਤ ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ਆਈ.ਡੀ. ਨਿਰਧਾਰਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਕਿਰਿਆਸ਼ੀਲ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ਸਿਸਟਮ ਰਾਹੀਂ ਕਾਲਾਂ ਰੂਟ ਕਰੋ"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"ਕਾਲ ਕਰਨ ਦੇ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਐਪ ਨੂੰ ਇਸਦੀਆਂ ਕਾਲਾਂ ਨੂੰ ਸਿਸਟਮ ਰਾਹੀਂ ਰੂਟ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"ਕਿਸੇ ਹੋਰ ਐਪ ਤੋਂ ਕਾਲ ਜਾਰੀ ਰੱਖੋ"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ਐਪ ਨੂੰ ਉਹ ਕਾਲ ਜਾਰੀ ਰੱਖਣ ਦਿਓ ਜਿਸਨੂੰ ਹੋਰ ਐਪ ਤੋਂ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ਫ਼ੋਨ ਨੰਬਰ ਪੜ੍ਹੋ"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੇ ਫ਼ੋਨ ਨੰਬਰਾਂ \'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦੀ ਹੈ।"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ਟੈਬਲੈੱਟ ਨੂੰ ਸਲੀਪ ਤੇ ਜਾਣ ਤੋਂ ਰੋਕੋ"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਮੌਜੂਦਾ ਫਿੰਗਰਪ੍ਰਿੰਟ ਹਟਾਓ।"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"ਫਿੰਗਰ"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਓਪਰੇਸ਼ਨ ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਰੱਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ. ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ।"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"ਖੋਲ੍ਹੋ"</string> <string name="sms" msgid="4560537514610063430">"ਸੁਨੇਹਾ ਭੇਜੋ"</string> <string name="add_contact" msgid="7867066569670597203">"ਸ਼ਾਮਲ ਕਰੋ"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"ਦੇਖੋ"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"ਸਮਾਂ-ਸੂਚੀ"</string> + <string name="view_flight" msgid="7691640491425680214">"ਟਰੈਕ ਕਰੋ"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ਸਟੋਰੇਜ ਦੀ ਜਗ੍ਹਾ ਖਤਮ ਹੋ ਰਹੀ ਹੈ"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"ਕੁਝ ਸਿਸਟਮ ਫੰਕਸ਼ਨ ਕੰਮ ਨਹੀਂ ਵੀ ਕਰ ਸਕਦੇ"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ਸਿਸਟਮ ਲਈ ਲੋੜੀਂਦੀ ਸਟੋਰੇਜ ਨਹੀਂ ਹੈ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ 250MB ਖਾਲੀ ਜਗ੍ਹਾ ਹੈ ਅਤੇ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string> @@ -1131,8 +1127,7 @@ <item quantity="other">ਉਪਲਬਧ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਖੋਲ੍ਹੋ</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"ਖੁੱਲ੍ਹੇ ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੋਵੋ"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ਕੈਰੀਅਰ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ਖੁੱਲ੍ਹੇ ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ਵਾਈ‑ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"ਕੋਈ ਅਨੁਮਤੀਆਂ ਲੁੜੀਂਦੀਆਂ ਨਹੀਂ"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ"</string> <string name="dlg_ok" msgid="7376953167039865701">"ਠੀਕ"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ਇਹ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"ਨੱਥੀ ਕੀਤੇ ਡੀਵਾਈਸ ਨੂੰ USB ਰਾਹੀਂ ਪਾਵਰ ਮਿਲ ਰਹੀ ਹੈ"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਲਈ USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ਫ਼ੋਟੋ ਟ੍ਰਾਂਸਫ਼ਰ ਲਈ USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI ਲਈ USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ਇੱਕ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"ਕੰਮ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"ਦੂਸਰੀ ਕਾਰਜ-ਸਥਾਨ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"ਤੀਸਰੀ ਕਾਰਜ-ਸਥਾਨ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਬਟਨਾਂ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"ਸਕ੍ਰੀਨ ਅਨਪਿਨ ਕੀਤੀ"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਿੰਨ ਮੰਗੋ"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਅਣਲਾਕ ਪੈਟਰਨ ਵਾਸਤੇ ਪੁੱਛੋ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ਅਨਪਿੰਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਸਵਰਡ ਮੰਗੋ"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"ਸਾਰੇ ਖੇਤਰ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜੋ"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"ਕੀ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਚਾਲੂ ਕਰਨੀ ਹੈ?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"ਤੁਹਾਡੀਆਂ ਕਾਰਜ-ਸਥਾਨ ਐਪਾਂ, ਸੂਚਨਾਵਾਂ, ਡਾਟਾ ਅਤੇ ਹੋਰ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਚਾਲੂ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ਚਾਲੂ ਕਰੋ"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ਇਹ ਐਪ Android ਦੇ ਕਿਸੇ ਵਧੇਰੇ ਪੁਰਾਣੇ ਵਰਜਨ ਲਈ ਬਣਾਈ ਗਈ ਸੀ ਅਤੇ ਸ਼ਾਇਦ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ। ਅੱਪਡੇਟਾਂ ਲਈ ਜਾਂਚ ਕਰੋ ਜਾਂ ਵਿਕਾਸਕਾਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ਅੱਪਡੇਟ ਦੀ ਜਾਂਚ ਕਰੋ"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ਤੁਹਾਨੂੰ ਨਵੇਂ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਹੋਏ ਹਨ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"ਦੇਖਣ ਲਈ SMS ਐਪ ਖੋਲ੍ਹੋ"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ਕੁਝ ਪ੍ਰਕਾਰਜਾਤਮਕਤਾ ਸੀਮਿਤ ਹੋ ਸਕਦੀ ਹੈ"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"ਫ਼ੋਨ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"ਪੌਪਅੱਪ ਵਿੰਡੋ"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ਇਸ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਨਵੀਨਤਮ ਐਪ ਦੀ ਲੋੜ ਹੈ"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਕਿਉਂਕਿ ਐਪ \'ਬੈਕਅੱਪ ਅਤੇ ਮੁੜ-ਬਹਾਲੀ\' ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੀ"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ਐਪ ਹਸਤਾਖਰ ਦਾ ਮੇਲ ਨਾ ਹੋਣ ਕਾਰਨ ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ਸ਼ਾਰਟਕੱਟ ਬੰਦ ਕੀਤਾ ਹੋਇਆ ਹੈ"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ਅਣਸਥਾਪਤ ਕਰੋ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ਫਿਰ ਵੀ ਖੋਲ੍ਹੋ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ਦੀ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ਸੰਪਾਦਨ ਕਰੋ"</string> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 11fc517c03c8..8fe4729d6995 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que o app acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o app a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"encaminhar chamadas pelo sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite que o app encaminhe suas chamadas por meio do sistema para melhorar a experiência com chamadas."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar uma chamada de outro app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite que o app continue uma chamada que foi iniciada em outro app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ler números de telefone"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite que o app acesse os número de telefone do dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir modo de inatividade do tablet"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Abrir"</string> <string name="sms" msgid="4560537514610063430">"Mensagem"</string> <string name="add_contact" msgid="7867066569670597203">"Adicionar"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Ver"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string> + <string name="view_flight" msgid="7691640491425680214">"Rastrear"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Pouco espaço de armazenamento"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema podem não funcionar"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string> @@ -1128,8 +1127,7 @@ <item quantity="other">Abrir redes Wi-Fi disponíveis</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string> <string name="perm_costs_money" msgid="4902470324142151116">"isso pode lhe custar dinheiro"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB carregando este dispositivo"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB fornecendo energia ao dispositivo conectado"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferência de arquivos"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferência de fotos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Trabalho: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Segundo <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Terceiro <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Tela liberada"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de liberar"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir padrão de desbloqueio antes de liberar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir senha antes de liberar"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Seus apps, notificações, dados e outros recursos do perfil de trabalho serão ativados"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Este app foi criado para uma versão mais antiga do Android e pode não funcionar corretamente. Tente verificar se há atualizações ou entre em contato com o desenvolvedor."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Procurar atualizações"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Você tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra o app de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalidades são limitadas"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string> <string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Esse atalho requer o app mais recente"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"O atalho está desativado"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR MESMO ASSIM"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index a624066aea8d..04bd394f825d 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string> <string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Mudar para o perfil pessoal"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Mudar para o perfil de trabalho"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"aceder aos contactos"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que a aplicação <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aceda aos seus contactos"</string> @@ -287,7 +285,7 @@ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"gravar áudio"</string> <string name="permgrouprequest_microphone" msgid="8065941268709600606">"Permitir que a aplicação <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> grave áudio"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Câmara"</string> - <string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotografias e gravar vídeos"</string> + <string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string> <string name="permgrouprequest_camera" msgid="810824326507258410">"Permitir que a aplicação <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> tire fotos e grave vídeos"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Telemóvel"</string> <string name="permgroupdesc_phone" msgid="6234224354060641055">"fazer e gerir chamadas"</string> @@ -407,7 +405,7 @@ <string name="permdesc_recordAudio" msgid="4245930455135321433">"Esta aplicação pode gravar áudio através do microfone a qualquer momento."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"enviar comandos para o SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Permite que a aplicação envie comandos para o SIM. Esta ação é muito perigosa."</string> - <string name="permlab_camera" msgid="3616391919559751192">"tirar fotografias e vídeos"</string> + <string name="permlab_camera" msgid="3616391919559751192">"tirar fotos e vídeos"</string> <string name="permdesc_camera" msgid="5392231870049240670">"Esta aplicação pode tirar fotos e gravar vídeos através da câmara a qualquer momento."</string> <string name="permlab_vibrate" msgid="7696427026057705834">"controlar vibração"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"Permite à aplicação controlar o vibrador."</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que a aplicação aceda às funcionalidades de telefone do dispositivo. Esta autorização permite que a aplicação determine o número de telefone e IDs do dispositivo, se alguma chamada está ativa e qual o número remoto ligado por uma chamada."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"encaminhar chamadas através do sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite que a aplicação encaminhe as respetivas chamadas através do sistema de modo a melhorar a experiência da chamada."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar uma chamada a partir de outra aplicação"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite à aplicação continuar uma chamada iniciada noutra aplicação."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ler os números de telefone"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite à aplicação aceder aos números de telefone do dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir que o tablet entre em inactividade"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Não é possível armazenar a impressão digital. Remova uma impressão digital existente."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Operação de impressão digital cancelada pelo utilizador."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiadas tentativas. Tente novamente mais tarde."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiadas tentativas. Sensor de impressões digitais desativado."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Abrir"</string> <string name="sms" msgid="4560537514610063430">"Mensagem"</string> <string name="add_contact" msgid="7867066569670597203">"Adicionar"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Ver"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Agendar"</string> + <string name="view_flight" msgid="7691640491425680214">"Monitorizar"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Está quase sem espaço de armazenamento"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema poderão não funcionar"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não existe armazenamento suficiente para o sistema. Certifique-se de que tem 250 MB de espaço livre e reinicie."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Rede Wi-Fi aberta disponível</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Ligar à rede Wi-Fi aberta"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Estabelecer ligação à rede Wi‑Fi do operador"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"A ligar à rede Wi-Fi aberta…"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ligado à rede Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível ligar à rede Wi-Fi"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Não são necessárias permissões"</string> <string name="perm_costs_money" msgid="4902470324142151116">"isto poderá estar sujeito a custos"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Carregamento deste dispositivo por USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Fornecimento de energia ao dispositivo ligado por USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferência de ficheiros"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferência de fotos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ligado a um acessório USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Toque para obter mais opções."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detetado"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo ligado não é compatível com este telemóvel. Toque para saber mais."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Vista geral"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Ecrã fixo"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Ecrã solto"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de soltar"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir sequência de desbloqueio antes de soltar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir palavra-passe antes de soltar"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Todas as regiões"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"As aplicações de trabalho, as notificações, os dados e outras funcionalidades do perfil de trabalho serão desativados"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Esta aplicação foi concebida para uma versão mais antiga do Android e pode não funcionar corretamente. Experimente verificar se existem atualizações ou contacte o programador."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Verificar se existem atualizações"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra a aplicação de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalid. limitadas"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telemóvel não permitido para voz"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Este atalho requer a aplicação mais recente."</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque a aplicação não é compatível com a funcionalidade de cópia de segurança e restauro."</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido a uma falha de correspondência entre as assinaturas das aplicações."</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho."</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"O atalho está desativado."</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR MESMO ASSIM"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicação prejudicial detetada"</string> <string name="slices_permission_request" msgid="8484943441501672932">"A aplicação <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da aplicação <xliff:g id="APP_2">%2$s</xliff:g>."</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 11fc517c03c8..8fe4729d6995 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que o app acesse os recursos de telefonia do dispositivo. Esta permissão autoriza o app a determinar o número de telefone e IDs de dispositivo, quando uma chamada está ativa, e o número remoto conectado a uma chamada."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"encaminhar chamadas pelo sistema"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite que o app encaminhe suas chamadas por meio do sistema para melhorar a experiência com chamadas."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar uma chamada de outro app"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite que o app continue uma chamada que foi iniciada em outro app."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ler números de telefone"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite que o app acesse os número de telefone do dispositivo."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"impedir modo de inatividade do tablet"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -997,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Abrir"</string> <string name="sms" msgid="4560537514610063430">"Mensagem"</string> <string name="add_contact" msgid="7867066569670597203">"Adicionar"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Ver"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string> + <string name="view_flight" msgid="7691640491425680214">"Rastrear"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Pouco espaço de armazenamento"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Algumas funções do sistema podem não funcionar"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Não há armazenamento suficiente para o sistema. Certifique-se de ter 250 MB de espaço livre e reinicie."</string> @@ -1128,8 +1127,7 @@ <item quantity="other">Abrir redes Wi-Fi disponíveis</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectar à rede Wi‑Fi da operadora"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string> @@ -1213,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string> <string name="perm_costs_money" msgid="4902470324142151116">"isso pode lhe custar dinheiro"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB carregando este dispositivo"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB fornecendo energia ao dispositivo conectado"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferência de arquivos"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferência de fotos"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string> @@ -1658,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Trabalho: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Segundo <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Terceiro <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Tela liberada"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de liberar"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir padrão de desbloqueio antes de liberar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir senha antes de liberar"</string> @@ -1757,10 +1762,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Ativar o perfil de trabalho?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Seus apps, notificações, dados e outros recursos do perfil de trabalho serão ativados"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Ativar"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Este app foi criado para uma versão mais antiga do Android e pode não funcionar corretamente. Tente verificar se há atualizações ou entre em contato com o desenvolvedor."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Procurar atualizações"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Você tem mensagens novas"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Abra o app de SMS para ver"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Algumas funcionalidades são limitadas"</string> @@ -1827,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string> <string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Esse atalho requer o app mais recente"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"O atalho está desativado"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR MESMO ASSIM"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 52995ae8b578..defb40bb072d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -420,10 +420,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite aplicației să acceseze funcțiile de telefon ale dispozitivului. Cu această permisiune aplicația stabilește numărul de telefon și ID-urile de dispozitiv, dacă un apel este activ, precum și numărul de la distanță conectat printr-un apel."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"să direcționeze apelurile prin intermediul sistemului"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permiteți aplicației să direcționeze apelurile prin intermediul sistemului pentru a îmbunătăți calitatea apelurilor."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"să continue un apel dintr-o altă aplicație"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite aplicației să continue un apel care a fost inițiat dintr-o altă aplicație."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"să citească numerele de telefon"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite aplicației să acceseze numerele de telefon ale dispozitivului."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"împiedicarea computerului tablet PC să intre în repaus"</string> @@ -502,6 +500,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Prea multe încercări. Încercați din nou mai târziu."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Prea multe încercări. Senzorul de amprentă este dezactivat."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Încercați din nou."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1017,12 +1019,9 @@ <string name="browse" msgid="1245903488306147205">"Deschideți"</string> <string name="sms" msgid="4560537514610063430">"Mesaj"</string> <string name="add_contact" msgid="7867066569670597203">"Adăugați"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Afișați"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Program"</string> + <string name="view_flight" msgid="7691640491425680214">"Urmăriți"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Spațiul de stocare aproape ocupat"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Este posibil ca unele funcții de sistem să nu funcționeze"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Spațiu de stocare insuficient pentru sistem. Asigurați-vă că aveți 250 MB de spațiu liber și reporniți."</string> @@ -1150,8 +1149,7 @@ <item quantity="one">Rețea Wi-Fi deschisă disponibilă</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Conectați-vă la o rețea Wi‑Fi deschisă"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectați-vă la rețeaua Wi-Fi a operatorului"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Se stabilește conexiunea la o rețea Wi‑Fi deschisă"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"S-a realizat conexiunea la rețeaua Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nu s-a putut stabili conexiunea la rețeaua Wi-Fi"</string> @@ -1235,13 +1233,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Nu se solicită nicio permisiune"</string> <string name="perm_costs_money" msgid="4902470324142151116">"aceasta poate să genereze costuri"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Dispozitivul se încarcă prin USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Dispozitivul atașat se încarcă prin USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Conexiune USB pentru transferul fișierelor"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Conexiune USB pentru transferul fotografiilor"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"Conexiune USB pentru MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectat la un accesoriu USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Atingeți pentru mai multe opțiuni."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S-a detectat un accesoriu audio analogic"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string> @@ -1683,9 +1691,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de serviciu"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> pentru serviciu (2)"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> pentru serviciu (3)"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Pentru a anula fixarea acestui ecran, atingeți lung butoanele Înapoi și Recente"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Ecran fixat"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Fixarea ecranului anulată"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicită codul PIN înainte de a anula fixarea"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicită mai întâi modelul pentru deblocare"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicită parola înainte de a anula fixarea"</string> @@ -1791,10 +1796,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"Activați profilul de serviciu?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"Se vor activa aplicațiile dvs. de serviciu, notificările, datele și alte funcții ale profilului de serviciu"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Activați"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Această aplicație a fost creată pentru o versiune Android mai veche și este posibil să nu funcționeze corect. Încercați să căutați actualizări sau contactați dezvoltatorul."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Căutați actualizări"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Aveți mesaje noi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Deschideți aplicația pentru SMS-uri ca să vizualizați"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Unele funcții ar putea fi limitate"</string> @@ -1862,17 +1865,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonul nu este permis pentru voce"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Fereastră pop-up"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Această comandă rapidă necesită cea mai recentă aplicație"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nu s-a putut restabili comanda rapidă deoarece aplicația nu acceptă backupul și restabilirea"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nu s-a putut restabili comanda rapidă din cauza nepotrivirii semnăturii aplicației"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nu s-a putut restabili comanda rapidă"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Comanda rapidă este dezactivată"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEZINSTALAȚI"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"Deschideți oricum"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicație dăunătoare detectată"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vrea să afișeze porțiuni din <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editați"</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0d62e753c268..817cbf79dfa3 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -270,10 +270,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Безопасный режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Переключиться на личный профиль"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Переключиться на рабочий профиль"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакты"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"доступ к контактам"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Разрешите приложению <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ к контактам"</string> @@ -425,10 +423,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Приложение получит доступ к функциям телефона на устройстве. Кроме того, оно сможет определять номера телефонов и серийные номера моделей, состояние активности вызова, а также удаленные номера, с которыми установлено соединение."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"перенаправлять звонки в системе"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Приложение сможет перенаправлять звонки в системе с целью улучшения качества связи."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"Продолжить вызов, начатый в другом приложении"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Разрешает приложению продолжить вызов, начатый в другом приложении."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"чтение номеров телефонов"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Разрешает приложению доступ к телефонным номерам устройства."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"Отключение спящего режима"</string> @@ -503,11 +499,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Чтобы сохранить новый отпечаток, удалите существующий."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операция с отпечатком отменена."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Операция с отпечатком пальца отменена пользователем."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Слишком много попыток. Повторите позже."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Слишком много попыток. Сканер отпечатков пальцев отключен."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторите попытку."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Отпечаток <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1040,12 +1039,9 @@ <string name="browse" msgid="1245903488306147205">"Открыть"</string> <string name="sms" msgid="4560537514610063430">"Написать SMS"</string> <string name="add_contact" msgid="7867066569670597203">"Добавить"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Открыть"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Расписание"</string> + <string name="view_flight" msgid="7691640491425680214">"Отследить"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Недостаточно памяти"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некоторые функции могут не работать"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Недостаточно свободного места для системы. Освободите не менее 250 МБ дискового пространства и перезапустите устройство."</string> @@ -1175,8 +1171,7 @@ <item quantity="other">Есть открытые сети Wi-Fi</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Подключитесь к открытой сети Wi‑Fi"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Подключитесь к сети Wi‑Fi оператора"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Подключение к открытой сети Wi‑Fi…"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Подключено к сети Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не удалось подключиться к сети Wi‑Fi"</string> @@ -1260,13 +1255,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Не требуется разрешений"</string> <string name="perm_costs_money" msgid="4902470324142151116">"это может стоить вам денег!"</string> <string name="dlg_ok" msgid="7376953167039865701">"ОК"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Зарядка через USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Подача питания на подключенное устройство через USB"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Передача файлов через USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Передача фото через USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI через USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB-устройство подключено"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Нажмите, чтобы показать дополнительные параметры."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Обнаружено аналоговое аудиоустройство"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Подсоединенное устройство несовместимо с этим телефоном. Нажмите, чтобы узнать подробности."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string> @@ -1711,9 +1716,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Рабочий <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Задача 2: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Задача 3: <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Чтобы открепить экран, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\""</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Блокировка включена"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Блокировка выключена"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"PIN-код для отключения"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запрашивать графический ключ для отключения блокировки"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запрашивать пароль для отключения блокировки"</string> @@ -1825,15 +1827,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Все языки"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Все регионы"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Поиск"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Включить рабочий профиль?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Будут включены корпоративные приложения, уведомления, данные и другие функции рабочего профиля."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Включить"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Это приложение было создано для более ранней версии Android и может работать со сбоями. Проверьте наличие обновлений или свяжитесь с разработчиком."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Проверить обновления"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Новые сообщения"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Чтобы просмотреть, откройте приложение для обмена SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Некоторые функции недоступны"</string> @@ -1902,17 +1900,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Для телефона недоступны голосовые вызовы"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Всплывающее окно"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Требуется последняя версия приложения"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не удалось восстановить ярлык: приложение не поддерживает резервное копирование"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не удалось восстановить ярлык: некорректная подпись приложения"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не удалось восстановить ярлык"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Ярлык отключен"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"УДАЛИТЬ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ОТКРЫТЬ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Обнаружено вредоносное приложение"</string> <string name="slices_permission_request" msgid="8484943441501672932">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string> <string name="screenshot_edit" msgid="7867478911006447565">"Изменить"</string> </resources> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 846b0ee5b83c..ab6924293f28 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -417,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"උපාංගයේ දුරකථන විශේෂාංග වෙත ප්රවේශයට යෙදුමට ඉඩ දෙයි. ඇමතුම සක්රිය වුවත්, සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ උපාංග ID හඳුනා ගැනීමට මෙම අවසරය යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"පද්ධතිය හරහා ඇමතුම් මාර්ගගත කරන්න"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"ඇමතුම් අත්දැකීම වැඩිදියුණු කිරීම සඳහා යෙදුමට පද්ධතිය හරහා එහි ඇමතුම් මාර්ගගත කිරීමට ඉඩ දෙයි."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"වෙනත් යෙදුමක් වෙතින් වන ඇමතුමක් දිගටම කරගෙන යන්න"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"වෙනත් යෙදුමක ආරම්භ කරන ලද ඇමතුමක් දිගටම කරගෙන යාමට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"දුරකථන අංක කියවන්න"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"උපාංගයේ දුරකථන අංක වෙත ප්රවේශයට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ටැබ්ලටය නින්දෙන් වැළක්වීම"</string> @@ -499,6 +497,10 @@ <string name="fingerprint_error_lockout" msgid="5536934748136933450">"උත්සාහයන් ඉතා වැඩි ගණනකි. කරුණාකර පසුව නැවත උත්සාහ කරන්න."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"උත්සාහයන් ඉතා වැඩි ගණනකි. ඇඟිලි සලකුණු සංවේදකය අබල කරන ලදී."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"නැවත උත්සාහ කරන්න."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"ඇඟිලි <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -999,12 +1001,9 @@ <string name="browse" msgid="1245903488306147205">"විවෘත කරන්න"</string> <string name="sms" msgid="4560537514610063430">"පණිවිඩය"</string> <string name="add_contact" msgid="7867066569670597203">"එක් කරන්න"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"බලන්න"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"කාල සටහන"</string> + <string name="view_flight" msgid="7691640491425680214">"ශ්රව්ය ඛණ්ඩය"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"ආචයනය ඉඩ ප්රමාණය අඩු වී ඇත"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"සමහර පද්ධති කාර්යයන් ක්රියා නොකරනු ඇත"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"පද්ධතිය සඳහා ප්රමාණවත් ඉඩ නොමැත. ඔබට 250MB නිදහස් ඉඩක් තිබෙන ඔබට තිබෙන බව සහතික කරගෙන නැවත උත්සාහ කරන්න."</string> @@ -1130,8 +1129,7 @@ <item quantity="other">විවෘත Wi-Fi ජාල තිබේ</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙන්න"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"වාහක Wi-Fi ජාලයට සම්බන්ධ වන්න"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙමින්"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය නොහැකි විය"</string> @@ -1215,13 +1213,23 @@ <string name="no_permissions" msgid="7283357728219338112">"අවසර අවශ්ය නොමැත"</string> <string name="perm_costs_money" msgid="4902470324142151116">"මෙමඟින් ඔබට මුදල් වැය විය හැක"</string> <string name="dlg_ok" msgid="7376953167039865701">"හරි"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"මෙම උපාංගය USB වෙතින් ආරෝපණය"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"අමුණා ඇති උපාංගයට USB මඟින් බලය සපයමින්"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ගොනු හුවමාරුව සඳහා USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ඡායාරූප හුවමාරුව සඳහා USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI සඳහා USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB මෙවලමකට සම්බන්ධිතයි"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"තවත් විකල්ප සඳහා තට්ටු කරන්න."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ප්රතිසම ශ්රව්ය උපාංගය අනාවරණය කර ගන්නා ලදී"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"මෙම දුරකථනය සමඟ සම්බන්ධිත උපාංගය නොගැළපෙයි. තව දැන ගැනීමට තට්ටු කරන්න."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string> @@ -1660,9 +1668,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2වන වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3වන වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"මෙම තිර ඇමුණුම ගැලවීමට, දළ විශ්ලේෂණය බොත්තම් ස්පර්ශ කර අල්ලා ගෙන සිටින්න"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"තිරය අගුළු දමා ඇත"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"තිරයේ අගුළු ඇර ඇත"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ගැලවීමට පෙර PIN විමසන්න"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ගැලවීමට පෙර අගුළු අරින රටාව සඳහා අසන්න"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ගැලවීමට පෙර මුරපදය විමසන්න"</string> @@ -1759,10 +1764,8 @@ <string name="work_mode_off_title" msgid="1118691887588435530">"කාර්යාල පැතිකඩ ක්රියාත්මක කරන්නද?"</string> <string name="work_mode_off_message" msgid="5130856710614337649">"ඔබගේ වැඩ යෙදුම්, දැනුම්දීම්, දත්ත සහ වෙනත් කාර්යාල පැතිකඩ විශේෂාංග ක්රියාත්මක කරනු ඇත"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ක්රියාත්මක කරන්න"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"මෙම යෙදුම Android හි පැරණි අනුවාදයක් සඳහා තනා ඇති අතර නිසියාකාරව ක්රියා නොකරනු ඇත. යාවත්කාලීන සඳහා පරික්ෂා කිරීම උත්සාහ කරන්න, නැතහොත් සංවර්ධක අමතන්න."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"යාවත්කාලීන සඳහා පරික්ෂා කරන්න"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"ඔබට නව පණිවිඩ තිබේ"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"බැලීමට විවෘත SMS යෙදුම විවෘත කරන්න"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"ඇතැම් ක්රියාකාරිත්ව සීමිත විය හැකිය"</string> @@ -1829,17 +1832,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"දුරකථනය හඬ සඳහා ඉඩ නොදේ"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"උත්පතන කවුළුව"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"මෙම කෙටි මගට නවතම යෙදුම අවශ්යයි"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"යෙදුම උපස්ථ සහ ප්රතිසාධනය සඳහා සහාය නොදක්වන බැවින් කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"යෙදුම් අත්සන නොගැළපෙන බැවින් කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"කෙටි මග අබල කර ඇත"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"අස්ථාපනය කරන්න"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"කෙසේ වුවත් විවෘත කරන්න"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> හට කොටස් <xliff:g id="APP_2">%2$s</xliff:g>ක් පෙන්වීමට අවශ්යයි"</string> <string name="screenshot_edit" msgid="7867478911006447565">"සංස්කරණය"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 32d91ea939d5..66baaf4ecd36 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -262,10 +262,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Mtindo salama"</string> <string name="android_system_label" msgid="6577375335728551336">"Mfumo wa Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Tumia wasifu wa binafsi"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Tumia wasifu wa kazini"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Anwani"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"ifikie anwani zako"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Ruhusu <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ifikie anwani zako"</string> @@ -417,10 +415,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Huruhusu programu kufikia vipengele vya simu vilivyo kwenye kifaa. Idhini hii inaruhusu programu kutambua nambari ya simu na kifaa, kama kuna simu inayopigwa, na nambari ya mbali iliyounganishwa kwenye simu."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"elekeza simu kupitia mfumo"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Huruhusu programu kuelekeza simu zake kupitia mfumo ili kuboresha hali ya kupiga simu."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"endelea na simu kutoka programu nyingine"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Huruhusu programu kuendelea na simu ambayo ilianzishwa katika programu nyingine."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"kusoma nambari za simu"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Inaruhusu programu kufikia nambari za simu zilizo kwenye kifaa."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zuia kompyuta ndogo dhidi ya kulala"</string> @@ -495,11 +491,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Kitambulisho hakiwezi kuhifadhiwa. Tafadhali ondoa kitambulisho kilichopo."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Utendaji wa kitambulisho imeghairiwa."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Mtumiaji ameghairi uthibitishaji wa alama ya kidole."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Majaribio mengi mno. Jaribu tena baadaye."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Majaribio mengi mno. Kitambua alama ya kidole kimezimwa."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Jaribu tena."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Kitambulisho <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -998,12 +997,9 @@ <string name="browse" msgid="1245903488306147205">"Fungua"</string> <string name="sms" msgid="4560537514610063430">"Ujumbe"</string> <string name="add_contact" msgid="7867066569670597203">"Ongeza"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Angalia"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Ratiba"</string> + <string name="view_flight" msgid="7691640491425680214">"Toleo"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nafasi ya kuhifadhi inakaribia kujaa"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Baadhi ya vipengee vya mfumo huenda visifanye kazi"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Hifadhi haitoshi kwa ajili ya mfumo. Hakikisha una MB 250 za nafasi ya hifadhi isiyotumika na uanzishe upya."</string> @@ -1129,8 +1125,7 @@ <item quantity="one">Fungua mtandao wa Wi-Fi unaopatikana</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Unganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Unganisha kwenye mtandao wa mtoa huduma ya Wi‑Fi"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Inaunganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Imeunganisha kwenye mtandao wa Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Imeshindwa kuunganisha kwenye mtandao wa Wi‑Fi"</string> @@ -1214,13 +1209,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Hakuna vibali vinavyohitajika"</string> <string name="perm_costs_money" msgid="4902470324142151116">"huenda hii ikakugharimu pesa"</string> <string name="dlg_ok" msgid="7376953167039865701">"Sawa"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Unachaji kifaa hiki ukitumia USB"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB inachaji kifaa ulichounganisha"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB kwa ajili ya kuhamisha faili"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB kwa ajili ya kuhamisha picha"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB kwa ajili ya MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Imeunganishwa kwa kifuasi cha USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Gusa ili upate chaguo zaidi."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Imetambua kifaa cha sauti ya analogi"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Kifaa ulichoambatisha hakitumiki kwenye simu hii. Gusa ili upate maelezo zaidi."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string> @@ -1659,9 +1664,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Ya kazini <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> ya 2 ya Kazini"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> ya 3 ya Kazini"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Ili kubandua skrini hii, gusa na ushikilie vitufe vya Nyuma na Muhtasari"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Skrini imebandikwa"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Skrini imebanduliwa"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Itisha PIN kabla hujabandua"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Omba mchoro wa kufungua kabla hujabandua"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Omba nenosiri kabla hujabandua"</string> @@ -1755,15 +1757,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Lugha zote"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Maeneo yote"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Tafuta"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Ungependa kuwasha wasifu wa kazini?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Hatua hii itawasha data, arifa, programu za kazini, arifa na vipengele vingine vya wasifu wa kazini"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Washa"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Programu hii iliundwa kwa ajili ya toleo la zamani la Android na huenda isifanye kazi vizuri. Jaribu kuangalia masasisho au uwasiliane na msanidi programu."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Angalia masasisho"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Una ujumbe mpya"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Fungua programu ya SMS ili uweze kuangalia"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Huenda baadhi ya vipengele havifanyi kazi"</string> @@ -1830,17 +1828,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Simu hairuhusiwi katika huduma ya sauti"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Dirisha Ibukizi"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Njia hii ya mkato inahitaji toleo jipya la programu"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Imeshindwa kurejesha njia ya mkato kwa sababu programu haitumii kipengele cha hifadhi rudufu na kurejesha upya"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Imeshindwa kurejesha njia ya mkato kwa sababu ufunguo wako wa kuambatisha cheti kwenye programu haulingani"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Imeshindwa kurejesha njia ya mkato"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Njia ya mkato imezimwa"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ONDOA"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"FUNGUA TU"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Imetambua programu hatari"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> inataka kuonyesha vipengee <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Badilisha"</string> </resources> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 3afdebd61607..5afa71186141 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"பாதுகாப்பு பயன்முறை"</string> <string name="android_system_label" msgid="6577375335728551336">"Android அமைப்பு"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"தனிப்பட்ட சுயவிவரத்திற்கு மாற்றவும்"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"பணிச் சுயவிவரத்திற்கு மாற்றவும்"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"தொடர்புகள்"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"தொடர்புகளை அணுக வேண்டும்"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"தொடர்புகளை அணுக, <b><xliff:g id="APP_NAME">%1$s</xliff:g></b>க்கு அனுமதி வழங்கவும்"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"சாதனத்தின் மொபைல் அம்சங்களை அணுகப் பயன்பாட்டை அனுமதிக்கிறது. மொபைல் மற்றும் சாதன ஐடிகள், அழைப்பு செயலில் உள்ளதா மற்றும் அழைப்பு மூலம் இணைக்கப்பட்ட தொலைக் கட்டுப்பாட்டு எண் ஆகியவற்றைத் தீர்மானிக்க இந்த அனுமதி பயன்பாட்டை அனுமதிக்கிறது."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"சிஸ்டம் மூலம் அழைப்புகளை ரூட் செய்தல்"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"அழைக்கும் அனுபவத்தை மேம்படுத்தும் பொருட்டு, சிஸ்டம் மூலம் தனது அழைப்புகளை ரூட் செய்ய பயன்பாட்டை அனுமதிக்கும்."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"மற்றொரு பயன்பாட்டிலிருந்து அழைப்பைத் தொடருதல்"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"மற்றொரு பயன்பாட்டில் தொடங்கப்பட்ட அழைப்பைத் தொடருவதற்கு, பயன்பாட்டை அனுமதிக்கிறது."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ஃபோன் எண்களைப் படித்தல்"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"சாதனத்தின் ஃபோன் எண்களை அணுக, பயன்பாட்டை அனுமதிக்கும்."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"டேப்லெட் உறக்க நிலைக்குச் செல்வதைத் தடுத்தல்"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"கைரேகையைச் சேமிக்க முடியவில்லை. ஏற்கனவே உள்ள கைரேகையை அகற்றவும்."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"கைரேகை செயல்பாடு ரத்துசெய்யப்பட்டது."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"பயனர், கைரேகை உறுதிப்படுத்துதலை ரத்துசெய்தார்."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"பலமுறை முயன்றுவிட்டீர்கள். கைரேகை சென்சார் முடக்கப்பட்டது."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"மீண்டும் முயற்சிக்கவும்."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"திற"</string> <string name="sms" msgid="4560537514610063430">"செய்தி"</string> <string name="add_contact" msgid="7867066569670597203">"சேர்"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"காண்பி"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"திட்டமிடுதல்"</string> + <string name="view_flight" msgid="7691640491425680214">"கண்கானி"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"சேமிப்பிடம் குறைகிறது"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"சில அமைப்பு செயல்பாடுகள் வேலை செய்யாமல் போகலாம்"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"முறைமையில் போதுமான சேமிப்பகம் இல்லை. 250மெ.பை. அளவு காலி இடவசதி இருப்பதை உறுதிசெய்து மீண்டும் தொடங்கவும்."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">பொது வைஃபை நெட்வொர்க் உள்ளது</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கவும்"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"தொலைத்தொடர்பு சேவை வழங்கும் நிறுவனத்தின் வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"வைஃபை நெட்வொர்க்குடன் இணைக்கப்பட்டது"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"வைஃபை நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"அனுமதிகள் தேவையில்லை"</string> <string name="perm_costs_money" msgid="4902470324142151116">"இதனால் நீங்கள் கட்டணம் செலுத்த வேண்டியிருக்கலாம்"</string> <string name="dlg_ok" msgid="7376953167039865701">"சரி"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"சாதனம் USB சார்ஜிங் செய்யப்படுகிறது"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"இணைத்துள்ள சாதனத்திற்கு USB சக்தி அளிக்கிறது"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB, கோப்புப் பரிமாற்றத்துக்கு மட்டும்"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB, படப் பரிமாற்றத்துக்கு மட்டும்"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB, MIDIக்கு மட்டும்"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB துணைக்கருவியுடன் இணைக்கப்பட்டுள்ளது"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"மேலும் விருப்பங்களுக்கு, தட்டவும்."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைத் திருத்தம் இணைக்கப்பட்டது"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"பணியிடம் <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2வது பணி <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3வது பணி <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"இந்தத் திரையை அகற்ற, முந்தையது, மேலோட்டப் பார்வை ஆகிய இரண்டு பொத்தானையும் தொட்டுப் பிடித்திருக்கவும்"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"திரை பின் செய்யப்பட்டது"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"திரையின் பின் அகற்றப்பட்டது"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"அகற்றும் முன் PINஐக் கேள்"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"அகற்றும் முன் திறத்தல் வடிவத்தைக் கேள்"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"அகற்றும் முன் கடவுச்சொல்லைக் கேள்"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"எல்லா மொழிகளும்"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"எல்லா மண்டலங்களும்"</string> <string name="locale_search_menu" msgid="2560710726687249178">"தேடு"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"பணிச் சுயவிவரத்தை ஆன் செய்யவா?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"பணி ஆப்ஸ், அறிவிப்புகள், தரவு மற்றும் பிற பணிச் சுயவிவர அம்சங்கள் ஆன் செய்யப்படும்"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"இயக்கு"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"இந்தப் பயன்பாடு Android இன் பழைய பதிப்புக்காக உருவாக்கப்பட்டதால், சரியாக வேலை செய்யாமல் போகலாம். புதுப்பிப்புகள் ஏதேனும் உள்ளதா எனப் பார்க்கவும் அல்லது டெவெலப்பரைத் தொடர்புகொள்ளவும்."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"புதுப்பிப்பு உள்ளதா எனப் பார்"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"புதிய செய்திகள் வந்துள்ளன"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"பார்க்க, SMS பயன்பாட்டைத் திறக்கவும்"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"சில செயல்பாடு வரம்பிடப்பட்டிருக்கலாம்"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"குரல் அழைப்பை மேற்கொள்ள இந்த ஃபோனுக்கு அனுமதி இல்லை"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"இந்த ஷார்ட்கட்டைப் பயன்படுத்த, சமீபத்திய பயன்பாடு வேண்டும்"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"காப்புப் பிரதி மற்றும் மீட்டமைவைப் பயன்பாடு ஆதரிக்காத காரணத்தால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"பயன்பாட்டுச் சான்றுகள் பொருந்தாத காரணத்தினால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"குறுக்குவழி முடக்கப்பட்டுள்ளது"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"நிறுவல் நீக்கு"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"பரவாயில்லை, திற"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"தீங்கிழைக்கும் பயன்பாடு உள்ளது"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string> <string name="screenshot_edit" msgid="7867478911006447565">"திருத்து"</string> </resources> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 183b3a23442b..a08c483eee2a 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"సురక్షిత మోడ్"</string> <string name="android_system_label" msgid="6577375335728551336">"Android సిస్టమ్"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"వ్యక్తిగత ప్రొఫైల్కి మార్చు"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"కార్యాలయ ప్రొఫైల్కి మార్చు"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"పరిచయాలు"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"మీ పరిచయాలను యాక్సెస్ చేయడానికి"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>ని ఉపయోగించి, మీ పరిచయాలను యాక్సెస్ చేయండి"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"పరికరం యొక్క ఫోన్ ఫీచర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఈ అనుమతి ఫోన్ నంబర్ మరియు పరికరం IDలను, కాల్ సక్రియంగా ఉందా లేదా అనే విషయాన్ని మరియు కాల్ ద్వారా కనెక్ట్ చేయబడిన రిమోట్ నంబర్ను కనుగొనడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయి"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"కాలింగ్ అనుభవాన్ని మెరుగుపరచడం కోసం తన కాల్లను సిస్టమ్ ద్వారా వెళ్లేలా చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"మరో యాప్ నుండి కాల్ని కొనసాగించండి"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"మరో యాప్లో ప్రారంభించిన కాల్ని కొనసాగించడానికి యాప్ని అనుమతిస్తుంది."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ఫోన్ నంబర్లను చదువు"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"పరికరం యొక్క ఫోన్ నంబర్లను యాక్సెస్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"టాబ్లెట్ను నిద్రావస్థకు వెళ్లనీయకుండా నిరోధించడం"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"వేలిముద్రను నిల్వ చేయడం సాధ్యపడదు. దయచేసి ఇప్పటికే ఉన్న వేలిముద్రను తీసివేయండి."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"వేలిముద్ర కార్యకలాపం రద్దయింది."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"వేలిముద్ర చర్యని వినియోగదారు రద్దు చేసారు."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"అనేకసార్లు ప్రయత్నించారు. వేలిముద్ర సెన్సార్ నిలిపివేయబడింది."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"మళ్లీ ప్రయత్నించండి."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"తెరవండి"</string> <string name="sms" msgid="4560537514610063430">"సందేశం"</string> <string name="add_contact" msgid="7867066569670597203">"జోడించండి"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"చూడండి"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"షెడ్యూల్"</string> + <string name="view_flight" msgid="7691640491425680214">"ట్రాక్ చేయండి"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"నిల్వ ఖాళీ అయిపోతోంది"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"కొన్ని సిస్టమ్ కార్యాచరణలు పని చేయకపోవచ్చు"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"సిస్టమ్ కోసం తగినంత నిల్వ లేదు. మీకు 250MB ఖాళీ స్థలం ఉందని నిర్ధారించుకుని, పునఃప్రారంభించండి."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">ఓపెన్ Wi-Fi నెట్వర్క్ అందుబాటులో ఉంది</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"బహిరంగ Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయండి"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"క్యారియర్ Wi‑Fi నెట్వర్క్కి కనెక్ట్ చేయండి"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"బహిరంగ Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేస్తోంది"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయబడింది"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయడం సాధ్యపడలేదు"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"అనుమతులు అవసరం లేదు"</string> <string name="perm_costs_money" msgid="4902470324142151116">"దీనికి మీకు డబ్బు ఖర్చు కావచ్చు"</string> <string name="dlg_ok" msgid="7376953167039865701">"సరే"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"ఈ పరికరం USB మోడ్లో ఛార్జ్ అవుతోంది"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"జోడించిన పరికరానికి USB ద్వారా పవర్ సరఫరా అవుతోంది"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"ఫైల్ బదిలీ కోసం USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"ఫోటో బదిలీ కోసం USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI కోసం USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB ఉపకరణానికి కనెక్ట్ చేయబడింది"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"మరిన్ని ఎంపికల కోసం నొక్కండి."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"అనలాగ్ ఆడియో ఉపకరణం కనుగొనబడింది"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"జోడించిన పరికరం ఈ ఫోన్కు అనుకూలంగా లేదు. మరింత తెలుసుకోవడానికి నొక్కండి."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2వ కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3వ కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు స్థూలదృష్టి బటన్లను నొక్కి & పట్టుకోండి"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"స్క్రీన్ పిన్ చేయబడింది"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"స్క్రీన్ అన్పిన్ చేయబడింది"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"అన్పిన్ చేయడానికి ముందు పిన్ కోసం అడుగు"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"అన్పిన్ చేయడానికి ముందు అన్లాక్ ఆకృతి కోసం అడుగు"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"అన్పిన్ చేయడానికి ముందు పాస్వర్డ్ కోసం అడుగు"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"అన్ని భాషలు"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"అన్ని ప్రాంతాలు"</string> <string name="locale_search_menu" msgid="2560710726687249178">"వెతుకు"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"కార్యాలయ ప్రొఫైల్ని ఆన్ చేయాలా?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"మీ కార్యాలయ యాప్లు, నోటిఫికేషన్లు, డేటా మరియు ఇతర కార్యాలయ ప్రొఫైల్ ఫీచర్లు ఆన్ చేయబడతాయి"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ఆన్ చేయి"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ఈ యాప్ పాత వెర్షన్ Android కోసం రూపొందించబడింది మరియు అది సరిగ్గా పని చేయకపోవచ్చు. అప్డేట్ల కోసం తనిఖీ చేయడానికి ప్రయత్నించండి లేదా డెవలపర్ని సంప్రదించండి."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"అప్డేట్ కోసం తనిఖీ చేయండి"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"మీకు కొత్త సందేశాలు ఉన్నాయి"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"వీక్షించడానికి SMS అనువర్తనాన్ని తెరవండి"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"కొంత పనితనం పరిమితం కావచ్చు"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"వాయిస్ కోసం ఫోన్ అనుమతించబడదు"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"పాప్అప్ విండో"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ఈ సత్వరమార్గానికి తాజా యాప్ అవసరం"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"బ్యాకప్ మరియు పునరుద్ధరణకు యాప్ మద్దతు ఇవ్వని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"యాప్ సంతకం సరిపోలని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"షార్ట్కట్ నిలిపివేయబడింది"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"అన్ఇన్స్టాల్ చేయండి"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ఏదేమైనా తెరువు"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"హానికరమైన యాప్ గుర్తించబడింది"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించాలనుకుంటోంది"</string> <string name="screenshot_edit" msgid="7867478911006447565">"సవరించు"</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 929991f46e06..9fea248e0048 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Güvenli mod"</string> <string name="android_system_label" msgid="6577375335728551336">"Android Sistemi"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Kişisel profile geçiş yap"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"İş profiline geç"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kişiler"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"kişilerinize erişme"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uygulamasının kişilerinize erişmesine izin verin"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Uygulamaya cihazdaki telefon özelliklerine erişme izni verir. Bu izin, uygulamanın telefon numarasını ve cihaz kimliğini, etkin bir çağrı olup olmadığını ve çağrıda bağlanılan karşı tarafın numarasını öğrenmesine olanak sağlar."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"çağrıları sistem üzerinden yönlendir"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Uygulamanın, çağrı deneyimini iyileştirmek için çağrılarını sistem üzerinden yönlendirmesine olanak tanır."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"başka bir uygulamadaki çağrıya devam etme"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Uygulamanın, başka bir uygulamada başlatılan çağrıya devam etmesine izin verir."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"telefon numaralarını oku"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Uygulamaya, cihazınızın telefon numaralarına erişme izni verir."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"tabletin uykuya geçmesini önle"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Parmak izi depolanamıyor. Lütfen mevcut parmak izlerinden birini kaldırın."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Parmak izi işlemi iptal edildi."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Parmak izi işlemi kullanıcı tarafından iptal edildi."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Çok fazla deneme yapıldı. Parmak izi sensörü devre dışı bıraıldı."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tekrar deneyin."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Aç"</string> <string name="sms" msgid="4560537514610063430">"Mesaj"</string> <string name="add_contact" msgid="7867066569670597203">"Ekle"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Göster"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Program yap"</string> + <string name="view_flight" msgid="7691640491425680214">"İzle"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Depolama alanı bitiyor"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bazı sistem işlevleri çalışmayabilir"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistem için yeterli depolama alanı yok. 250 MB boş alanınızın bulunduğundan emin olun ve yeniden başlatın."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Kullanılabilir Kablosuz ağı aç</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Açık kablosuz ağa bağlanın"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Operatöre ait kablosuz ağa bağlanın"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açık kablosuz ağa bağlandı"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Kablosuz ağa bağlanıldı"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kablosuz ağa bağlanamadı"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string> <string name="perm_costs_money" msgid="4902470324142151116">"bunun için sizden ücret alınabilir"</string> <string name="dlg_ok" msgid="7376953167039865701">"Tamam"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"Bu cihaz USB\'den şarj oluyor"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB, bağlı cihaza güç sağlıyor"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Dosya aktarımı için USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Fotoğraf aktarımı için USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI için USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB aksesuarına bağlandı"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Diğer seçenekler için dokunun."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analog ses aksesuarı algılandı"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Takılan cihaz bu telefonla uyumlu değil. Daha fazla bilgi edinmek için dokunun."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (İş)"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"İş için 2. <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"İş için 3. <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Bu ekranın sabitlemesini kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Ekran sabitlendi"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran sabitlemesi kaldırıldı"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Sabitlemeyi kaldırmadan önce PIN\'i sor"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sabitlemeyi kaldırmadan önce kilit açma desenini sor"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Sabitlemeyi kaldırmadan önce şifre sor"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Tüm diller"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Tüm bölgeler"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Ara"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"İş profili açılsın mı?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"İş uygulamalarınız, bildirimleriniz, verileriniz ve diğer iş profili özellikleriniz açılacak"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Aç"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Bu uygulama Android\'in daha eski bir sürümü için oluşturuldu ve düzgün çalışmayabilir. Güncellemeleri kontrol etmeyi deneyin veya geliştiriciyle iletişime geçin."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Güncellemeleri denetle"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Yeni mesajlarınız var"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Görüntülemek için SMS uygulamasını açın"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Bazı işlevler sınırlı olabilir"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ses için telefona izin verilmiyor"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up Pencere"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Bu kısayol, en son uygulamayı gerektiriyor"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Uygulama, yedekleme ve geri yüklemeyi desteklemediğinden kısayol geri yüklenemedi"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Uygulama imzası eşleşmediğinden kısayol geri yüklenemedi"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kısayol geri yüklenemedi"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Kısayol devre dışı"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"YÜKLEMEYİ KALDIR"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"YİNE DE AÇ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararlı uygulama tespit edildi"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> uygulaması, <xliff:g id="APP_2">%2$s</xliff:g> dilimlerini göstermek istiyor"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Düzenle"</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index b028b3672881..4ed3790a7f6e 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -270,10 +270,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Безпечний режим"</string> <string name="android_system_label" msgid="6577375335728551336">"Система Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Перейти в особистий профіль"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Перейти в робочий профіль"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"отримувати доступ до контактів"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Надати додатку <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> доступ до контактів"</string> @@ -425,10 +423,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Дозволяє програмі отримувати доступ до телефонних функцій пристрою. Такий дозвіл дає програмі змогу визначати номер телефону й ідентифікатори пристрою, активність виклику, а також віддалений номер, на який здійснюється виклик."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"маршрутизувати виклики через систему"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Дозволяє додатку маршрутизувати виклики через систему, щоб було зручніше телефонувати."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"продовжувати виклик з іншого додатка"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Додаток може продовжувати виклик, початий в іншому додатку."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"переглядати номери телефону"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Надає додаткам доступ до номерів телефону на пристрої."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"не доп.перехід пристр.в реж.сну"</string> @@ -503,11 +499,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Не вдалося зберегти відбиток. Видаліть наявний відбиток."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Дію з відбитком скасовано."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Користувач скасував дію з відбитком пальця."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Забагато спроб. Спробуйте пізніше."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Забагато спроб. Сканер відбитків пальців вимкнено."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторіть спробу."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Відбиток пальця <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1040,12 +1039,9 @@ <string name="browse" msgid="1245903488306147205">"Відкрити"</string> <string name="sms" msgid="4560537514610063430">"Повідомлення"</string> <string name="add_contact" msgid="7867066569670597203">"Додати"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Переглянути"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Запланувати"</string> + <string name="view_flight" msgid="7691640491425680214">"Відстежити"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Закінчується пам’ять"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Деякі системні функції можуть не працювати"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Недостатньо місця для системи. Переконайтесь, що на пристрої є 250 МБ вільного місця, і повторіть спробу."</string> @@ -1175,8 +1171,7 @@ <item quantity="other">Відкриті мережі Wi-Fi доступні</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Під’єднайтеся до відкритої мережі Wi-Fi"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Під’єднайтеся до мережі Wi-Fi оператора"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Під’єднання до відкритої мережі Wi-Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Під’єднано до мережі Wi-Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не вдалося під’єднатися до мережі Wi-Fi"</string> @@ -1260,13 +1255,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Дозвіл не потрібний"</string> <string name="perm_costs_money" msgid="4902470324142151116">"це платна послуга"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB-кабель, через який заряджається цей пристрій"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB-кабель, через який живиться під’єднаний пристрій"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB для перенесення файлів"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB для перенесення фотографій"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB для режиму MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Під’єднано до аксесуара USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Торкніться, щоб переглянути більше опцій."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Виявлено аналоговий аксесуар для аудіо"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string> @@ -1711,9 +1716,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Робоча <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-а робота: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-я робота: <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Щоб відкріпити цей екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\""</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Екран закріплено"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Екран відкріплено"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"PIN-код для відкріплення"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запитувати ключ розблокування перед відкріпленням"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запитувати пароль перед відкріпленням"</string> @@ -1825,15 +1827,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Усі мови"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Усі регіони"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Пошук"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Увімкнути робочий профіль?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Додатки, сповіщення, дані й інші функції робочого профілю буде ввімкнено"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Увімкнути"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Цей додаток створений для старішої версії Android і може працювати неналежним чином. Спробуйте знайти оновлення або зв’яжіться з розробником."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Шукати оновлення"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"У вас є нові повідомлення"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Щоб переглянути, відкрийте додаток для SMS"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Деякі функції можуть не працювати"</string> @@ -1902,17 +1900,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Голосові дзвінки з телефона заборонено"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Спливаюче вікно"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Для цього ярлика потрібна найновіша версія додатка"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не вдалося відновити ярлик, оскільки додаток не підтримує резервне копіювання та відновлення"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не вдалося відновити ярлик, оскільки підписи додатків не збігаються"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не вдалося відновити ярлик"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Ярлик вимкнено"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ВИДАЛИТИ"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"УСЕ ОДНО ВІДКРИТИ"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Виявлено шкідливий додаток"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> хоче показати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Редагувати"</string> </resources> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index c241214f97d8..bfaaba2be7a9 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>، <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"حفاظتی وضع"</string> <string name="android_system_label" msgid="6577375335728551336">"Android سسٹم"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"ذاتی پروفائل پر سوئچ کریں"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"دفتری پروفائل پر سوئچ کریں"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"رابطے"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"اپنے رابطوں تک رسائی حاصل کریں"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> کو اپنے رابطوں تک رسائی کی اجازت دیں"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"ایپ کو آلے کی فون والی خصوصیات تک رسائی حاصل کرنے کی اجازت دیتا ہے۔ یہ اجازت ایپ کو فون نمبر اور آلے کے IDs کا تعین کرنے، آیا کوئی کال فعال ہے، اور کال کے ذریعہ مربوط ریموٹ نمبر کا تعین کرنے دیتی ہے۔"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"سسٹم کے ذریعہ کالز روٹ کریں"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"کالںگ کا تجربہ بہتر بنانے کے لیے سسٹم کے ذریعہ ایپ کو کالز روٹ کرنے کی اجازت دیتا ہے۔"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"دوسری ایپ کی کال جاری رکھیں"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ایپ کو دوسری ایپ میں شروع کردہ کال کو جاری رکھنے کی اجازت ملتی ہے۔"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"فون نمبرز پڑھیں"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"ایپ کو آلہ کے فون نمبرز تک رسائی کرنے دیتا ہے۔"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ٹیبلیٹ کو سلیپ وضع میں جانے سے روکیں"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"فنگر پرنٹ اسٹور نہیں کیا جا سکتا ہے۔ براہ کرم ایک موجودہ فنگر پرنٹ ہٹائیں۔"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"فنگر پرنٹ کی کارروائی منسوخ ہوگئی۔"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"صارف نے فنگر پرنٹ کی کارروائی منسوخ کر دی۔"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"کافی زیادہ کوششیں کی گئیں۔ بعد میں دوبارہ کوشش کریں۔"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"کافی زیادہ کوششیں۔ فنگر پرنٹ سینسر غیر فعال ہو گیا۔"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوبارہ کوشش کریں۔"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"کھولیں"</string> <string name="sms" msgid="4560537514610063430">"پیغام"</string> <string name="add_contact" msgid="7867066569670597203">"شامل کریں"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"دیکھیں"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"شیڈول کریں"</string> + <string name="view_flight" msgid="7691640491425680214">"پتہ لگائیں"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"اسٹوریج کی جگہ ختم ہو رہی ہے"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"ممکن ہے سسٹم کے کچھ فنکشنز کام نہ کریں"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"سسٹم کیلئے کافی اسٹوریج نہیں ہے۔ اس بات کو یقینی بنائیں کہ آپ کے پاس 250MB خالی جگہ ہے اور دوبارہ شروع کریں۔"</string> @@ -1131,8 +1127,7 @@ <item quantity="one">عوامی Wi-Fi نیٹ ورک دستیاب ہے</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہوں"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"کیریئر Wi‑Fi نیٹ ورک سے منسلک ہوں"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہو رہا ہے"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہو گيا"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi نیٹ ورک سے منسلک نہیں ہو سکا"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"کوئی اجازتیں درکار نہیں ہیں"</string> <string name="perm_costs_money" msgid="4902470324142151116">"اس میں آپ کا پیسہ خرچ ہو سکتا ہے"</string> <string name="dlg_ok" msgid="7376953167039865701">"ٹھیک ہے"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB اس آلے کو چارج کر رہی ہے"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"منسلکہ آلے کو USB پاور سپلائی کر رہی ہے"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"فائل کی منتقلی کیلئے USB"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"تصویر کی منتقلی کیلئے USB"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI کیلئے USB"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"ایک USB لوازم سے مربوط ہے"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"مزید اختیارات کیلئے تھپتھپائیں۔"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"اینالاگ آڈیو کے لوازم کا پتہ چلا"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"منسلک آلہ اس فون کے موافق نہیں ہے۔ مزید جاننے کے لیے تھپتھپائیں۔"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB ڈیبگ کرنا مربوط ہو گیا"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"دفتر <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"دوسرا کام <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"تیسرا کام <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"اس اسکرین سے پن ہٹانے کیلئے، ٹچ کریں اور مجموعی جائزہ اور واپس جائیں بٹنز کو دبائے رکھیں"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"اسکرین کو پن کر دیا گیا"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"اسکرین کا پن ہٹا دیا گیا"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"پن ہٹانے سے پہلے PIN طلب کریں"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"پن ہٹانے سے پہلے غیر مقفل کرنے کا پیٹرن طلب کریں"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"پن ہٹانے سے پہلے پاس ورڈ طلب کریں"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"سبھی زبانیں"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"تمام علاقے"</string> <string name="locale_search_menu" msgid="2560710726687249178">"تلاش"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"دفتری پروفائل آن کریں؟"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"آپ کی دفتری ایپس، اطلاعات، ڈیٹا اور دفتری پروفائل کی دیگر خصوصیات آن کر دی جائیں گی"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"آن کریں"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"یہ ایپ Android کے پرانے ورژن کے لئے بنائی گئی ہے اور ہو سکتا ہے صحیح طور پر کام نہ کرے۔ اپ ڈیٹس چیک کر کے آزمائیں یا ڈیولپر سے رابطہ کریں۔"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"اپ ڈیٹ چیک کریں"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"آپ کے پاس نئے پیغامات ہیں"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"دیکھنے کیلئے SMS ایپ کھولیں"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"کچھ فعالیت محدود ہو سکتی ہے"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"آواز کیلئے فون کو اجازت نہیں ہے"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"پاپ اپ ونڈو"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"اس شارٹ کٹ کیلئے جدید ترین ایپ درکار ہے"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"شارٹ کٹ کو بحال نہیں کیا جا سکا، کیونکہ ایپ بیک اپ اور بحالی کو سپورٹ نہیں کرتی ہے"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ایپ دستخط غیر مماثل ہونے کی وجہ سے شارٹ کٹ کو بحال نہیں کیا جا سکا"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"شارٹ کٹ کو بحال نہیں کیا جا سکا"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"شارٹ کٹ غیر فعال ہے"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"اَن انسٹال کریں"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"بہر صورت کھولیں"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"ضرر رساں ایپ کا پتہ چلا"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ترمیم کریں"</string> </resources> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 2329a415a297..c9076ca57fe6 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Xavfsiz usul"</string> <string name="android_system_label" msgid="6577375335728551336">"Android tizimi"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Shaxsiy profilga almashtirish"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Ishchi profilga almashtirish"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktlar"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"kontaktlarga kirish"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> uchun kontaktlaringizga ruxsat berish"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ilovaga qurilmangizdagi telefon xususiyatlariga kirishga ruxsat beradi. Bu ruxsat ilovaga telefon raqami va qurilma nomlari, qo‘ng‘iroq faol yoki faolsizligi va masofadagi raqam qo‘ng‘rioq orqali bog‘langanligini aniqlashga imkon beradi."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"chaqiruvlarni tizim orqali yo‘naltirish"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Ilova aloqa sifatini yaxshilash maqsadida chaqiruvlarni tizim orqali yo‘naltirishi mumkin."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"chaqiruvni boshqa ilovada davom ettirish"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Ilovaga boshqa ilovada boshlangan chaqiruvni davom ettirish imkon beradi"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"telefon raqamlarini o‘qish"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Ilovaga qurilmaning telefon raqamlaridan foydalanishiga ruxsat beradi."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"planshetni uyquga ketishiga yo‘l qo‘ymaslik"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Barmoq izini saqlab bo‘lmadi. Mavjud barmoq izlaridan birini o‘chirib tashlang."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Barmoq izi tekshiruvi bekor qilindi."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Barmoq izi amali foydalanuvchi tomonidan bekor qilindi"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Urinishlar soni ko‘payib ketdi. Keyinroq qayta urinib ko‘ring."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Urinishlar soni ko‘payib ketdi. Barmoq izi skaneri bloklandi."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Qayta urinib ko‘ring."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Barmoq izi <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Ochish"</string> <string name="sms" msgid="4560537514610063430">"Xabar"</string> <string name="add_contact" msgid="7867066569670597203">"Qo‘shish"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Ochish"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Jadval"</string> + <string name="view_flight" msgid="7691640491425680214">"Trek"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Xotirada bo‘sh joy tugamoqda"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Ba‘zi tizim funksiyalari ishlamasligi mumkin"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tizim uchun xotirada joy yetarli emas. Avval 250 megabayt joy bo‘shatib, keyin qurilmani o‘chirib yoqing."</string> @@ -1131,8 +1127,7 @@ <item quantity="one">Ochiq Wi-Fi tarmog‘i aniqlandi</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Ochiq Wi‑Fi tarmoqqa ulaning"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Aloqa operatori Wi-Fi tarmog‘iga ulanish"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ochiq Wi‑Fi tarmoqqa ulanilmoqda"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi tarmoqqa ulanildi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi tarmoqqa ulanib bo‘lmadi"</string> @@ -1217,13 +1212,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Hech qanday ruxsat talab qilinmaydi"</string> <string name="perm_costs_money" msgid="4902470324142151116">"buning uchun sizdan haq olinishi mumkin"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB orqali quvvatlash"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB orqali ulangan qurilma quvvatlanmoqda"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB orqali fayl o‘tkazish"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB orqali surat o‘tkazish"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB orqali MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB jihozga ulangan"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Boshqa parametrlarini ko‘rish uchun bosing."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogli audio uskuna aniqlandi"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Biriktirilgan qurilma mazkur telefon bilan mos emas. Batafsil axborot olish uchun bu yerga bosing."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozliklarni tuzatish"</string> @@ -1662,9 +1667,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Ish <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ishxona <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-ishxona <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Bu ekrandan chiqish uchun Orqaga va Menyu tugmalarini bosib turing"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Ekran qadab qo‘yildi"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran bo‘shatildi"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Yechishda PIN-kod so‘ralsin"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Yechishdan oldin grafik kalit so‘ralsin"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Bo‘shatishdan oldin parol so‘ralsin"</string> @@ -1709,7 +1711,7 @@ </plurals> <string name="zen_mode_until" msgid="7336308492289875088">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> gacha"</string> <string name="zen_mode_alarm" msgid="9128205721301330797">"<xliff:g id="FORMATTEDTIME">%1$s</xliff:g> gacha (keyingi signal)"</string> - <string name="zen_mode_forever" msgid="931849471004038757">"O‘chirib qo‘ymagunimcha"</string> + <string name="zen_mode_forever" msgid="931849471004038757">"O‘chirmaguningizcha"</string> <string name="zen_mode_forever_dnd" msgid="3792132696572189081">"“Bezovta qilinmasin” rejimi o‘chirilmaguncha"</string> <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g> / <xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="2821479483960330739">"Yig‘ish"</string> @@ -1758,15 +1760,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Barcha tillar"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Barcha hududlar"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Qidiruv"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Ishchi profil yoqilsinmi?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Ishchi ilovalar, bildirishnomalar, ma’lumotlar va boshqa ishchi profil imkoniyatlari yoqiladi"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Yoqish"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Bu ilova eskiroq Android versiyalariga chiqarilgan va xato ishlashi mumkin. Yangilanishlarini tekshiring yoki dasturchi bilan bog‘laning."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Yangilanish borligini tekshirish"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Sizga yangi SMS keldi"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Ko‘rish uchun SMS ilovasini oching"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Ba’zi funksiyalar cheklanishi m-n"</string> @@ -1833,17 +1831,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ovoz uchun telefon taqiqlangan"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Qalqib chiquvchi oyna"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Bu yorliq uchun eng oxirgi versiyadagi ilova zarur"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Ilovada zaxiralash va tiklash ishlamagani uchun yorliq tiklanmadi"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Ilova imzosi mos kelmagani uchun yorliq tiklanmadi"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Yorliq tiklanmadi"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Yorliq faolsizlantirildi"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"O‘CHIRIB TASHLASH"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"BARIBIR OCHILSIN"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararli ilova aniqlandi"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ilovasi <xliff:g id="APP_2">%2$s</xliff:g> ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Tahrirlash"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 2b4f6cb66482..b781f3e8f348 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>、<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"安全模式"</string> <string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"切換至個人設定檔"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"切換至 Work 設定檔"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"聯絡人"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取你的聯絡人"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」存取你的聯絡人"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"允許應用程式使用裝置的電話功能。這項權限可讓應用程式判讀手機號碼和裝置 ID、是否正在通話中,以及所撥打的對方號碼。"</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"透過系統接通來電"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"允許應用程式透過系統接通來電,以改善通話品質。"</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"繼續進行來自其他應用程式的通話"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"允許應用程式繼續進行在其他應用程式中發起的通話。"</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"讀取電話號碼"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"允許應用程式存取裝置上的電話號碼資料。"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"防止平板電腦進入休眠狀態"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"無法儲存指紋,請先移除現有指紋。"</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋作業已取消。"</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"使用者已取消指紋驗證作業。"</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"請再試一次。"</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"開啟"</string> <string name="sms" msgid="4560537514610063430">"訊息"</string> <string name="add_contact" msgid="7867066569670597203">"新增"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"查看"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"時間表"</string> + <string name="view_flight" msgid="7691640491425680214">"追蹤"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"儲存空間即將用盡"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"部分系統功能可能無法運作"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確定你已釋出 250MB 的可用空間,然後重新啟動。"</string> @@ -1131,8 +1127,7 @@ <item quantity="one">有多個可用的開放 Wi-Fi 網路</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi‑Fi 網路"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連上電信業者的 Wi‑Fi 網路"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi‑Fi 網路"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網路"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi‑Fi 網路"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"無須許可"</string> <string name="perm_costs_money" msgid="4902470324142151116">"這可能需要付費"</string> <string name="dlg_ok" msgid="7376953167039865701">"確定"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"正在透過 USB 為這個裝置充電"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"正在透過 USB 為連接的裝置供電"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB 檔案傳輸"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB 相片傳輸"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"已連接 USB 配件"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"輕觸即可查看更多選項。"</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"偵測到類比音訊配件"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"此外接裝置與這支手機不相容。輕觸即可瞭解詳情。"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第 2 項工作:<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第 3 項工作:<xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"如要取消固定這個畫面,請按住「返回」按鈕和「總覽」按鈕"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"已固定螢幕"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定螢幕"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消固定時必須輸入 PIN"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消固定時必須畫出解鎖圖案"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消固定時必須輸入密碼"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"所有地區"</string> <string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"要開啟 Work 設定檔嗎?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"系統將開啟你的辦公應用程式、通知、資料和其他 Work 設定檔功能"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"這個應用程式是專為舊版 Android 所打造,因此可能無法正常運作。請嘗試檢查更新,或是與開發人員聯絡。"</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"檢查更新"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"你有新訊息"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"開啟簡訊應用程式來查看內容"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能受到鎖定"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"手機不支援語音"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"你必須擁有最新版的應用程式,才能使用這個捷徑"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"應用程式不支援備份與還原功能,因此無法還原捷徑"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"應用程式簽署不相符,因此無法還原捷徑"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"無法還原捷徑"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"捷徑已停用"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"解除安裝"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"仍要開啟"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害應用程式"</string> <string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string> <string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 3f5d2b143170..9c4861033749 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -264,10 +264,8 @@ <string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="2788228061547930246">"Imodi ephephile"</string> <string name="android_system_label" msgid="6577375335728551336">"Uhlelo lwe-Android"</string> - <!-- no translation found for user_owner_label (8836124313744349203) --> - <skip /> - <!-- no translation found for managed_profile_label (8947929265267690522) --> - <skip /> + <string name="user_owner_label" msgid="8836124313744349203">"Shintshela kuphrofayela yomuntu siqu"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Shintshela kuphrofayela yomsebenzi"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Oxhumana nabo"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"finyelela koxhumana nabo"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Vumela i-<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> ukuthi ithole ukufinyelela koxhumana nabo"</string> @@ -419,10 +417,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ivumela uhlelo lokusebenza ukufinyelela izici zefoni zedivayisi. Le mvume ivumela uhlelo lokusebenza ukucacisa inombolo yefoni nobunikazi bedivayisi, ukuthi noma ikholi iyasebenza, futhi nenombolo yesilawuli kude zixhunywe ngekholi."</string> <string name="permlab_manageOwnCalls" msgid="1503034913274622244">"yanza imizila yamakholi ngesistimu"</string> <string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Ivumela uhlelo lokusebenza ukwenza imizila yamakholi ngesistimu ukuze ithuthukise umuzwa wokushaya."</string> - <!-- no translation found for permlab_acceptHandover (2661534649736022409) --> - <skip /> - <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) --> - <skip /> + <string name="permlab_acceptHandover" msgid="2661534649736022409">"qhuba ikholi kusukela kolunye uhlelo lokusebenza"</string> + <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Ivumela uhlelo lokusebenza ukuze luqhube ikholi eqalwe kolunye uhlelo lokusebenza."</string> <string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"funda izinombolo zefoni"</string> <string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Ivumela uhlelo lokusebenza ukufinyelela izinombolo zefoni zedivayisi."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"gwema ithebhulethi ukuba ingalali"</string> @@ -497,11 +493,14 @@ <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Izigxivizo zeminwe azikwazi ukugcinwa. Sicela ususe izigxivizo zeminwe ezikhona."</string> <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ukusebenza kwezingxivizo zeminwe kukhanseliwe."</string> - <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) --> - <skip /> + <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Umsebenzi wesigxivizo somunwe sikhanselwe umsebenzisi."</string> <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Imizamo eminingi kakhulu. Inzwa yezigxivizo zeminwe ikhutshaziwe."</string> <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zama futhi."</string> + <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) --> + <skip /> + <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) --> + <skip /> <string name="fingerprint_name_template" msgid="5870957565512716938">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -1000,12 +999,9 @@ <string name="browse" msgid="1245903488306147205">"Vula"</string> <string name="sms" msgid="4560537514610063430">"Umlayezo"</string> <string name="add_contact" msgid="7867066569670597203">"Engeza"</string> - <!-- no translation found for view_calendar (979609872939597838) --> - <skip /> - <!-- no translation found for add_calendar_event (1953664627192056206) --> - <skip /> - <!-- no translation found for view_flight (7691640491425680214) --> - <skip /> + <string name="view_calendar" msgid="979609872939597838">"Buka"</string> + <string name="add_calendar_event" msgid="1953664627192056206">"Ishejuli"</string> + <string name="view_flight" msgid="7691640491425680214">"Landelela"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"Isikhala sokulondoloza siyaphela"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"Eminye imisebenzi yohlelo ingahle ingasebenzi"</string> <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Akusona isitoreji esanele sesistimu. Qiniseka ukuthi unesikhala esikhululekile esingu-250MB uphinde uqalise kabusha."</string> @@ -1131,8 +1127,7 @@ <item quantity="other">Vula amanethiwekhi we-Wi-Fi atholakalayo</item> </plurals> <string name="wifi_available_title" msgid="3817100557900599505">"Xhuma kunethiwekhi evulekile ye-Wi‑Fi"</string> - <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) --> - <skip /> + <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Xhumeka kunethiwekhi yenkampani yenethiwekhi ye-Wi-Fi"</string> <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ixhuma kunethiwekhi evulekile ye-Wi‑Fi"</string> <string name="wifi_available_title_connected" msgid="7542672851522241548">"Kuxhumeke kunethiwekhi ye-Wi‑Fi"</string> <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ayikwazanga ukuxhumeka kunethiwekhi ye-Wi-Fi"</string> @@ -1216,13 +1211,23 @@ <string name="no_permissions" msgid="7283357728219338112">"Ayikho imvume edingekayo"</string> <string name="perm_costs_money" msgid="4902470324142151116">"lokhu kungakudlela imali"</string> <string name="dlg_ok" msgid="7376953167039865701">"KULUNGILE"</string> - <string name="usb_charging_notification_title" msgid="6895185153353640787">"I-USB ishaja le divayisi"</string> - <string name="usb_supplying_notification_title" msgid="5310642257296510271">"I-USB inikeza amandla kudivayisi enamathiselwe"</string> - <string name="usb_mtp_notification_title" msgid="8396264943589760855">"I-USB yokudluliswa kwefayela"</string> - <string name="usb_ptp_notification_title" msgid="1347328437083192112">"I-USB yokudluliswa kwesithombe"</string> - <string name="usb_midi_notification_title" msgid="4850904915889144654">"I-USB ye-MIDI"</string> - <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ixhunywe ku-accessory ye-USB"</string> + <!-- no translation found for usb_charging_notification_title (1595122345358177163) --> + <skip /> + <!-- no translation found for usb_supplying_notification_title (4631045789893086181) --> + <skip /> + <!-- no translation found for usb_mtp_notification_title (4238227258391151029) --> + <skip /> + <!-- no translation found for usb_ptp_notification_title (5425857879922006878) --> + <skip /> + <!-- no translation found for usb_tether_notification_title (3716143122035802501) --> + <skip /> + <!-- no translation found for usb_midi_notification_title (5356040379749154805) --> + <skip /> + <!-- no translation found for usb_accessory_notification_title (1899977434994900306) --> + <skip /> <string name="usb_notification_message" msgid="3370903770828407960">"Thepha ngezinketho eziningi."</string> + <!-- no translation found for usb_power_notification_message (4647527153291917218) --> + <skip /> <string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Kutholwe isisetshenziswa se-analog yomsindo"</string> <string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi."</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string> @@ -1661,9 +1666,6 @@ <string name="managed_profile_label_badge" msgid="2355652472854327647">"Umsebenzi <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Umsebenzi wesibili <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Umsebenzi wesithathu <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="lock_to_app_toast" msgid="6820571533009838261">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe izinkinobho zokubuyela emuva nezokubuka konke"</string> - <string name="lock_to_app_start" msgid="6643342070839862795">"Isikrini siphiniwe"</string> - <string name="lock_to_app_exit" msgid="8598219838213787430">"Isikrini sisuswe ukuphina"</string> <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Cela iphinikhodi ngaphambi kokuphina"</string> <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Cela iphethini yokuvula ngaphambi kokususa ukuphina"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Cela iphasiwedi ngaphambi kokususa ukuphina"</string> @@ -1757,15 +1759,11 @@ <string name="language_picker_section_all" msgid="3097279199511617537">"Zonke izilimi"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"Zonke izifunda"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Sesha"</string> - <!-- no translation found for work_mode_off_title (1118691887588435530) --> - <skip /> - <!-- no translation found for work_mode_off_message (5130856710614337649) --> - <skip /> + <string name="work_mode_off_title" msgid="1118691887588435530">"Vula iphrofayela yomsebenzi?"</string> + <string name="work_mode_off_message" msgid="5130856710614337649">"Izinhlelo zakho zokusebenza zomsebenzi, izaziso, idatha, nezinye izici zephrofayela yomsebenzi kuzovulwa"</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"Vula"</string> - <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) --> - <skip /> - <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) --> - <skip /> + <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Lolu hlelo lokusebenza belakhelwe inguqulo endala ye-Android futhi kungenzeka lungasebenzi kahle. Zama ukuhlolela izibuyekezo, noma uxhumane nonjiniyela."</string> + <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Hlola izibuyekezo"</string> <string name="new_sms_notification_title" msgid="8442817549127555977">"Unemilayezo emisha"</string> <string name="new_sms_notification_content" msgid="7002938807812083463">"Vula uhlelo lokusebenza lwe-SMS ukuze ubuke"</string> <string name="user_encrypted_title" msgid="9054897468831672082">"Okunye ukusebenza kungakhawulelwe"</string> @@ -1832,17 +1830,15 @@ <string name="mmcc_illegal_me" msgid="1950705155760872972">"Ifoni ayivunyelwe izwi"</string> <string name="popup_window_default_title" msgid="4874318849712115433">"Iwindi lesigelekeqe"</string> <string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> - <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Lesi sinqamuleli sidinga uhlelo lokusebenza lwakamuva"</string> + <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) --> + <skip /> <string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Ayikwazanga ukubuyisa isinqamuleli ngoba uhlelo lokusebenza alusekeli isipele nokubuyisa"</string> <string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Ayikwazanga ukubuyisa isinqamuleli ngoba isignisha yohlelo lokusebenza ayifani"</string> <string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Ayikwazanga ukubuyisa isinqamuleli"</string> <string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Isinqamuleli sikhutshaziwe"</string> - <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) --> - <skip /> - <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) --> - <skip /> - <!-- no translation found for harmful_app_warning_title (8982527462829423432) --> - <skip /> + <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"KHIPHA"</string> + <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"VULA NOMA KUNJALO"</string> + <string name="harmful_app_warning_title" msgid="8982527462829423432">"Uhlelo lokusebenza oluyingozi lutholakele"</string> <string name="slices_permission_request" msgid="8484943441501672932">"I-<xliff:g id="APP_0">%1$s</xliff:g> ifuna ukubonisa izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Hlela"</string> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 68dad87bd292..005d07dc008a 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -7903,6 +7903,23 @@ <attr name="settingsActivity" /> </declare-styleable> + <!-- Use <code>compatibility-package</code> as a child tag of <code>autofill-service</code> + in the XML resource that describes an {@link android.service.autofill.AutofillService} + to specify a package and an optional max version code for which to request compatibility + mode. If no max version code is specified compatibility mode is requested for all package + versions. The max version code is useful to avoid requesting compatibility mode for newer + package versions that are known to natively support autofill. + --> + <declare-styleable name="AutofillService_CompatibilityPackage"> + <!-- The package name for which compatibility mode is requested. --> + <attr name="name" /> + <!-- The max version code of the package for which compatibility mode is + requested. This corresponds to the long value returned by {@link + android.content.pm.PackageInfo#getLongVersionCode()} for the target package. + --> + <attr name="maxLongVersionCode" format="string" /> + </declare-styleable> + <!-- =============================== --> <!-- Contacts meta-data attributes --> <!-- =============================== --> @@ -8798,7 +8815,7 @@ <!-- Attributes that are read when parsing a tag. --> <declare-styleable name="VideoView2"> <attr name="enableControlView" format="boolean" /> - <attr name="showSubtitle" format="boolean" /> + <attr name="enableSubtitle" format="boolean" /> <attr name="viewType" format="enum"> <enum name="surfaceView" value="0" /> <enum name="textureView" value="1" /> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 607414d666cc..c8032a276659 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -363,6 +363,23 @@ <!-- Regex of wired ethernet ifaces --> <string translatable="false" name="config_ethernet_iface_regex">eth\\d</string> + + + <!-- Configuration of Ethernet interfaces in the following format: + <interface name|mac address>;[Network Capabilities];[IP config] + Where + [Network Capabilities] Optional. A comma seprated list of network capabilities. + Values must be from NetworkCapabilities#NET_CAPABILITIES_* constants. + [IP config] Optional. If empty or not specified - DHCP will be used, otherwise + static IP address with the mask. + --> + <string-array translatable="false" name="config_ethernet_interfaces"> + <!-- + <item>eth1;12,13,14,15;192.168.0.10/24</item> + <item>eth2;;192.168.0.11/24</item> + --> + </string-array> + <!-- If the mobile hotspot feature requires provisioning, a package name and class name can be provided to launch a supported application that provisions the devices. @@ -432,12 +449,6 @@ <!-- Activity name to enable wifi tethering after provisioning app succeeds --> <string translatable="false" name="config_wifi_tether_enable">com.android.settings/.wifi.tether.TetherService</string> - <!-- Controls the WiFi wakeup feature. - 0 = Not available. - 1 = Available. - --> - <integer translatable="false" name="config_wifi_wakeup_available">1</integer> - <!-- Array of ConnectivityManager.TYPE_xxxx values allowable for tethering. Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or @@ -1132,7 +1143,7 @@ <bool name="config_hotswapCapable">false</bool> <!-- Component name of the ICC hotswap prompt for restart dialog --> - <string name="config_iccHotswapPromptForRestartDialogComponent" translateable="false">@null</string> + <string name="config_iccHotswapPromptForRestartDialogComponent" translatable="false">@null</string> <!-- Enable puk unlockscreen by default. If unlock screen is disabled, the puk should be unlocked through Emergency Dialer --> @@ -1431,7 +1442,7 @@ permission. [This is only used if config_enableUpdateableTimeZoneRules and config_timeZoneRulesUpdateTrackingEnabled are true.] --> - <string name="config_timeZoneRulesUpdaterPackage" translateable="false">com.android.timezone.updater</string> + <string name="config_timeZoneRulesUpdaterPackage" translatable="false">com.android.timezone.updater</string> <!-- The package of the time zone rules data application. Expected to be configured by OEMs to reference their own priv-app APK package. @@ -1440,7 +1451,7 @@ data app packages. [This is only used if config_enableUpdateableTimeZoneRules and config_timeZoneRulesUpdateTrackingEnabled are true.] --> - <string name="config_timeZoneRulesDataPackage" translateable="false"></string> + <string name="config_timeZoneRulesDataPackage" translatable="false"></string> <!-- The allowed time in milliseconds between an update check intent being broadcast and the response being considered overdue. Reliability triggers will not fire in this time. @@ -2573,6 +2584,14 @@ <!-- Flag specifying whether or not IMS will use the dynamic ImsResolver --> <bool name="config_dynamic_bind_ims">false</bool> + <!-- Cellular data service package name to bind to by default. If none is specified in an overlay, an + empty string is passed in --> + <string name="config_wwan_data_service_package" translatable="false">com.android.phone</string> + + <!-- IWLAN data service package name to bind to by default. If none is specified in an overlay, an + empty string is passed in --> + <string name="config_wlan_data_service_package" translatable="false"></string> + <bool name="config_networkSamplingWakesDevice">true</bool> <!-- Home (non-roaming) values for CDMA roaming indicator. @@ -3258,7 +3277,7 @@ <string translatable="false" name="config_deviceSpecificAudioService"></string> <!-- Component name of media projection permission dialog --> - <string name="config_mediaProjectionPermissionDialogComponent" translateable="false">com.android.systemui/com.android.systemui.media.MediaProjectionPermissionActivity</string> + <string name="config_mediaProjectionPermissionDialogComponent" translatable="false">com.android.systemui/com.android.systemui.media.MediaProjectionPermissionActivity</string> <!-- Corner radius of system dialogs --> <dimen name="config_dialogCornerRadius">2dp</dimen> @@ -3277,4 +3296,11 @@ <bool name="config_supportBluetoothPersistedState">true</bool> <bool name="config_keepRestrictedProfilesInBackground">true</bool> + + <!-- Cellular network service package name to bind to by default. --> + <string name="config_wwan_network_service_package" translatable="false">com.android.phone</string> + + <!-- IWLAN network service package name to bind to by default. If none is specified in an overlay, an + empty string is passed in --> + <string name="config_wlan_network_service_package" translatable="false"></string> </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index dee880f0ea2d..93f22f25d7d3 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2868,6 +2868,7 @@ <public name="accessibilityHeading" /> <public name="outlineSpotShadowColor" /> <public name="outlineAmbientShadowColor" /> + <public name="maxLongVersionCode" /> </public-group> <public-group type="style" first-id="0x010302e0"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a24061621c3c..ec81df7b89e2 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1351,6 +1351,10 @@ <string name="fingerprint_error_lockout_permanent">Too many attempts. Fingerprint sensor disabled.</string> <!-- Generic error message shown when the fingerprint hardware can't recognize the fingerprint --> <string name="fingerprint_error_unable_to_process">Try again.</string> + <!-- Generic error message shown when the user has no enrolled fingerprints --> + <string name="fingerprint_error_no_fingerprints">No fingerprints enrolled.</string> + <!-- Generic error message shown when the app requests fingerprint authentication on a device without a sensor --> + <string name="fingerprint_error_hw_not_present">This device does not have a fingerprint sensor</string> <!-- Template to be used to name enrolled fingerprints by default. --> <string name="fingerprint_name_template">Finger <xliff:g id="fingerId" example="1">%d</xliff:g></string> @@ -4423,15 +4427,6 @@ <!-- DO NOT TRANSLATE --> <string name="date_picker_day_typeface">sans-serif-medium</string> - <!-- Notify use that they are in Lock-to-app --> - <string name="lock_to_app_toast">To unpin this screen, touch & hold Back and Overview - buttons</string> - - <!-- Starting lock-to-app indication. --> - <string name="lock_to_app_start">Screen pinned</string> - <!-- Exting lock-to-app indication. --> - <string name="lock_to_app_exit">Screen unpinned</string> - <!-- Lock-to-app unlock pin string --> <string name="lock_to_app_unlock_pin">Ask for PIN before unpinning</string> <!-- Lock-to-app unlock pattern string --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a338f89af201..29b09b574318 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -266,6 +266,10 @@ <java-symbol type="bool" name="config_mms_content_disposition_support" /> <java-symbol type="string" name="config_ims_package" /> <java-symbol type="bool" name="config_dynamic_bind_ims" /> + <java-symbol type="string" name="config_wwan_network_service_package" /> + <java-symbol type="string" name="config_wlan_network_service_package" /> + <java-symbol type="string" name="config_wwan_data_service_package" /> + <java-symbol type="string" name="config_wlan_data_service_package" /> <java-symbol type="bool" name="config_networkSamplingWakesDevice" /> <java-symbol type="bool" name="config_showMenuShortcutsWhenKeyboardPresent" /> <java-symbol type="bool" name="config_sip_wifi_only" /> @@ -656,6 +660,7 @@ <java-symbol type="string" name="chooseActivity" /> <java-symbol type="string" name="config_default_dns_server" /> <java-symbol type="string" name="config_ethernet_iface_regex" /> + <java-symbol type="array" name="config_ethernet_interfaces" /> <java-symbol type="string" name="config_forceVoiceInteractionServicePackage" /> <java-symbol type="string" name="config_mms_user_agent" /> <java-symbol type="string" name="config_mms_user_agent_profile_url" /> @@ -767,9 +772,6 @@ <java-symbol type="string" name="kilobyteShort" /> <java-symbol type="string" name="last_month" /> <java-symbol type="string" name="launchBrowserDefault" /> - <java-symbol type="string" name="lock_to_app_toast" /> - <java-symbol type="string" name="lock_to_app_start" /> - <java-symbol type="string" name="lock_to_app_exit" /> <java-symbol type="string" name="lock_to_app_unlock_pin" /> <java-symbol type="string" name="lock_to_app_unlock_pattern" /> <java-symbol type="string" name="lock_to_app_unlock_password" /> @@ -2155,7 +2157,6 @@ <java-symbol type="string" name="config_mobile_hotspot_provision_response" /> <java-symbol type="integer" name="config_mobile_hotspot_provision_check_period" /> <java-symbol type="string" name="config_wifi_tether_enable" /> - <java-symbol type="integer" name="config_wifi_wakeup_available" /> <java-symbol type="bool" name="config_intrusiveNotificationLed" /> <java-symbol type="bool" name="config_notificationBadging" /> <java-symbol type="dimen" name="preference_fragment_padding_bottom" /> @@ -2354,6 +2355,8 @@ <java-symbol type="string" name="fingerprint_error_lockout_permanent" /> <java-symbol type="string" name="fingerprint_name_template" /> <java-symbol type="string" name="fingerprint_not_recognized" /> + <java-symbol type="string" name="fingerprint_error_no_fingerprints" /> + <java-symbol type="string" name="fingerprint_error_hw_not_present" /> <!-- Fingerprint config --> <java-symbol type="integer" name="config_fingerprintMaxTemplatesPerUser"/> @@ -2702,9 +2705,6 @@ <java-symbol type="string" name="language_selection_title" /> <java-symbol type="string" name="search_language_hint" /> - <java-symbol type="layout" name="unlaunchable_app_activity" /> - <java-symbol type="id" name="unlaunchable_app_title" /> - <java-symbol type="id" name="unlaunchable_app_message" /> <java-symbol type="string" name="work_mode_off_title" /> <java-symbol type="string" name="work_mode_off_message" /> <java-symbol type="string" name="work_mode_turn_on" /> @@ -3153,6 +3153,7 @@ <java-symbol type="integer" name="config_storageManagerDaystoRetainDefault" /> <java-symbol type="string" name="config_headlineFontFamily" /> <java-symbol type="string" name="config_headlineFontFamilyLight" /> + <java-symbol type="string" name="config_headlineFontFamilyMedium" /> <java-symbol type="drawable" name="stat_sys_vitals" /> diff --git a/core/res/res/xml/autofill_compat_accessibility_service.xml b/core/res/res/xml/autofill_compat_accessibility_service.xml new file mode 100644 index 000000000000..327afbee65c9 --- /dev/null +++ b/core/res/res/xml/autofill_compat_accessibility_service.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- + ~ Copyright (C) 2018 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 + --> + +<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" + android:accessibilityEventTypes="typeAllMask" + android:accessibilityFeedbackType="feedbackGeneric" + android:accessibilityFlags="flagReportViewIds" /> diff --git a/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java b/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java index 4f7c924b1914..5989da7af655 100644 --- a/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java +++ b/core/tests/benchmarks/src/android/os/FileUtilsBenchmark.java @@ -54,7 +54,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (FileInputStream in = new FileInputStream(mSrc); FileOutputStream out = new FileOutputStream(mDest)) { - copyInternalUserspace(in.getFD(), out.getFD(), null, null); + copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } @@ -63,7 +63,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (FileInputStream in = new FileInputStream(mSrc); FileOutputStream out = new FileOutputStream(mDest)) { - copyInternalSendfile(in.getFD(), out.getFD(), null, null); + copyInternalSendfile(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } @@ -72,7 +72,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (MemoryPipe in = MemoryPipe.createSource(mData); FileOutputStream out = new FileOutputStream(mDest)) { - copyInternalUserspace(in.getFD(), out.getFD(), null, null); + copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } @@ -81,7 +81,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (MemoryPipe in = MemoryPipe.createSource(mData); FileOutputStream out = new FileOutputStream(mDest)) { - copyInternalSplice(in.getFD(), out.getFD(), null, null); + copyInternalSplice(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } @@ -90,7 +90,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (FileInputStream in = new FileInputStream(mSrc); MemoryPipe out = MemoryPipe.createSink(mData)) { - copyInternalUserspace(in.getFD(), out.getFD(), null, null); + copyInternalUserspace(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } @@ -99,7 +99,7 @@ public class FileUtilsBenchmark { for (int i = 0; i < reps; i++) { try (FileInputStream in = new FileInputStream(mSrc); MemoryPipe out = MemoryPipe.createSink(mData)) { - copyInternalSplice(in.getFD(), out.getFD(), null, null); + copyInternalSplice(in.getFD(), out.getFD(), null, null, Long.MAX_VALUE); } } } diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index e4de5263bb7c..77aaa2d7f9ea 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -389,8 +389,8 @@ public class TransactionParcelTests { Bundle bundle, IInstrumentationWatcher iInstrumentationWatcher, IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1, boolean b2, boolean b3, Configuration configuration, - CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1) - throws RemoteException { + CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1, + boolean autofillCompatEnabled) throws RemoteException { } @Override diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java index 27b7f9e185bb..ea0347d67ad7 100644 --- a/core/tests/coretests/src/android/net/UriTest.java +++ b/core/tests/coretests/src/android/net/UriTest.java @@ -192,6 +192,12 @@ public class UriTest extends TestCase { assertEquals("a:a@example.com:a@example2.com", uri.getAuthority()); assertEquals("example2.com", uri.getHost()); assertEquals(-1, uri.getPort()); + assertEquals("/path", uri.getPath()); + + uri = Uri.parse("http://a.foo.com\\.example.com/path"); + assertEquals("a.foo.com", uri.getHost()); + assertEquals(-1, uri.getPort()); + assertEquals("\\.example.com/path", uri.getPath()); } @SmallTest diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java index b7220b312532..0bc3a2d879ab 100644 --- a/core/tests/coretests/src/android/os/FileUtilsTest.java +++ b/core/tests/coretests/src/android/os/FileUtilsTest.java @@ -181,6 +181,27 @@ public class FileUtilsTest { } @Test + public void testCopy_ShortPipeToFile() throws Exception { + byte[] source = new byte[33_000_000]; + new Random().nextBytes(source); + + for (int size : DATA_SIZES) { + final File dest = new File(mTarget, "dest"); + + byte[] expected = Arrays.copyOf(source, size); + byte[] actual = new byte[size]; + + try (MemoryPipe in = MemoryPipe.createSource(source); + FileOutputStream out = new FileOutputStream(dest)) { + FileUtils.copy(in.getFD(), out.getFD(), null, null, size); + } + + actual = readFile(dest); + assertArrayEquals(expected, actual); + } + } + + @Test public void testIsFilenameSafe() throws Exception { assertTrue(FileUtils.isFilenameSafe(new File("foobar"))); assertTrue(FileUtils.isFilenameSafe(new File("a_b-c=d.e/0,1+23"))); diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 0083b017033b..3e62183b01cd 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -115,6 +115,7 @@ public class SettingsBackupTest { Settings.Global.APP_STANDBY_ENABLED, Settings.Global.ASSISTED_GPS_ENABLED, Settings.Global.AUDIO_SAFE_VOLUME_STATE, + Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES, Settings.Global.BATTERY_DISCHARGE_DURATION_THRESHOLD, Settings.Global.BATTERY_DISCHARGE_THRESHOLD, Settings.Global.BATTERY_SAVER_DEVICE_SPECIFIC_CONSTANTS, @@ -385,6 +386,7 @@ public class SettingsBackupTest { Settings.Global.TZINFO_UPDATE_METADATA_URL, Settings.Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD, Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD, + Settings.Global.UID_CPUPOWER, Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD, Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD, Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD, @@ -436,7 +438,6 @@ public class SettingsBackupTest { Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS, Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED, Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, - Settings.Global.WIFI_WAKEUP_AVAILABLE, Settings.Global.WIFI_WATCHDOG_ON, Settings.Global.WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON, Settings.Global.WINDOW_ANIMATION_SCALE, diff --git a/core/tests/overlaytests/device/Android.mk b/core/tests/overlaytests/device/Android.mk new file mode 100644 index 000000000000..4ca3e4ce2389 --- /dev/null +++ b/core/tests/overlaytests/device/Android.mk @@ -0,0 +1,31 @@ +# Copyright (C) 2018 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := $(call all-java-files-under,src) +LOCAL_MODULE_TAGS := tests +LOCAL_PACKAGE_NAME := OverlayDeviceTests +LOCAL_STATIC_JAVA_LIBRARIES := android-support-test +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_TARGET_REQUIRED_MODULES := \ + OverlayDeviceTests_AppOverlayOne \ + OverlayDeviceTests_AppOverlayTwo \ + OverlayDeviceTests_FrameworkOverlay +include $(BUILD_PACKAGE) + +# Include to build test-apps. +include $(call all-makefiles-under,$(LOCAL_PATH)) + diff --git a/core/tests/overlaytests/device/AndroidManifest.xml b/core/tests/overlaytests/device/AndroidManifest.xml index e01caeedd862..d14fdf5ee819 100644 --- a/core/tests/overlaytests/device/AndroidManifest.xml +++ b/core/tests/overlaytests/device/AndroidManifest.xml @@ -15,15 +15,15 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.server.om.test"> + package="com.android.overlaytest"> <uses-sdk android:minSdkVersion="21" /> <application> - <uses-library android:name="android.test.runner" /> + <uses-library android:name="android.test.runner"/> </application> <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.server.om.test" /> - + android:targetPackage="com.android.overlaytest" + android:label="Runtime resource overlay tests" /> </manifest> diff --git a/core/tests/overlaytests/device/AndroidTest.xml b/core/tests/overlaytests/device/AndroidTest.xml new file mode 100644 index 000000000000..f06983559830 --- /dev/null +++ b/core/tests/overlaytests/device/AndroidTest.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<configuration description="Test module config for OverlayDeviceTests"> + <option name="test-tag" value="OverlayDeviceTests" /> + <option name="test-suite-tag" value="apct" /> + + <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> + <option name="test-file-name" value="OverlayDeviceTests.apk" /> + <option name="test-file-name" value="OverlayDeviceTests_AppOverlayOne.apk" /> + <option name="test-file-name" value="OverlayDeviceTests_AppOverlayTwo.apk" /> + <option name="test-file-name" value="OverlayDeviceTests_FrameworkOverlay.apk" /> + </target_preparer> + + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" + value="cmd overlay disable com.android.overlaytest.framework" /> + <option name="run-command" + value="cmd overlay disable com.android.overlaytest.app_overlay_one" /> + <option name="run-command" + value="cmd overlay disable com.android.overlaytest.app_overlay_two" /> + <option name="teardown-command" + value="cmd overlay disable com.android.overlaytest.framework" /> + <option name="teardown-command" + value="cmd overlay disable com.android.overlaytest.app_overlay_one" /> + <option name="teardown-command" + value="cmd overlay disable com.android.overlaytest.app_overlay_two" /> + </target_preparer> + + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.overlaytest" /> + <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" /> + </test> +</configuration> diff --git a/core/tests/overlaytests/device/OverlayAppFiltered/Android.mk b/core/tests/overlaytests/device/OverlayAppFiltered/Android.mk deleted file mode 100644 index f76de7a93b2e..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFiltered/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SDK_VERSION := system_current - -LOCAL_PACKAGE_NAME := com.android.overlaytest.filtered_app_overlay - -include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/OverlayAppFiltered/AndroidManifest.xml b/core/tests/overlaytests/device/OverlayAppFiltered/AndroidManifest.xml deleted file mode 100644 index 5b7950a25fbf..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFiltered/AndroidManifest.xml +++ /dev/null @@ -1,9 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.overlaytest.filtered_app_overlay" - android:versionCode="1" - android:versionName="1.0"> - <overlay android:targetPackage="com.android.overlaytest" - android:requiredSystemPropertyName="persist.oem.overlay.test" - android:requiredSystemPropertyValue="foo" - android:priority="3"/> -</manifest> diff --git a/core/tests/overlaytests/device/OverlayAppFiltered/res/raw/lorem_ipsum.txt b/core/tests/overlaytests/device/OverlayAppFiltered/res/raw/lorem_ipsum.txt deleted file mode 100644 index 0954cedeb5d5..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFiltered/res/raw/lorem_ipsum.txt +++ /dev/null @@ -1 +0,0 @@ -Lorem ipsum: filtered overlays. diff --git a/core/tests/overlaytests/device/OverlayAppFiltered/res/values/config.xml b/core/tests/overlaytests/device/OverlayAppFiltered/res/values/config.xml deleted file mode 100644 index 60b94eec5994..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFiltered/res/values/config.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="str">filtered</string> -</resources> diff --git a/core/tests/overlaytests/device/OverlayAppFiltered/res/xml/integer.xml b/core/tests/overlaytests/device/OverlayAppFiltered/res/xml/integer.xml deleted file mode 100644 index e2652b7e2915..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFiltered/res/xml/integer.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<integer value="3"/> diff --git a/core/tests/overlaytests/device/OverlayAppFirst/Android.mk b/core/tests/overlaytests/device/OverlayAppFirst/Android.mk deleted file mode 100644 index bf9416c279be..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFirst/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SDK_VERSION := current - -LOCAL_PACKAGE_NAME := com.android.overlaytest.first_app_overlay - -include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/OverlayAppFirst/AndroidManifest.xml b/core/tests/overlaytests/device/OverlayAppFirst/AndroidManifest.xml deleted file mode 100644 index ec10bbcf752e..000000000000 --- a/core/tests/overlaytests/device/OverlayAppFirst/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.overlaytest.first_app_overlay" - android:versionCode="1" - android:versionName="1.0"> - <overlay android:targetPackage="com.android.overlaytest" android:priority="1"/> -</manifest> diff --git a/core/tests/overlaytests/device/OverlayAppSecond/Android.mk b/core/tests/overlaytests/device/OverlayAppSecond/Android.mk deleted file mode 100644 index bb7d142d6809..000000000000 --- a/core/tests/overlaytests/device/OverlayAppSecond/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SDK_VERSION := current - -LOCAL_PACKAGE_NAME := com.android.overlaytest.second_app_overlay - -include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/OverlayAppSecond/AndroidManifest.xml b/core/tests/overlaytests/device/OverlayAppSecond/AndroidManifest.xml deleted file mode 100644 index ed498637b454..000000000000 --- a/core/tests/overlaytests/device/OverlayAppSecond/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.overlaytest.second_app_overlay" - android:versionCode="1" - android:versionName="1.0"> - <overlay android:targetPackage="com.android.overlaytest" android:priority="2"/> -</manifest> diff --git a/core/tests/overlaytests/device/OverlayTest/Android.mk b/core/tests/overlaytests/device/OverlayTest/Android.mk deleted file mode 100644 index 5fe7b917102e..000000000000 --- a/core/tests/overlaytests/device/OverlayTest/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_PACKAGE_NAME := OverlayTest - -LOCAL_DEX_PREOPT := false - -LOCAL_JAVA_LIBRARIES += android.test.base - -LOCAL_MODULE_PATH := $(TARGET_OUT)/app - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/OverlayTest/AndroidManifest.xml b/core/tests/overlaytests/device/OverlayTest/AndroidManifest.xml deleted file mode 100644 index 9edba12ffa8f..000000000000 --- a/core/tests/overlaytests/device/OverlayTest/AndroidManifest.xml +++ /dev/null @@ -1,10 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.overlaytest"> - <uses-permission android:name="android.permission.RUN_INSTRUMENTATION"/> - <application> - <uses-library android:name="android.test.runner"/> - </application> - <instrumentation android:name="android.test.InstrumentationTestRunner" - android:targetPackage="com.android.overlaytest" - android:label="Runtime resource overlay tests"/> -</manifest> diff --git a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithMultipleOverlaysTest.java b/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithMultipleOverlaysTest.java deleted file mode 100644 index e104f5a670c1..000000000000 --- a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithMultipleOverlaysTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.overlaytest; - -public class WithMultipleOverlaysTest extends OverlayBaseTest { - public WithMultipleOverlaysTest() { - mMode = MODE_MULTIPLE_OVERLAYS; - } -} diff --git a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithOverlayTest.java b/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithOverlayTest.java deleted file mode 100644 index 816a476e28cf..000000000000 --- a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithOverlayTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.overlaytest; - -public class WithOverlayTest extends OverlayBaseTest { - public WithOverlayTest() { - mMode = MODE_SINGLE_OVERLAY; - } -} diff --git a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithoutOverlayTest.java b/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithoutOverlayTest.java deleted file mode 100644 index 318cccc85461..000000000000 --- a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/WithoutOverlayTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.android.overlaytest; - -public class WithoutOverlayTest extends OverlayBaseTest { - public WithoutOverlayTest() { - mMode = MODE_NO_OVERLAY; - } -} diff --git a/core/tests/overlaytests/device/OverlayTestOverlay/Android.mk b/core/tests/overlaytests/device/OverlayTestOverlay/Android.mk deleted file mode 100644 index ed330467f68a..000000000000 --- a/core/tests/overlaytests/device/OverlayTestOverlay/Android.mk +++ /dev/null @@ -1,10 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_SDK_VERSION := current - -LOCAL_PACKAGE_NAME := com.android.overlaytest.overlay - -include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/OverlayTestOverlay/AndroidManifest.xml b/core/tests/overlaytests/device/OverlayTestOverlay/AndroidManifest.xml deleted file mode 100644 index f8b6c7b888b5..000000000000 --- a/core/tests/overlaytests/device/OverlayTestOverlay/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.overlaytest.overlay" - android:versionCode="1" - android:versionName="1.0"> - <overlay android:targetPackage="android" android:priority="1"/> -</manifest> diff --git a/core/tests/overlaytests/device/OverlayTest/res/drawable-nodpi/drawable.jpg b/core/tests/overlaytests/device/res/drawable-nodpi/drawable.jpg Binary files differindex a3f14f325b85..a3f14f325b85 100644 --- a/core/tests/overlaytests/device/OverlayTest/res/drawable-nodpi/drawable.jpg +++ b/core/tests/overlaytests/device/res/drawable-nodpi/drawable.jpg diff --git a/core/tests/overlaytests/device/OverlayTest/res/raw/lorem_ipsum.txt b/core/tests/overlaytests/device/res/raw/lorem_ipsum.txt index cee7a927c5fa..cee7a927c5fa 100644 --- a/core/tests/overlaytests/device/OverlayTest/res/raw/lorem_ipsum.txt +++ b/core/tests/overlaytests/device/res/raw/lorem_ipsum.txt diff --git a/core/tests/overlaytests/device/OverlayTest/res/values-sv/config.xml b/core/tests/overlaytests/device/res/values-sv/config.xml index 891853edb4c5..891853edb4c5 100644 --- a/core/tests/overlaytests/device/OverlayTest/res/values-sv/config.xml +++ b/core/tests/overlaytests/device/res/values-sv/config.xml diff --git a/core/tests/overlaytests/device/OverlayTest/res/values/config.xml b/core/tests/overlaytests/device/res/values/config.xml index c692a2625199..c692a2625199 100644 --- a/core/tests/overlaytests/device/OverlayTest/res/values/config.xml +++ b/core/tests/overlaytests/device/res/values/config.xml diff --git a/core/tests/overlaytests/device/OverlayTest/res/xml/integer.xml b/core/tests/overlaytests/device/res/xml/integer.xml index 9383daa20b6c..9383daa20b6c 100644 --- a/core/tests/overlaytests/device/OverlayTest/res/xml/integer.xml +++ b/core/tests/overlaytests/device/res/xml/integer.xml diff --git a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/OverlayBaseTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java index e57c55ced046..96ab977b799c 100644 --- a/core/tests/overlaytests/device/OverlayTest/src/com/android/overlaytest/OverlayBaseTest.java +++ b/core/tests/overlaytests/device/src/com/android/overlaytest/OverlayBaseTest.java @@ -1,45 +1,80 @@ +/* + * Copyright (C) 2018 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.overlaytest; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import android.app.UiAutomation; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.XmlResourceParser; -import android.test.AndroidTestCase; +import android.os.LocaleList; +import android.os.ParcelFileDescriptor; +import android.support.test.InstrumentationRegistry; import android.util.AttributeSet; import android.util.Xml; + +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.Locale; -public abstract class OverlayBaseTest extends AndroidTestCase { +@Ignore +public abstract class OverlayBaseTest { private Resources mResources; - protected int mMode; // will be set by subclasses - static final protected int MODE_NO_OVERLAY = 0; - static final protected int MODE_SINGLE_OVERLAY = 1; - static final protected int MODE_MULTIPLE_OVERLAYS = 2; + private final int mMode; + static final int MODE_NO_OVERLAY = 0; + static final int MODE_SINGLE_OVERLAY = 1; + static final int MODE_MULTIPLE_OVERLAYS = 2; + + static final String APP_OVERLAY_ONE_PKG = "com.android.overlaytest.app_overlay_one"; + static final String APP_OVERLAY_TWO_PKG = "com.android.overlaytest.app_overlay_two"; + static final String FRAMEWORK_OVERLAY_PKG = "com.android.overlaytest.framework"; + + protected OverlayBaseTest(int mode) { + mMode = mode; + } - protected void setUp() { - mResources = getContext().getResources(); + @Before + public void setUp() { + mResources = InstrumentationRegistry.getContext().getResources(); } private int calculateRawResourceChecksum(int resId) throws Throwable { - InputStream input = null; - try { - input = mResources.openRawResource(resId); + try (InputStream input = mResources.openRawResource(resId)) { int ch, checksum = 0; while ((ch = input.read()) != -1) { checksum = (checksum + ch) % 0xffddbb00; } return checksum; - } finally { - input.close(); } } private void setLocale(Locale locale) { - Locale.setDefault(locale); + final LocaleList locales = new LocaleList(locale); + LocaleList.setDefault(locales); Configuration config = new Configuration(); - config.locale = locale; + config.setLocales(locales); mResources.updateConfiguration(config, mResources.getDisplayMetrics()); } @@ -126,6 +161,7 @@ public abstract class OverlayBaseTest extends AndroidTestCase { } } + @Test public void testFrameworkBooleanOverlay() throws Throwable { // config_annoy_dianne has the value: // - true when no overlay exists (MODE_NO_OVERLAY) @@ -135,6 +171,7 @@ public abstract class OverlayBaseTest extends AndroidTestCase { assertResource(resId, true, false, false); } + @Test public void testBooleanOverlay() throws Throwable { // usually_false has the value: // - false when no overlay exists (MODE_NO_OVERLAY) @@ -144,12 +181,14 @@ public abstract class OverlayBaseTest extends AndroidTestCase { assertResource(resId, false, true, false); } + @Test public void testBoolean() throws Throwable { // always_true has no overlay final int resId = R.bool.always_true; assertResource(resId, true, true, true); } + @Test public void testIntegerArrayOverlay() throws Throwable { // fibonacci has values: // - eight first values of Fibonacci sequence, when no overlay exists (MODE_NO_OVERLAY) @@ -162,6 +201,7 @@ public abstract class OverlayBaseTest extends AndroidTestCase { new int[]{21, 13, 8, 5, 3, 2, 1, 1}); } + @Test public void testIntegerArray() throws Throwable { // prime_numbers has no overlay final int resId = R.array.prime_numbers; @@ -169,6 +209,7 @@ public abstract class OverlayBaseTest extends AndroidTestCase { assertResource(resId, expected, expected, expected); } + @Test public void testDrawable() throws Throwable { // drawable-nodpi/drawable has overlay (default config) final int resId = R.drawable.drawable; @@ -188,16 +229,19 @@ public abstract class OverlayBaseTest extends AndroidTestCase { assertEquals(expected, actual); } + @Test public void testAppString() throws Throwable { final int resId = R.string.str; assertResource(resId, "none", "single", "multiple"); } + @Test public void testApp2() throws Throwable { final int resId = R.string.str2; // only in base package and first app overlay assertResource(resId, "none", "single", "single"); } + @Test public void testAppXml() throws Throwable { int expected = getExpected(0, 1, 2); int actual = -1; @@ -214,6 +258,7 @@ public abstract class OverlayBaseTest extends AndroidTestCase { assertEquals(expected, actual); } + @Test public void testAppRaw() throws Throwable { final int resId = R.raw.lorem_ipsum; @@ -256,10 +301,10 @@ public abstract class OverlayBaseTest extends AndroidTestCase { * SLOT PACKAGE CONFIGURATION VALUE * A target package (default) 100 * B target package -sv 200 - * C OverlayAppFirst (default) 300 - * D OverlayAppFirst -sv 400 - * E OverlayAppSecond (default) 500 - * F OverlayAppSecond -sv 600 + * C AppOverlayOne (default) 300 + * D AppOverlayOne -sv 400 + * E AppOverlayTwo (default) 500 + * F AppOverlayTwo -sv 600 * * Example: in testMatrix101110, the base package defines the * R.integer.matrix101110 resource for the default configuration (value @@ -269,195 +314,283 @@ public abstract class OverlayBaseTest extends AndroidTestCase { * are loaded, the expected value after setting the language to Swedish is * 400. */ + @Test public void testMatrix100000() throws Throwable { final int resId = R.integer.matrix_100000; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 100); } + @Test public void testMatrix100001() throws Throwable { final int resId = R.integer.matrix_100001; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 600); } + @Test public void testMatrix100010() throws Throwable { final int resId = R.integer.matrix_100010; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 500); } + @Test public void testMatrix100011() throws Throwable { final int resId = R.integer.matrix_100011; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 100, 600); } + @Test public void testMatrix100100() throws Throwable { final int resId = R.integer.matrix_100100; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } + @Test public void testMatrix100101() throws Throwable { final int resId = R.integer.matrix_100101; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } + @Test public void testMatrix100110() throws Throwable { final int resId = R.integer.matrix_100110; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } + @Test public void testMatrix100111() throws Throwable { final int resId = R.integer.matrix_100111; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } + @Test public void testMatrix101000() throws Throwable { final int resId = R.integer.matrix_101000; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 300); } + @Test public void testMatrix101001() throws Throwable { final int resId = R.integer.matrix_101001; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 600); } + @Test public void testMatrix101010() throws Throwable { final int resId = R.integer.matrix_101010; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 500); } + @Test public void testMatrix101011() throws Throwable { final int resId = R.integer.matrix_101011; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 300, 600); } + @Test public void testMatrix101100() throws Throwable { final int resId = R.integer.matrix_101100; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } + @Test public void testMatrix101101() throws Throwable { final int resId = R.integer.matrix_101101; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } + @Test public void testMatrix101110() throws Throwable { final int resId = R.integer.matrix_101110; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 400); } + @Test public void testMatrix101111() throws Throwable { final int resId = R.integer.matrix_101111; setLocale(new Locale("sv", "SE")); assertResource(resId, 100, 400, 600); } + @Test public void testMatrix110000() throws Throwable { final int resId = R.integer.matrix_110000; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } + @Test public void testMatrix110001() throws Throwable { final int resId = R.integer.matrix_110001; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } + @Test public void testMatrix110010() throws Throwable { final int resId = R.integer.matrix_110010; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } + @Test public void testMatrix110011() throws Throwable { final int resId = R.integer.matrix_110011; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } + @Test public void testMatrix110100() throws Throwable { final int resId = R.integer.matrix_110100; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } + @Test public void testMatrix110101() throws Throwable { final int resId = R.integer.matrix_110101; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } + @Test public void testMatrix110110() throws Throwable { final int resId = R.integer.matrix_110110; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } + @Test public void testMatrix110111() throws Throwable { final int resId = R.integer.matrix_110111; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } + @Test public void testMatrix111000() throws Throwable { final int resId = R.integer.matrix_111000; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } + @Test public void testMatrix111001() throws Throwable { final int resId = R.integer.matrix_111001; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } + @Test public void testMatrix111010() throws Throwable { final int resId = R.integer.matrix_111010; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 200); } + @Test public void testMatrix111011() throws Throwable { final int resId = R.integer.matrix_111011; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 200, 600); } + @Test public void testMatrix111100() throws Throwable { final int resId = R.integer.matrix_111100; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } + @Test public void testMatrix111101() throws Throwable { final int resId = R.integer.matrix_111101; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } + @Test public void testMatrix111110() throws Throwable { final int resId = R.integer.matrix_111110; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 400); } + @Test public void testMatrix111111() throws Throwable { final int resId = R.integer.matrix_111111; setLocale(new Locale("sv", "SE")); assertResource(resId, 200, 400, 600); } + + /** + * Executes the shell command and reads all the output to ensure the command ran and didn't + * get stuck buffering on output. + */ + protected static String executeShellCommand(UiAutomation automation, String command) + throws Exception { + final ParcelFileDescriptor pfd = automation.executeShellCommand(command); + try (InputStream in = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) { + final BufferedReader reader = new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8)); + StringBuilder str = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + str.append(line); + } + return str.toString(); + } + } + + /** + * Enables overlay packages and waits for a configuration change event before + * returning, to guarantee that Resources are up-to-date. + * @param packages the list of package names to enable. + */ + protected static void enableOverlayPackages(String... packages) throws Exception { + enableOverlayPackages(true, packages); + } + + /** + * Disables overlay packages and waits for a configuration change event before + * returning, to guarantee that Resources are up-to-date. + * @param packages the list of package names to disable. + */ + protected static void disableOverlayPackages(String... packages) throws Exception { + enableOverlayPackages(false, packages); + } + + /** + * Enables/disables overlay packages and waits for a configuration change event before + * returning, to guarantee that Resources are up-to-date. + * @param enable enables the overlays when true, disables when false. + * @param packages the list of package names to enable/disable. + */ + private static void enableOverlayPackages(boolean enable, String[] packages) + throws Exception { + final UiAutomation uiAutomation = InstrumentationRegistry.getInstrumentation() + .getUiAutomation(); + for (final String pkg : packages) { + executeShellCommand(uiAutomation, + "cmd overlay " + (enable ? "enable " : "disable ") + pkg); + } + + // Wait for the overlay change to propagate. + Thread.sleep(1000); + } } diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java new file mode 100644 index 000000000000..f35e511cdcf4 --- /dev/null +++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithMultipleOverlaysTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 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.overlaytest; + +import android.support.test.filters.MediumTest; + +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@MediumTest +public class WithMultipleOverlaysTest extends OverlayBaseTest { + public WithMultipleOverlaysTest() { + super(MODE_MULTIPLE_OVERLAYS); + } + + @BeforeClass + public static void enableOverlay() throws Exception { + enableOverlayPackages(APP_OVERLAY_ONE_PKG, APP_OVERLAY_TWO_PKG, FRAMEWORK_OVERLAY_PKG); + } +} diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java new file mode 100644 index 000000000000..037449fc2c05 --- /dev/null +++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithOverlayTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2018 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.overlaytest; + +import android.support.test.filters.MediumTest; + +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@MediumTest +public class WithOverlayTest extends OverlayBaseTest { + public WithOverlayTest() { + super(MODE_SINGLE_OVERLAY); + } + + @BeforeClass + public static void enableOverlay() throws Exception { + disableOverlayPackages(APP_OVERLAY_TWO_PKG); + enableOverlayPackages(APP_OVERLAY_ONE_PKG, FRAMEWORK_OVERLAY_PKG); + } +} diff --git a/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java b/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java new file mode 100644 index 000000000000..f657b5cef0e5 --- /dev/null +++ b/core/tests/overlaytests/device/src/com/android/overlaytest/WithoutOverlayTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2018 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.overlaytest; + +import android.support.test.filters.MediumTest; + +import org.junit.BeforeClass; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@MediumTest +public class WithoutOverlayTest extends OverlayBaseTest { + public WithoutOverlayTest() { + super(MODE_NO_OVERLAY); + } + + @BeforeClass + public static void disableOverlays() throws Exception { + disableOverlayPackages(APP_OVERLAY_ONE_PKG, APP_OVERLAY_TWO_PKG, FRAMEWORK_OVERLAY_PKG); + } +} diff --git a/core/tests/overlaytests/device/test-apps/Android.mk b/core/tests/overlaytests/device/test-apps/Android.mk new file mode 100644 index 000000000000..9af9f444ca59 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/Android.mk @@ -0,0 +1,15 @@ +# Copyright (C) 2018 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 $(call all-subdir-makefiles) diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk new file mode 100644 index 000000000000..17e20eeeda85 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2018 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE_TAGS := tests +LOCAL_PACKAGE_NAME := OverlayDeviceTests_AppOverlayOne +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_CERTIFICATE := platform +include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayOne/AndroidManifest.xml b/core/tests/overlaytests/device/test-apps/AppOverlayOne/AndroidManifest.xml new file mode 100644 index 000000000000..17191589e3f2 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.overlaytest.app_overlay_one" + android:versionCode="1" + android:versionName="1.0"> + <overlay android:targetPackage="com.android.overlaytest" android:priority="1" /> +</manifest> diff --git a/core/tests/overlaytests/device/OverlayAppFirst/res/drawable-nodpi/drawable.jpg b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/drawable-nodpi/drawable.jpg Binary files differindex 0d944d02d633..0d944d02d633 100644 --- a/core/tests/overlaytests/device/OverlayAppFirst/res/drawable-nodpi/drawable.jpg +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/drawable-nodpi/drawable.jpg diff --git a/core/tests/overlaytests/device/OverlayAppFirst/res/raw/lorem_ipsum.txt b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/raw/lorem_ipsum.txt index 756b0a3fc532..756b0a3fc532 100644 --- a/core/tests/overlaytests/device/OverlayAppFirst/res/raw/lorem_ipsum.txt +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/raw/lorem_ipsum.txt diff --git a/core/tests/overlaytests/device/OverlayAppFirst/res/values-sv/config.xml b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/values-sv/config.xml index 9cdc73e27ade..9cdc73e27ade 100644 --- a/core/tests/overlaytests/device/OverlayAppFirst/res/values-sv/config.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/values-sv/config.xml diff --git a/core/tests/overlaytests/device/OverlayAppFirst/res/values/config.xml b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/values/config.xml index 972137a3d1bf..972137a3d1bf 100644 --- a/core/tests/overlaytests/device/OverlayAppFirst/res/values/config.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/values/config.xml diff --git a/core/tests/overlaytests/device/OverlayAppFirst/res/xml/integer.xml b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/xml/integer.xml index 7f628d9125f3..7f628d9125f3 100644 --- a/core/tests/overlaytests/device/OverlayAppFirst/res/xml/integer.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayOne/res/xml/integer.xml diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk new file mode 100644 index 000000000000..c24bea9e06e9 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2018 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE_TAGS := tests +LOCAL_PACKAGE_NAME := OverlayDeviceTests_AppOverlayTwo +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_CERTIFICATE := platform +include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/test-apps/AppOverlayTwo/AndroidManifest.xml b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/AndroidManifest.xml new file mode 100644 index 000000000000..ae8307c446c1 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.overlaytest.app_overlay_two" + android:versionCode="1" + android:versionName="1.0"> + <overlay android:targetPackage="com.android.overlaytest" android:priority="2" /> +</manifest> diff --git a/core/tests/overlaytests/device/OverlayAppSecond/res/raw/lorem_ipsum.txt b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/raw/lorem_ipsum.txt index 613f5b63c66c..613f5b63c66c 100644 --- a/core/tests/overlaytests/device/OverlayAppSecond/res/raw/lorem_ipsum.txt +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/raw/lorem_ipsum.txt diff --git a/core/tests/overlaytests/device/OverlayAppSecond/res/values-sv/config.xml b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/values-sv/config.xml index ec4b6c03e5ff..ec4b6c03e5ff 100644 --- a/core/tests/overlaytests/device/OverlayAppSecond/res/values-sv/config.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/values-sv/config.xml diff --git a/core/tests/overlaytests/device/OverlayAppSecond/res/values/config.xml b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/values/config.xml index 8b072160ffba..8b072160ffba 100644 --- a/core/tests/overlaytests/device/OverlayAppSecond/res/values/config.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/values/config.xml diff --git a/core/tests/overlaytests/device/OverlayAppSecond/res/xml/integer.xml b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/xml/integer.xml index f3370a6b8bcf..f3370a6b8bcf 100644 --- a/core/tests/overlaytests/device/OverlayAppSecond/res/xml/integer.xml +++ b/core/tests/overlaytests/device/test-apps/AppOverlayTwo/res/xml/integer.xml diff --git a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk new file mode 100644 index 000000000000..dc811c51e926 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2018 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE_TAGS := tests +LOCAL_PACKAGE_NAME := OverlayDeviceTests_FrameworkOverlay +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_CERTIFICATE := platform +include $(BUILD_PACKAGE) diff --git a/core/tests/overlaytests/device/test-apps/FrameworkOverlay/AndroidManifest.xml b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/AndroidManifest.xml new file mode 100644 index 000000000000..77ea16afff83 --- /dev/null +++ b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/AndroidManifest.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.overlaytest.framework" + android:versionCode="1" + android:versionName="1.0"> + <overlay android:targetPackage="android" android:priority="1" /> +</manifest> diff --git a/core/tests/overlaytests/device/OverlayTestOverlay/res/values/config.xml b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/res/values/config.xml index c1e3de12059a..c1e3de12059a 100644 --- a/core/tests/overlaytests/device/OverlayTestOverlay/res/values/config.xml +++ b/core/tests/overlaytests/device/test-apps/FrameworkOverlay/res/values/config.xml diff --git a/core/tests/overlaytests/host/test-apps/SignatureOverlay/AndroidManifest.xml b/core/tests/overlaytests/host/test-apps/SignatureOverlay/AndroidManifest.xml index 2d6843948f29..b08ac96aca68 100644 --- a/core/tests/overlaytests/host/test-apps/SignatureOverlay/AndroidManifest.xml +++ b/core/tests/overlaytests/host/test-apps/SignatureOverlay/AndroidManifest.xml @@ -15,6 +15,6 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.server.om.hosttest.signature_overlay"> + package="com.android.server.om.hosttest.signature_overlay"> <overlay android:targetPackage="android" /> </manifest> diff --git a/core/tests/overlaytests/testrunner.py b/core/tests/overlaytests/testrunner.py deleted file mode 100755 index e88805e8cbf1..000000000000 --- a/core/tests/overlaytests/testrunner.py +++ /dev/null @@ -1,732 +0,0 @@ -#!/usr/bin/python -import hashlib -import optparse -import os -import re -import shlex -import subprocess -import sys -import threading -import time - -TASK_COMPILATION = 'compile' -TASK_DISABLE_OVERLAYS = 'disable overlays' -TASK_ENABLE_MULTIPLE_OVERLAYS = 'enable multiple overlays' -TASK_ENABLE_SINGLE_OVERLAY = 'enable single overlay' -TASK_ENABLE_FILTERED_OVERLAYS = 'enable filtered overlays' -TASK_FILE_EXISTS_TEST = 'test (file exists)' -TASK_GREP_IDMAP_TEST = 'test (grep idmap)' -TASK_MD5_TEST = 'test (md5)' -TASK_IDMAP_PATH = 'idmap --path' -TASK_IDMAP_SCAN = 'idmap --scan' -TASK_INSTRUMENTATION = 'instrumentation' -TASK_INSTRUMENTATION_TEST = 'test (instrumentation)' -TASK_MKDIR = 'mkdir' -TASK_PUSH = 'push' -TASK_ROOT = 'root' -TASK_REMOUNT = 'remount' -TASK_RM = 'rm' -TASK_SETPROP = 'setprop' -TASK_SETUP_IDMAP_PATH = 'setup idmap --path' -TASK_SETUP_IDMAP_SCAN = 'setup idmap --scan' -TASK_START = 'start' -TASK_STOP = 'stop' - -adb = 'adb' - -def _adb_shell(cmd): - argv = shlex.split(adb + " shell '" + cmd + "; echo $?'") - proc = subprocess.Popen(argv, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - (stdout, stderr) = (stdout.replace('\r', ''), stderr.replace('\r', '')) - tmp = stdout.rsplit('\n', 2) - if len(tmp) == 2: - stdout == '' - returncode = int(tmp[0]) - else: - stdout = tmp[0] + '\n' - returncode = int(tmp[1]) - return returncode, stdout, stderr - -class VerbosePrinter: - class Ticker(threading.Thread): - def _print(self): - s = '\r' + self.text + '[' + '.' * self.i + ' ' * (4 - self.i) + ']' - sys.stdout.write(s) - sys.stdout.flush() - self.i = (self.i + 1) % 5 - - def __init__(self, cond_var, text): - threading.Thread.__init__(self) - self.text = text - self.setDaemon(True) - self.cond_var = cond_var - self.running = False - self.i = 0 - self._print() - self.running = True - - def run(self): - self.cond_var.acquire() - while True: - self.cond_var.wait(0.25) - running = self.running - if not running: - break - self._print() - self.cond_var.release() - - def stop(self): - self.cond_var.acquire() - self.running = False - self.cond_var.notify_all() - self.cond_var.release() - - def _start_ticker(self): - self.ticker = VerbosePrinter.Ticker(self.cond_var, self.text) - self.ticker.start() - - def _stop_ticker(self): - self.ticker.stop() - self.ticker.join() - self.ticker = None - - def _format_begin(self, type, name): - N = self.width - len(type) - len(' [ ] ') - fmt = '%%s %%-%ds ' % N - return fmt % (type, name) - - def __init__(self, use_color): - self.cond_var = threading.Condition() - self.ticker = None - if use_color: - self.color_RED = '\033[1;31m' - self.color_red = '\033[0;31m' - self.color_reset = '\033[0;37m' - else: - self.color_RED = '' - self.color_red = '' - self.color_reset = '' - - argv = shlex.split('stty size') # get terminal width - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - if proc.returncode == 0: - (h, w) = stdout.split() - self.width = int(w) - else: - self.width = 72 # conservative guesstimate - - def begin(self, type, name): - self.text = self._format_begin(type, name) - sys.stdout.write(self.text + '[ ]') - sys.stdout.flush() - self._start_ticker() - - def end_pass(self, type, name): - self._stop_ticker() - sys.stdout.write('\r' + self.text + '[ OK ]\n') - sys.stdout.flush() - - def end_fail(self, type, name, msg): - self._stop_ticker() - sys.stdout.write('\r' + self.color_RED + self.text + '[FAIL]\n') - sys.stdout.write(self.color_red) - sys.stdout.write(msg) - sys.stdout.write(self.color_reset) - sys.stdout.flush() - -class QuietPrinter: - def begin(self, type, name): - pass - - def end_pass(self, type, name): - sys.stdout.write('PASS ' + type + ' ' + name + '\n') - sys.stdout.flush() - - def end_fail(self, type, name, msg): - sys.stdout.write('FAIL ' + type + ' ' + name + '\n') - sys.stdout.flush() - -class CompilationTask: - def __init__(self, makefile): - self.makefile = makefile - - def get_type(self): - return TASK_COMPILATION - - def get_name(self): - return self.makefile - - def execute(self): - os.putenv('ONE_SHOT_MAKEFILE', os.getcwd() + "/" + self.makefile) - argv = shlex.split('make -C "../../../../../" files') - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - return proc.returncode, stdout, stderr - -class InstrumentationTask: - def __init__(self, instrumentation_class): - self.instrumentation_class = instrumentation_class - - def get_type(self): - return TASK_INSTRUMENTATION - - def get_name(self): - return self.instrumentation_class - - def execute(self): - return _adb_shell('am instrument -r -w -e class %s com.android.overlaytest/android.test.InstrumentationTestRunner' % self.instrumentation_class) - -class PushTask: - def __init__(self, src, dest): - self.src = src - self.dest = dest - - def get_type(self): - return TASK_PUSH - - def get_name(self): - return "%s -> %s" % (self.src, self.dest) - - def execute(self): - src = os.getenv('OUT') - if (src is None): - return 1, "", "Unable to proceed - $OUT environment var not set\n" - src += "/" + self.src - argv = shlex.split(adb + ' push %s %s' % (src, self.dest)) - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - return proc.returncode, stdout, stderr - -class MkdirTask: - def __init__(self, path): - self.path = path - - def get_type(self): - return TASK_MKDIR - - def get_name(self): - return self.path - - def execute(self): - return _adb_shell('mkdir -p %s' % self.path) - -class RmTask: - def __init__(self, path): - self.path = path - - def get_type(self): - return TASK_RM - - def get_name(self): - return self.path - - def execute(self): - returncode, stdout, stderr = _adb_shell('ls %s' % self.path) - if returncode != 0 and stderr.endswith(': No such file or directory\n'): - return 0, "", "" - return _adb_shell('rm -r %s' % self.path) - -class SetPropTask: - def __init__(self, prop, value): - self.prop = prop - self.value = value - - def get_type(self): - return TASK_SETPROP - - def get_name(self): - return self.prop - - def execute(self): - return _adb_shell('setprop %s %s' % (self.prop, self.value)) - -class IdmapPathTask: - def __init__(self, path_target_apk, path_overlay_apk, path_idmap): - self.path_target_apk = path_target_apk - self.path_overlay_apk = path_overlay_apk - self.path_idmap = path_idmap - - def get_type(self): - return TASK_IDMAP_PATH - - def get_name(self): - return self.path_idmap - - def execute(self): - return _adb_shell('su system idmap --scan "%s" "%s" "%s" "%s"' % (self.target_pkg_name, self.target_pkg, self.idmap_dir, self.overlay_dir)) - -class IdmapScanTask: - def __init__(self, overlay_dir, target_pkg_name, target_pkg, idmap_dir, symlink_dir): - self.overlay_dir = overlay_dir - self.target_pkg_name = target_pkg_name - self.target_pkg = target_pkg - self.idmap_dir = idmap_dir - self.symlink_dir = symlink_dir - - def get_type(self): - return TASK_IDMAP_SCAN - - def get_name(self): - return self.target_pkg_name - - def execute(self): - return _adb_shell('su system idmap --scan "%s" "%s" "%s" "%s"' % (self.overlay_dir, self.target_pkg_name, self.target_pkg, self.idmap_dir)) - -class FileExistsTest: - def __init__(self, path): - self.path = path - - def get_type(self): - return TASK_FILE_EXISTS_TEST - - def get_name(self): - return self.path - - def execute(self): - return _adb_shell('ls %s' % self.path) - -class GrepIdmapTest: - def __init__(self, path_idmap, pattern, expected_n): - self.path_idmap = path_idmap - self.pattern = pattern - self.expected_n = expected_n - - def get_type(self): - return TASK_GREP_IDMAP_TEST - - def get_name(self): - return self.pattern - - def execute(self): - returncode, stdout, stderr = _adb_shell('idmap --inspect %s' % self.path_idmap) - if returncode != 0: - return returncode, stdout, stderr - all_matches = re.findall('\s' + self.pattern + '$', stdout, flags=re.MULTILINE) - if len(all_matches) != self.expected_n: - return 1, 'pattern=%s idmap=%s expected=%d found=%d\n' % (self.pattern, self.path_idmap, self.expected_n, len(all_matches)), '' - return 0, "", "" - -class Md5Test: - def __init__(self, path, expected_content): - self.path = path - self.expected_md5 = hashlib.md5(expected_content).hexdigest() - - def get_type(self): - return TASK_MD5_TEST - - def get_name(self): - return self.path - - def execute(self): - returncode, stdout, stderr = _adb_shell('md5sum %s' % self.path) - if returncode != 0: - return returncode, stdout, stderr - actual_md5 = stdout.split()[0] - if actual_md5 != self.expected_md5: - return 1, 'expected %s, got %s\n' % (self.expected_md5, actual_md5), '' - return 0, "", "" - -class StartTask: - def get_type(self): - return TASK_START - - def get_name(self): - return "" - - def execute(self): - (returncode, stdout, stderr) = _adb_shell('start') - if returncode != 0: - return returncode, stdout, stderr - - while True: - (returncode, stdout, stderr) = _adb_shell('getprop dev.bootcomplete') - if returncode != 0: - return returncode, stdout, stderr - if stdout.strip() == "1": - break - time.sleep(0.5) - - return 0, "", "" - -class StopTask: - def get_type(self): - return TASK_STOP - - def get_name(self): - return "" - - def execute(self): - (returncode, stdout, stderr) = _adb_shell('stop') - if returncode != 0: - return returncode, stdout, stderr - return _adb_shell('setprop dev.bootcomplete 0') - -class RootTask: - def get_type(self): - return TASK_ROOT - - def get_name(self): - return "" - - def execute(self): - (returncode, stdout, stderr) = _adb_shell('getprop service.adb.root 0') - if returncode != 0: - return returncode, stdout, stderr - if stdout.strip() == '1': # already root - return 0, "", "" - - argv = shlex.split(adb + ' root') - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - if proc.returncode != 0: - return proc.returncode, stdout, stderr - - argv = shlex.split(adb + ' wait-for-device') - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - return proc.returncode, stdout, stderr - -class RemountTask: - def get_type(self): - return TASK_REMOUNT - - def get_name(self): - return "" - - def execute(self): - argv = shlex.split(adb + ' remount') - proc = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - # adb remount returns 0 even if the operation failed, so check stdout - if stdout.startswith('remount failed:'): - return 1, stdout, stderr - return proc.returncode, stdout, stderr - -class CompoundTask: - def __init__(self, type, tasks): - self.type = type - self.tasks = tasks - - def get_type(self): - return self.type - - def get_name(self): - return "" - - def execute(self): - for t in self.tasks: - (returncode, stdout, stderr) = t.execute() - if returncode != 0: - return returncode, stdout, stderr - return 0, "", "" - -def _create_disable_overlays_task(): - tasks = [ - RmTask("/vendor/overlay/framework_a.apk"), - RmTask("/vendor/overlay/framework_b.apk"), - RmTask("/data/resource-cache/vendor@overlay@framework_a.apk@idmap"), - RmTask("/data/resource-cache/vendor@overlay@framework_b.apk@idmap"), - RmTask("/vendor/overlay/app_a.apk"), - RmTask("/vendor/overlay/app_b.apk"), - RmTask("/vendor/overlay/app_c.apk"), - RmTask("/data/resource-cache/vendor@overlay@app_a.apk@idmap"), - RmTask("/data/resource-cache/vendor@overlay@app_b.apk@idmap"), - RmTask("/data/resource-cache/vendor@overlay@app_c.apk@idmap"), - SetPropTask('persist.oem.overlay.test', '""'), - RmTask("/data/property/persist.oem.overlay.test"), - ] - return CompoundTask(TASK_DISABLE_OVERLAYS, tasks) - -def _create_enable_single_overlay_task(): - tasks = [ - _create_disable_overlays_task(), - MkdirTask('/system/vendor'), - MkdirTask('/vendor/overlay'), - PushTask('/data/app/com.android.overlaytest.overlay/com.android.overlaytest.overlay.apk', '/vendor/overlay/framework_a.apk'), - PushTask('/data/app/com.android.overlaytest.first_app_overlay/com.android.overlaytest.first_app_overlay.apk', '/vendor/overlay/app_a.apk'), - ] - return CompoundTask(TASK_ENABLE_SINGLE_OVERLAY, tasks) - -def _create_enable_multiple_overlays_task(): - tasks = [ - _create_disable_overlays_task(), - MkdirTask('/system/vendor'), - MkdirTask('/vendor/overlay'), - - PushTask('/data/app/com.android.overlaytest.overlay/com.android.overlaytest.overlay.apk', '/vendor/overlay/framework_b.apk'), - PushTask('/data/app/com.android.overlaytest.first_app_overlay/com.android.overlaytest.first_app_overlay.apk', '/vendor/overlay/app_a.apk'), - PushTask('/data/app/com.android.overlaytest.second_app_overlay/com.android.overlaytest.second_app_overlay.apk', '/vendor/overlay/app_b.apk'), - PushTask('/data/app/com.android.overlaytest.filtered_app_overlay/com.android.overlaytest.filtered_app_overlay.apk', '/vendor/overlay/app_c.apk'), - ] - return CompoundTask(TASK_ENABLE_MULTIPLE_OVERLAYS, tasks) - -def _create_enable_filtered_overlays_task(): - tasks = [ - _create_disable_overlays_task(), - SetPropTask('persist.oem.overlay.test', 'foo'), - MkdirTask('/system/vendor'), - MkdirTask('/vendor/overlay'), - PushTask('/data/app/com.android.overlaytest.overlay/com.android.overlaytest.overlay.apk', '/vendor/overlay/framework_b.apk'), - PushTask('/data/app/com.android.overlaytest.first_app_overlay/com.android.overlaytest.first_app_overlay.apk', '/vendor/overlay/app_a.apk'), - PushTask('/data/app/com.android.overlaytest.second_app_overlay/com.android.overlaytest.second_app_overlay.apk', '/vendor/overlay/app_b.apk'), - PushTask('/data/app/com.android.overlaytest.filtered_app_overlay/com.android.overlaytest.filtered_app_overlay.apk', '/vendor/overlay/app_c.apk'), - ] - return CompoundTask(TASK_ENABLE_FILTERED_OVERLAYS, tasks) - -def _create_setup_idmap_path_task(idmaps, symlinks): - tasks = [ - _create_enable_single_overlay_task(), - RmTask(symlinks), - RmTask(idmaps), - MkdirTask(idmaps), - MkdirTask(symlinks), - ] - return CompoundTask(TASK_SETUP_IDMAP_PATH, tasks) - -def _create_setup_idmap_scan_task(idmaps, symlinks): - tasks = [ - _create_enable_filtered_overlays_task(), - RmTask(symlinks), - RmTask(idmaps), - MkdirTask(idmaps), - MkdirTask(symlinks), - ] - return CompoundTask(TASK_SETUP_IDMAP_SCAN, tasks) - -def _handle_instrumentation_task_output(stdout, printer): - regex_status_code = re.compile(r'^INSTRUMENTATION_STATUS_CODE: -?(\d+)') - regex_name = re.compile(r'^INSTRUMENTATION_STATUS: test=(.*)') - regex_begin_stack = re.compile(r'^INSTRUMENTATION_STATUS: stack=(.*)') - regex_end_stack = re.compile(r'^$') - - failed_tests = 0 - current_test = None - current_stack = [] - mode_stack = False - for line in stdout.split("\n"): - line = line.rstrip() # strip \r from adb output - m = regex_status_code.match(line) - if m: - c = int(m.group(1)) - if c == 1: - printer.begin(TASK_INSTRUMENTATION_TEST, current_test) - elif c == 0: - printer.end_pass(TASK_INSTRUMENTATION_TEST, current_test) - else: - failed_tests += 1 - current_stack.append("\n") - msg = "\n".join(current_stack) - printer.end_fail(TASK_INSTRUMENTATION_TEST, current_test, msg.rstrip() + '\n') - continue - - m = regex_name.match(line) - if m: - current_test = m.group(1) - continue - - m = regex_begin_stack.match(line) - if m: - mode_stack = True - current_stack = [] - current_stack.append(" " + m.group(1)) - continue - - m = regex_end_stack.match(line) - if m: - mode_stack = False - continue - - if mode_stack: - current_stack.append(" " + line.strip()) - - return failed_tests - -def _set_adb_device(option, opt, value, parser): - global adb - if opt == '-d' or opt == '--device': - adb = 'adb -d' - if opt == '-e' or opt == '--emulator': - adb = 'adb -e' - if opt == '-s' or opt == '--serial': - adb = 'adb -s ' + value - -def _create_opt_parser(): - parser = optparse.OptionParser() - parser.add_option('-d', '--device', action='callback', callback=_set_adb_device, - help='pass -d to adb') - parser.add_option('-e', '--emulator', action='callback', callback=_set_adb_device, - help='pass -e to adb') - parser.add_option('-s', '--serial', type="str", action='callback', callback=_set_adb_device, - help='pass -s <serical> to adb') - parser.add_option('-C', '--no-color', action='store_false', - dest='use_color', default=True, - help='disable color escape sequences in output') - parser.add_option('-q', '--quiet', action='store_true', - dest='quiet_mode', default=False, - help='quiet mode, output only results') - parser.add_option('-b', '--no-build', action='store_false', - dest='do_build', default=True, - help='do not rebuild test projects') - parser.add_option('-k', '--continue', action='store_true', - dest='do_continue', default=False, - help='do not rebuild test projects') - parser.add_option('-i', '--test-idmap', action='store_true', - dest='test_idmap', default=False, - help='run tests for idmap') - parser.add_option('-0', '--test-no-overlay', action='store_true', - dest='test_no_overlay', default=False, - help='run tests without any overlay') - parser.add_option('-1', '--test-single-overlay', action='store_true', - dest='test_single_overlay', default=False, - help='run tests for single overlay') - parser.add_option('-2', '--test-multiple-overlays', action='store_true', - dest='test_multiple_overlays', default=False, - help='run tests for multiple overlays') - parser.add_option('-3', '--test-filtered-overlays', action='store_true', - dest='test_filtered_overlays', default=False, - help='run tests for filtered (sys prop) overlays') - return parser - -if __name__ == '__main__': - opt_parser = _create_opt_parser() - opts, args = opt_parser.parse_args(sys.argv[1:]) - if not opts.test_idmap and not opts.test_no_overlay and not opts.test_single_overlay and not opts.test_multiple_overlays and not opts.test_filtered_overlays: - opts.test_idmap = True - opts.test_no_overlay = True - opts.test_single_overlay = True - opts.test_multiple_overlays = True - opts.test_filtered_overlays = True - - if len(args) > 0: - opt_parser.error("unexpected arguments: %s" % " ".join(args)) - # will never reach this: opt_parser.error will call sys.exit - - if opts.quiet_mode: - printer = QuietPrinter() - else: - printer = VerbosePrinter(opts.use_color) - tasks = [] - - # must be in the same directory as this script for compilation tasks to work - script = sys.argv[0] - dirname = os.path.dirname(script) - wd = os.path.realpath(dirname) - os.chdir(wd) - - # build test cases - if opts.do_build: - tasks.append(CompilationTask('OverlayTest/Android.mk')) - tasks.append(CompilationTask('OverlayTestOverlay/Android.mk')) - tasks.append(CompilationTask('OverlayAppFirst/Android.mk')) - tasks.append(CompilationTask('OverlayAppSecond/Android.mk')) - tasks.append(CompilationTask('OverlayAppFiltered/Android.mk')) - - # remount filesystem, install test project - tasks.append(RootTask()) - tasks.append(RemountTask()) - tasks.append(PushTask('/system/app/OverlayTest/OverlayTest.apk', '/system/app/OverlayTest.apk')) - - # test idmap - if opts.test_idmap: - idmaps='/data/local/tmp/idmaps' - symlinks='/data/local/tmp/symlinks' - - # idmap --path - tasks.append(StopTask()) - tasks.append(_create_setup_idmap_path_task(idmaps, symlinks)) - tasks.append(StartTask()) - tasks.append(IdmapPathTask('/vendor/overlay/framework_a.apk', '/system/framework/framework-res.apk', idmaps + '/a.idmap')) - tasks.append(FileExistsTest(idmaps + '/a.idmap')) - tasks.append(GrepIdmapTest(idmaps + '/a.idmap', 'bool/config_annoy_dianne', 1)) - - # idmap --scan - tasks.append(StopTask()) - tasks.append(_create_setup_idmap_scan_task(idmaps, symlinks)) - tasks.append(StartTask()) - tasks.append(IdmapScanTask('/vendor/overlay', 'android', '/system/framework/framework-res.apk', idmaps, symlinks)) - tasks.append(FileExistsTest(idmaps + '/vendor@overlay@framework_b.apk@idmap')) - tasks.append(GrepIdmapTest(idmaps + '/vendor@overlay@framework_b.apk@idmap', 'bool/config_annoy_dianne', 1)) - - - # overlays.list - overlays_list_path = idmaps + '/overlays.list' - expected_content = '''\ -/vendor/overlay/framework_b.apk /data/local/tmp/idmaps/vendor@overlay@framework_b.apk@idmap -''' - tasks.append(FileExistsTest(overlays_list_path)) - tasks.append(Md5Test(overlays_list_path, expected_content)) - - # idmap cleanup - tasks.append(RmTask(symlinks)) - tasks.append(RmTask(idmaps)) - - # test no overlay: all overlays cleared - if opts.test_no_overlay: - tasks.append(StopTask()) - tasks.append(_create_disable_overlays_task()) - tasks.append(StartTask()) - tasks.append(InstrumentationTask('com.android.overlaytest.WithoutOverlayTest')) - - # test single overlay: one overlay (a) - if opts.test_single_overlay: - tasks.append(StopTask()) - tasks.append(_create_enable_single_overlay_task()) - tasks.append(StartTask()) - tasks.append(InstrumentationTask('com.android.overlaytest.WithOverlayTest')) - - # test multiple overlays: all overlays - including 'disabled' filtered - # overlay (system property unset) so expect 'b[p=2]' overrides 'a[p=1]' but - # 'c[p=3]' should be ignored - if opts.test_multiple_overlays: - tasks.append(StopTask()) - tasks.append(_create_enable_multiple_overlays_task()) - tasks.append(StartTask()) - tasks.append(InstrumentationTask('com.android.overlaytest.WithMultipleOverlaysTest')) - - # test filtered overlays: all overlays - including 'enabled' filtered - # overlay (system property set/matched) so expect c[p=3] to override both a - # & b where applicable - if opts.test_filtered_overlays: - tasks.append(StopTask()) - tasks.append(_create_enable_filtered_overlays_task()) - tasks.append(StartTask()) - tasks.append(InstrumentationTask('com.android.overlaytest.WithFilteredOverlaysTest')) - - ignored_errors = 0 - for t in tasks: - type = t.get_type() - name = t.get_name() - if type == TASK_INSTRUMENTATION: - # InstrumentationTask will run several tests, but we want it - # to appear as if each test was run individually. Calling - # "am instrument" with a single test method is prohibitively - # expensive, so let's instead post-process the output to - # emulate individual calls. - retcode, stdout, stderr = t.execute() - if retcode != 0: - printer.begin(TASK_INSTRUMENTATION, name) - printer.end_fail(TASK_INSTRUMENTATION, name, stderr) - sys.exit(retcode) - retcode = _handle_instrumentation_task_output(stdout, printer) - if retcode != 0: - if not opts.do_continue: - sys.exit(retcode) - else: - ignored_errors += retcode - else: - printer.begin(type, name) - retcode, stdout, stderr = t.execute() - if retcode == 0: - printer.end_pass(type, name) - if retcode != 0: - if len(stderr) == 0: - # hope for output from stdout instead (true for eg adb shell rm) - stderr = stdout - printer.end_fail(type, name, stderr) - if not opts.do_continue: - sys.exit(retcode) - else: - ignored_errors += retcode - sys.exit(ignored_errors) diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 04006b1733a3..3021555d30cc 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -62,7 +62,6 @@ <permission name="android.permission.WRITE_MEDIA_STORAGE" > <group gid="media_rw" /> - <group gid="sdcard_rw" /> </permission> <permission name="android.permission.ACCESS_MTP" > diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 8addffbb02db..bb9b89be9edb 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -145,6 +145,7 @@ applications that come with the platform <permission name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/> <permission name="android.permission.BIND_CARRIER_SERVICES"/> <permission name="android.permission.BIND_IMS_SERVICE"/> + <permission name="android.permission.BIND_TELEPHONY_DATA_SERVICE"/> <permission name="android.permission.BIND_VISUAL_VOICEMAIL_SERVICE"/> <permission name="android.permission.CALL_PRIVILEGED"/> <permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> @@ -157,6 +158,7 @@ applications that come with the platform <permission name="android.permission.LOCAL_MAC_ADDRESS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> + <permission name="android.permission.PACKAGE_USAGE_STATS"/> <permission name="android.permission.PERFORM_CDMA_PROVISIONING"/> <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> @@ -227,6 +229,7 @@ applications that come with the platform <permission name="android.permission.CALL_PRIVILEGED"/> <permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> + <permission name="android.permission.MODIFY_AUDIO_ROUTING" /> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.STOP_APP_SWITCHES"/> <permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/> diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index dad24da6ad98..22867df76aea 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -333,6 +333,9 @@ <family lang="und-Cari"> <font weight="400" style="normal">NotoSansCarian-Regular.ttf</font> </family> + <family lang="und-Cakm"> + <font weight="400" style="normal">NotoSansChakma-Regular.ttf</font> + </family> <family lang="und-Cher"> <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> </family> @@ -429,6 +432,9 @@ <family lang="und-Orkh"> <font weight="400" style="normal">NotoSansOldTurkic-Regular.ttf</font> </family> + <family lang="und-Osge"> + <font weight="400" style="normal">NotoSansOsage-Regular.ttf</font> + </family> <family lang="und-Osma"> <font weight="400" style="normal">NotoSansOsmanya-Regular.ttf</font> </family> diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java index bbf214559459..acefead785c4 100644 --- a/graphics/java/android/graphics/ImageDecoder.java +++ b/graphics/java/android/graphics/ImageDecoder.java @@ -74,7 +74,7 @@ public final class ImageDecoder implements AutoCloseable { int getDensity() { return Bitmap.DENSITY_NONE; } /* @hide */ - int computeDstDensity() { + final int computeDstDensity() { Resources res = getResources(); if (res == null) { return Bitmap.getDefaultDensity(); @@ -122,13 +122,19 @@ public final class ImageDecoder implements AutoCloseable { } private static class ContentResolverSource extends Source { - ContentResolverSource(@NonNull ContentResolver resolver, @NonNull Uri uri) { + ContentResolverSource(@NonNull ContentResolver resolver, @NonNull Uri uri, + @Nullable Resources res) { mResolver = resolver; mUri = uri; + mResources = res; } private final ContentResolver mResolver; private final Uri mUri; + private final Resources mResources; + + @Nullable + Resources getResources() { return mResources; } @Override public ImageDecoder createImageDecoder() throws IOException { @@ -438,6 +444,7 @@ public final class ImageDecoder implements AutoCloseable { private boolean mPreferRamOverQuality = false; private boolean mAsAlphaMask = false; private Rect mCropRect; + private Rect mOutPaddingRect; private Source mSource; private PostProcessor mPostProcessor; @@ -511,7 +518,18 @@ public final class ImageDecoder implements AutoCloseable { @NonNull public static Source createSource(@NonNull ContentResolver cr, @NonNull Uri uri) { - return new ContentResolverSource(cr, uri); + return new ContentResolverSource(cr, uri, null); + } + + /** + * Provide Resources for density scaling. + * + * @hide + */ + @NonNull + public static Source createSource(@NonNull ContentResolver cr, + @NonNull Uri uri, @Nullable Resources res) { + return new ContentResolverSource(cr, uri, res); } /** @@ -765,6 +783,18 @@ public final class ImageDecoder implements AutoCloseable { } /** + * Set a Rect for retrieving nine patch padding. + * + * If the image is a nine patch, this Rect will be set to the padding + * rectangle during decode. Otherwise it will not be modified. + * + * @hide + */ + public void setOutPaddingRect(@NonNull Rect outPadding) { + mOutPaddingRect = outPadding; + } + + /** * Specify whether the {@link Bitmap} should be mutable. * * <p>By default, a {@link Bitmap} created will be immutable, but that can @@ -875,7 +905,6 @@ public final class ImageDecoder implements AutoCloseable { postProcessPtr, mDesiredWidth, mDesiredHeight, mCropRect, mMutable, mAllocator, mRequireUnpremultiplied, mPreferRamOverQuality, mAsAlphaMask); - } private void callHeaderDecoded(@Nullable OnHeaderDecodedListener listener, @@ -948,7 +977,10 @@ public final class ImageDecoder implements AutoCloseable { if (np != null && NinePatch.isNinePatchChunk(np)) { Rect opticalInsets = new Rect(); bm.getOpticalInsets(opticalInsets); - Rect padding = new Rect(); + Rect padding = decoder.mOutPaddingRect; + if (padding == null) { + padding = new Rect(); + } nGetPadding(decoder.mNativePtr, padding); return new NinePatchDrawable(res, bm, np, padding, opticalInsets, null); @@ -991,6 +1023,15 @@ public final class ImageDecoder implements AutoCloseable { final int srcDensity = computeDensity(src, decoder); Bitmap bm = decoder.decodeBitmap(); bm.setDensity(srcDensity); + + Rect padding = decoder.mOutPaddingRect; + if (padding != null) { + byte[] np = bm.getNinePatchChunk(); + if (np != null && NinePatch.isNinePatchChunk(np)) { + nGetPadding(decoder.mNativePtr, padding); + } + } + return bm; } } diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java index 27c8fda0d6e9..86e6fa8c2fc5 100644 --- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java @@ -81,12 +81,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { private State mState; - private Runnable mRunnable = new Runnable() { - @Override - public void run() { - invalidateSelf(); - } - }; + private Runnable mRunnable; /** * Pass this to {@link #setLoopCount} to loop infinitely. @@ -242,6 +237,9 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { // a value <= 0 indicates that the drawable is stopped or that renderThread // will manage the animation if (nextUpdate > 0) { + if (mRunnable == null) { + mRunnable = this::invalidateSelf; + } scheduleSelf(mRunnable, nextUpdate); } else if (nextUpdate == FINISHED) { // This means the animation was drawn in software mode and ended. diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index 7ad062a6f6f9..44b783bb6e63 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -27,6 +27,7 @@ import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.ImageDecoder; import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.Outline; @@ -49,6 +50,7 @@ import com.android.internal.R; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; @@ -111,7 +113,7 @@ public class BitmapDrawable extends Drawable { */ @Deprecated public BitmapDrawable() { - mBitmapState = new BitmapState((Bitmap) null); + init(new BitmapState((Bitmap) null), null); } /** @@ -124,8 +126,7 @@ public class BitmapDrawable extends Drawable { @SuppressWarnings("unused") @Deprecated public BitmapDrawable(Resources res) { - mBitmapState = new BitmapState((Bitmap) null); - mBitmapState.mTargetDensity = mTargetDensity; + init(new BitmapState((Bitmap) null), res); } /** @@ -135,7 +136,7 @@ public class BitmapDrawable extends Drawable { */ @Deprecated public BitmapDrawable(Bitmap bitmap) { - this(new BitmapState(bitmap), null); + init(new BitmapState(bitmap), null); } /** @@ -143,8 +144,7 @@ public class BitmapDrawable extends Drawable { * the display metrics of the resources. */ public BitmapDrawable(Resources res, Bitmap bitmap) { - this(new BitmapState(bitmap), res); - mBitmapState.mTargetDensity = mTargetDensity; + init(new BitmapState(bitmap), res); } /** @@ -154,10 +154,7 @@ public class BitmapDrawable extends Drawable { */ @Deprecated public BitmapDrawable(String filepath) { - this(new BitmapState(BitmapFactory.decodeFile(filepath)), null); - if (mBitmapState.mBitmap == null) { - android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath); - } + this(null, filepath); } /** @@ -165,10 +162,21 @@ public class BitmapDrawable extends Drawable { */ @SuppressWarnings({ "unused", "ChainingConstructorIgnoresParameter" }) public BitmapDrawable(Resources res, String filepath) { - this(new BitmapState(BitmapFactory.decodeFile(filepath)), null); - mBitmapState.mTargetDensity = mTargetDensity; - if (mBitmapState.mBitmap == null) { - android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath); + Bitmap bitmap = null; + try (FileInputStream stream = new FileInputStream(filepath)) { + bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(res, stream), + (decoder, info, src) -> { + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); + } catch (Exception e) { + /* do nothing. This matches the behavior of BitmapFactory.decodeFile() + If the exception happened on decode, mBitmapState.mBitmap will be null. + */ + } finally { + init(new BitmapState(bitmap), res); + if (mBitmapState.mBitmap == null) { + android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + filepath); + } } } @@ -179,10 +187,7 @@ public class BitmapDrawable extends Drawable { */ @Deprecated public BitmapDrawable(java.io.InputStream is) { - this(new BitmapState(BitmapFactory.decodeStream(is)), null); - if (mBitmapState.mBitmap == null) { - android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is); - } + this(null, is); } /** @@ -190,10 +195,21 @@ public class BitmapDrawable extends Drawable { */ @SuppressWarnings({ "unused", "ChainingConstructorIgnoresParameter" }) public BitmapDrawable(Resources res, java.io.InputStream is) { - this(new BitmapState(BitmapFactory.decodeStream(is)), null); - mBitmapState.mTargetDensity = mTargetDensity; - if (mBitmapState.mBitmap == null) { - android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is); + Bitmap bitmap = null; + try { + bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(res, is), + (decoder, info, src) -> { + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); + } catch (Exception e) { + /* do nothing. This matches the behavior of BitmapFactory.decodeStream() + If the exception happened on decode, mBitmapState.mBitmap will be null. + */ + } finally { + init(new BitmapState(bitmap), res); + if (mBitmapState.mBitmap == null) { + android.util.Log.w("BitmapDrawable", "BitmapDrawable cannot decode " + is); + } } } @@ -812,9 +828,19 @@ public class BitmapDrawable extends Drawable { } } + int density = Bitmap.DENSITY_NONE; + if (value.density == TypedValue.DENSITY_DEFAULT) { + density = DisplayMetrics.DENSITY_DEFAULT; + } else if (value.density != TypedValue.DENSITY_NONE) { + density = value.density; + } + Bitmap bitmap = null; try (InputStream is = r.openRawResource(srcResId, value)) { - bitmap = BitmapFactory.decodeResourceStream(r, value, is, null, null); + ImageDecoder.Source source = ImageDecoder.createSource(r, is, density); + bitmap = ImageDecoder.decodeBitmap(source, (decoder, info, src) -> { + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); } catch (Exception e) { // Do nothing and pick up the error below. } @@ -1013,14 +1039,21 @@ public class BitmapDrawable extends Drawable { } } + private BitmapDrawable(BitmapState state, Resources res) { + init(state, res); + } + /** - * The one constructor to rule them all. This is called by all public + * The one helper to rule them all. This is called by all public & private * constructors to set the state and initialize local properties. */ - private BitmapDrawable(BitmapState state, Resources res) { + private void init(BitmapState state, Resources res) { mBitmapState = state; - updateLocalState(res); + + if (mBitmapState != null && res != null) { + mBitmapState.mTargetDensity = mTargetDensity; + } } /** diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index f17cd768c386..36a4d26d62bb 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -37,6 +37,7 @@ import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; +import android.graphics.ImageDecoder; import android.graphics.Insets; import android.graphics.NinePatch; import android.graphics.Outline; @@ -50,11 +51,13 @@ import android.graphics.Xfermode; import android.os.Trace; import android.util.AttributeSet; import android.util.DisplayMetrics; +import android.util.Log; import android.util.StateSet; import android.util.TypedValue; import android.util.Xml; import android.view.View; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; @@ -1175,6 +1178,10 @@ public abstract class Drawable { return null; } + if (opts == null) { + return getBitmapDrawable(res, value, is); + } + /* ugh. The decodeStream contract is that we have already allocated the pad rect, but if the bitmap does not had a ninepatch chunk, then the pad will be ignored. If we could change this to lazily @@ -1207,6 +1214,33 @@ public abstract class Drawable { return null; } + private static Drawable getBitmapDrawable(Resources res, TypedValue value, InputStream is) { + try { + ImageDecoder.Source source = null; + if (value != null) { + int density = Bitmap.DENSITY_NONE; + if (value.density == TypedValue.DENSITY_DEFAULT) { + density = DisplayMetrics.DENSITY_DEFAULT; + } else if (value.density != TypedValue.DENSITY_NONE) { + density = value.density; + } + source = ImageDecoder.createSource(res, is, density); + } else { + source = ImageDecoder.createSource(res, is); + } + + return ImageDecoder.decodeDrawable(source, (decoder, info, src) -> { + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); + } catch (IOException e) { + /* do nothing. + If the exception happened on decode, the drawable will be null. + */ + Log.e("Drawable", "Unable to decode stream: " + e); + } + return null; + } + /** * Create a drawable from an XML document. For more information on how to * create resources in XML, see @@ -1306,11 +1340,10 @@ public abstract class Drawable { } Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName); - try { - Bitmap bm = BitmapFactory.decodeFile(pathName); - if (bm != null) { - return drawableFromBitmap(null, bm, null, null, null, pathName); - } + try (FileInputStream stream = new FileInputStream(pathName)) { + return getBitmapDrawable(null, null, stream); + } catch(IOException e) { + // Do nothing; we will just return null if the FileInputStream had an error } finally { Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); } diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 17900204fa22..a56e8d1b25ed 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -24,9 +24,9 @@ import android.content.res.Resources; import android.content.res.Resources.Theme; import android.content.res.TypedArray; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.ImageDecoder; import android.graphics.Insets; import android.graphics.NinePatch; import android.graphics.Outline; @@ -211,7 +211,8 @@ public class NinePatchDrawable extends Drawable { restoreAlpha = -1; } - final boolean needsDensityScaling = canvas.getDensity() == 0; + final boolean needsDensityScaling = canvas.getDensity() == 0 + && Bitmap.DENSITY_NONE != state.mNinePatch.getDensity(); if (needsDensityScaling) { restoreToCount = restoreToCount >= 0 ? restoreToCount : canvas.save(); @@ -421,10 +422,6 @@ public class NinePatchDrawable extends Drawable { final int srcResId = a.getResourceId(R.styleable.NinePatchDrawable_src, 0); if (srcResId != 0) { - final BitmapFactory.Options options = new BitmapFactory.Options(); - options.inDither = !state.mDither; - options.inScreenDensity = r.getDisplayMetrics().noncompatDensityDpi; - final Rect padding = new Rect(); final Rect opticalInsets = new Rect(); Bitmap bitmap = null; @@ -433,7 +430,17 @@ public class NinePatchDrawable extends Drawable { final TypedValue value = new TypedValue(); final InputStream is = r.openRawResource(srcResId, value); - bitmap = BitmapFactory.decodeResourceStream(r, value, is, padding, options); + int density = Bitmap.DENSITY_NONE; + if (value.density == TypedValue.DENSITY_DEFAULT) { + density = DisplayMetrics.DENSITY_DEFAULT; + } else if (value.density != TypedValue.DENSITY_NONE) { + density = value.density; + } + ImageDecoder.Source source = ImageDecoder.createSource(r, is, density); + bitmap = ImageDecoder.decodeBitmap(source, (decoder, info, src) -> { + decoder.setOutPaddingRect(padding); + decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE); + }); is.close(); } catch (IOException e) { diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 3323bce8b5ad..24d819e93ff2 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -134,6 +134,8 @@ cc_defaults { name: "libhwui_defaults", defaults: ["hwui_defaults"], + shared_libs: ["libstatslog"], + whole_static_libs: ["libskia"], srcs: [ @@ -318,7 +320,10 @@ cc_test { "libgmock", "libhwui_static_debug", ], - shared_libs: ["libmemunreachable"], + shared_libs: [ + "libmemunreachable", + "libstatslog", + ], cflags: [ "-include debug/wrap_gles.h", "-DHWUI_NULL_GPU", @@ -383,7 +388,10 @@ cc_benchmark { // set to libhwui_static_debug to skip actual GL commands whole_static_libs: ["libhwui"], - shared_libs: ["libmemunreachable"], + shared_libs: [ + "libmemunreachable", + "libstatslog", + ], srcs: [ "tests/macrobench/TestSceneRunner.cpp", @@ -405,7 +413,10 @@ cc_benchmark { ], whole_static_libs: ["libhwui_static_debug"], - shared_libs: ["libmemunreachable"], + shared_libs: [ + "libmemunreachable", + "libstatslog", + ], srcs: [ "tests/microbench/main.cpp", diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index f41956cdebeb..ab27a0d00246 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -18,6 +18,7 @@ #include <errno.h> #include <inttypes.h> +#include <statslog.h> #include <sys/mman.h> #include <algorithm> @@ -164,6 +165,7 @@ void JankTracker::finishFrame(const FrameInfo& frame) { ALOGI("%s", ss.str().c_str()); // Just so we have something that counts up, the value is largely irrelevant ATRACE_INT(ss.str().c_str(), ++sDaveyCount); + android::util::stats_write(android::util::DAVEY_OCCURRED, ns2ms(totalDuration)); } } diff --git a/libs/hwui/hwui/Typeface.cpp b/libs/hwui/hwui/Typeface.cpp index ebc14c8b675b..091b5267881d 100644 --- a/libs/hwui/hwui/Typeface.cpp +++ b/libs/hwui/hwui/Typeface.cpp @@ -182,10 +182,11 @@ void Typeface::setRobotoTypefaceForTest() { std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>( std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>()); - std::shared_ptr<minikin::FontFamily> family = std::make_shared<minikin::FontFamily>( - std::vector<minikin::Font>({minikin::Font(std::move(font), minikin::FontStyle())})); - std::shared_ptr<minikin::FontCollection> collection = - std::make_shared<minikin::FontCollection>(std::move(family)); + std::vector<minikin::Font> fonts; + fonts.push_back(minikin::Font(std::move(font), minikin::FontStyle())); + + std::shared_ptr<minikin::FontCollection> collection = std::make_shared<minikin::FontCollection>( + std::make_shared<minikin::FontFamily>(std::move(fonts))); Typeface* hwTypeface = new Typeface(); hwTypeface->fFontCollection = collection; diff --git a/libs/hwui/tests/unit/TypefaceTests.cpp b/libs/hwui/tests/unit/TypefaceTests.cpp index 66d6f527e604..2232c25de345 100644 --- a/libs/hwui/tests/unit/TypefaceTests.cpp +++ b/libs/hwui/tests/unit/TypefaceTests.cpp @@ -56,8 +56,9 @@ std::shared_ptr<minikin::FontFamily> buildFamily(const char* fileName) { LOG_ALWAYS_FATAL_IF(typeface == nullptr, "Failed to make typeface from %s", fileName); std::shared_ptr<minikin::MinikinFont> font = std::make_shared<MinikinFontSkia>( std::move(typeface), data, st.st_size, 0, std::vector<minikin::FontVariation>()); - return std::make_shared<minikin::FontFamily>( - std::vector<minikin::Font>({minikin::Font(std::move(font), minikin::FontStyle())})); + std::vector<minikin::Font> fonts; + fonts.push_back(minikin::Font(std::move(font), minikin::FontStyle())); + return std::make_shared<minikin::FontFamily>(std::move(fonts)); } std::vector<std::shared_ptr<minikin::FontFamily>> makeSingleFamlyVector(const char* fileName) { diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index 1904d40ea67a..f24abaed2dce 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -249,15 +249,15 @@ ProtoOutputStream::start(uint64_t fieldId) } uint32_t id = (uint32_t)fieldId; + size_t prevPos = mBuffer.wp()->pos(); mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED); - size_t sizePos = mBuffer.wp()->pos(); mDepth++; mObjectId++; mBuffer.writeRawFixed64(mExpectedObjectToken); // push previous token into stack. - mExpectedObjectToken = makeToken(get_varint_size(id), + mExpectedObjectToken = makeToken(sizePos - prevPos, (bool)(fieldId & FIELD_COUNT_REPEATED), mDepth, mObjectId, sizePos); return mExpectedObjectToken; } diff --git a/lowpan/java/android/net/lowpan/LowpanManager.java b/lowpan/java/android/net/lowpan/LowpanManager.java index 2d974ee79e40..76876ce01c96 100644 --- a/lowpan/java/android/net/lowpan/LowpanManager.java +++ b/lowpan/java/android/net/lowpan/LowpanManager.java @@ -57,7 +57,7 @@ public class LowpanManager { * This design pattern allows us to skip removal of items * from this Map without leaking memory. */ - private final Map<ILowpanInterface, WeakReference<LowpanInterface>> mBinderCache = + private final Map<IBinder, WeakReference<LowpanInterface>> mBinderCache = new WeakHashMap<>(); private final ILowpanManager mService; @@ -109,13 +109,27 @@ public class LowpanManager { /** @hide */ @Nullable + public LowpanInterface getInterfaceNoCreate(@NonNull ILowpanInterface ifaceService) { + LowpanInterface iface = null; + + synchronized (mBinderCache) { + if (mBinderCache.containsKey(ifaceService.asBinder())) { + iface = mBinderCache.get(ifaceService.asBinder()).get(); + } + } + + return iface; + } + + /** @hide */ + @Nullable public LowpanInterface getInterface(@NonNull ILowpanInterface ifaceService) { LowpanInterface iface = null; try { synchronized (mBinderCache) { - if (mBinderCache.containsKey(ifaceService)) { - iface = mBinderCache.get(ifaceService).get(); + if (mBinderCache.containsKey(ifaceService.asBinder())) { + iface = mBinderCache.get(ifaceService.asBinder()).get(); } if (iface == null) { @@ -127,7 +141,7 @@ public class LowpanManager { mInterfaceCache.put(iface.getName(), iface); } - mBinderCache.put(ifaceService, new WeakReference(iface)); + mBinderCache.put(ifaceService.asBinder(), new WeakReference(iface)); /* Make sure we remove the object from the * interface cache if the associated service @@ -260,7 +274,7 @@ public class LowpanManager { public void onInterfaceRemoved(ILowpanInterface ifaceService) { Runnable runnable = () -> { - LowpanInterface iface = getInterface(ifaceService); + LowpanInterface iface = getInterfaceNoCreate(ifaceService); if (iface != null) { cb.onInterfaceRemoved(iface); diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index b32e5398d0de..e9ffe60ec32d 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -132,7 +132,7 @@ public class MediaController2 implements AutoCloseable { public void onPlaylistChanged(@NonNull List<MediaItem2> playlist) { } /** - * Called when the playback state is changed, or connection success. + * Called when the playback state is changed. * * @param state latest playback state */ @@ -172,6 +172,14 @@ public class MediaController2 implements AutoCloseable { } /** + * @hide + */ + @SystemApi + public PlaybackInfoProvider getProvider() { + return mProvider; + } + + /** * Get the type of playback which affects volume handling. One of: * <ul> * <li>{@link #PLAYBACK_TYPE_LOCAL}</li> @@ -199,9 +207,9 @@ public class MediaController2 implements AutoCloseable { /** * Get the type of volume control that can be used. One of: * <ul> - * <li>{@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}</li> - * <li>{@link VolumeProvider#VOLUME_CONTROL_RELATIVE}</li> - * <li>{@link VolumeProvider#VOLUME_CONTROL_FIXED}</li> + * <li>{@link VolumeProvider2#VOLUME_CONTROL_ABSOLUTE}</li> + * <li>{@link VolumeProvider2#VOLUME_CONTROL_RELATIVE}</li> + * <li>{@link VolumeProvider2#VOLUME_CONTROL_FIXED}</li> * </ul> * * @return The type of volume control that may be used with this session. @@ -416,7 +424,7 @@ public class MediaController2 implements AutoCloseable { * @param extras Optional extras that can include extra information about the media item * to be played. */ - public void playFromUri(@NonNull String uri, @Nullable Bundle extras) { + public void playFromUri(@NonNull Uri uri, @Nullable Bundle extras) { mProvider.playFromUri_impl(uri, extras); } @@ -472,7 +480,7 @@ public class MediaController2 implements AutoCloseable { /** * Set the volume of the output this session is playing on. The command will be ignored if it - * does not support {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. + * does not support {@link VolumeProvider2#VOLUME_CONTROL_ABSOLUTE}. * <p> * If the session is local playback, this changes the device's volume with the stream that * session's player is using. Flags will be specified for the {@link AudioManager}. @@ -494,8 +502,8 @@ public class MediaController2 implements AutoCloseable { * must be one of {@link AudioManager#ADJUST_LOWER}, * {@link AudioManager#ADJUST_RAISE}, or {@link AudioManager#ADJUST_SAME}. * The command will be ignored if the session does not support - * {@link VolumeProvider#VOLUME_CONTROL_RELATIVE} or - * {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. + * {@link VolumeProvider2#VOLUME_CONTROL_RELATIVE} or + * {@link VolumeProvider2#VOLUME_CONTROL_ABSOLUTE}. * <p> * If the session is local playback, this changes the device's volume with the stream that * session's player is using. Flags will be specified for the {@link AudioManager}. diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java index f88f9f2eb5c1..a11768e69b9d 100644 --- a/media/java/android/media/MediaLibraryService2.java +++ b/media/java/android/media/MediaLibraryService2.java @@ -27,7 +27,6 @@ import android.media.MediaSession2.ControllerInfo; import android.media.update.ApiLoader; import android.media.update.MediaLibraryService2Provider.LibraryRootProvider; import android.media.update.MediaLibraryService2Provider.MediaLibrarySessionProvider; -import android.media.update.MediaSession2Provider; import android.media.update.MediaSessionService2Provider; import android.os.Bundle; @@ -63,7 +62,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { public static final String SERVICE_INTERFACE = "android.media.MediaLibraryService2"; /** - * Session for the media library service. + * Session for the {@link MediaLibraryService2}. Build this object with + * {@link MediaLibrarySessionBuilder} and return in {@link #onCreateSession(String)}. */ public static class MediaLibrarySession extends MediaSession2 { private final MediaLibrarySessionProvider mProvider; @@ -101,6 +101,9 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { } } + /** + * Callback for the {@link MediaLibrarySession}. + */ public static class MediaLibrarySessionCallback extends MediaSession2.SessionCallback { public MediaLibrarySessionCallback(Context context) { @@ -200,6 +203,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { /** * Builder for {@link MediaLibrarySession}. */ + // Override all methods just to show them with the type instead of generics in Javadoc. + // This workarounds javadoc issue described in the MediaSession2.BuilderBase. public class MediaLibrarySessionBuilder extends BuilderBase<MediaLibrarySession, MediaLibrarySessionBuilder, MediaLibrarySessionCallback> { public MediaLibrarySessionBuilder( @@ -210,6 +215,38 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { context, (MediaLibrarySessionBuilder) instance, player, callbackExecutor, callback)); } + + @Override + public MediaLibrarySessionBuilder setVolumeProvider( + @Nullable VolumeProvider2 volumeProvider) { + return super.setVolumeProvider(volumeProvider); + } + + @Override + public MediaLibrarySessionBuilder setRatingType(int type) { + return super.setRatingType(type); + } + + @Override + public MediaLibrarySessionBuilder setSessionActivity(@Nullable PendingIntent pi) { + return super.setSessionActivity(pi); + } + + @Override + public MediaLibrarySessionBuilder setId(String id) { + return super.setId(id); + } + + @Override + public MediaLibrarySessionBuilder setSessionCallback( + @NonNull Executor executor, @NonNull MediaLibrarySessionCallback callback) { + return super.setSessionCallback(executor, callback); + } + + @Override + public MediaLibrarySession build() { + return super.build(); + } } @Override @@ -229,7 +266,7 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * This method will be called on the main thread. * * @param sessionId session id written in the AndroidManifest.xml. - * @return a new browser session + * @return a new library session * @see MediaLibrarySessionBuilder * @see #getSession() * @throws RuntimeException if returned session is invalid diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java index d84eedf94820..e331b2cbf645 100644 --- a/media/java/android/media/MediaPlayer2.java +++ b/media/java/android/media/MediaPlayer2.java @@ -1671,35 +1671,6 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener public abstract void deselectTrack(int index); /** - * Sets the target UDP re-transmit endpoint for the low level player. - * Generally, the address portion of the endpoint is an IP multicast - * address, although a unicast address would be equally valid. When a valid - * retransmit endpoint has been set, the media player will not decode and - * render the media presentation locally. Instead, the player will attempt - * to re-multiplex its media data using the Android@Home RTP profile and - * re-transmit to the target endpoint. Receiver devices (which may be - * either the same as the transmitting device or different devices) may - * instantiate, prepare, and start a receiver player using a setDataSource - * URL of the form... - * - * aahRX://<multicastIP>:<port> - * - * to receive, decode and render the re-transmitted content. - * - * setRetransmitEndpoint may only be called before setDataSource has been - * called; while the player is in the Idle state. - * - * @param endpoint the address and UDP port of the re-transmission target or - * null if no re-transmission is to be performed. - * @throws IllegalStateException if it is called in an invalid state - * @throws IllegalArgumentException if the retransmit endpoint is supplied, - * but invalid. - * - * {@hide} pending API council - */ - public void setRetransmitEndpoint(InetSocketAddress endpoint) { } - - /** * Releases the resources held by this {@code MediaPlayer2} object. * * It is considered good practice to call this method when you're diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index 222c66ea4551..e3d5ac07665e 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -2964,53 +2964,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { } /** - * Sets the target UDP re-transmit endpoint for the low level player. - * Generally, the address portion of the endpoint is an IP multicast - * address, although a unicast address would be equally valid. When a valid - * retransmit endpoint has been set, the media player will not decode and - * render the media presentation locally. Instead, the player will attempt - * to re-multiplex its media data using the Android@Home RTP profile and - * re-transmit to the target endpoint. Receiver devices (which may be - * either the same as the transmitting device or different devices) may - * instantiate, prepare, and start a receiver player using a setDataSource - * URL of the form... - * - * aahRX://<multicastIP>:<port> - * - * to receive, decode and render the re-transmitted content. - * - * setRetransmitEndpoint may only be called before setDataSource has been - * called; while the player is in the Idle state. - * - * @param endpoint the address and UDP port of the re-transmission target or - * null if no re-transmission is to be performed. - * @throws IllegalStateException if it is called in an invalid state - * @throws IllegalArgumentException if the retransmit endpoint is supplied, - * but invalid. - * - * {@hide} pending API council - */ - @Override - public void setRetransmitEndpoint(InetSocketAddress endpoint) - throws IllegalStateException, IllegalArgumentException - { - String addrString = null; - int port = 0; - - if (null != endpoint) { - addrString = endpoint.getAddress().getHostAddress(); - port = endpoint.getPort(); - } - - int ret = native_setRetransmitEndpoint(addrString, port); - if (ret != 0) { - throw new IllegalArgumentException("Illegal re-transmit endpoint; native ret " + ret); - } - } - - private native final int native_setRetransmitEndpoint(String addrString, int port); - - /** * Releases the resources held by this {@code MediaPlayer2} object. * * It is considered good practice to call this method when you're diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index 5670bd8fcba3..943b827289f1 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -502,7 +502,7 @@ public class MediaSession2 implements AutoCloseable { /** * Called when a controller requested to play a specific media item represented by a URI - * through {@link MediaController2#playFromUri(String, Bundle)} + * through {@link MediaController2#playFromUri(Uri, Bundle)} * * @param controller controller information * @param uri uri @@ -510,7 +510,7 @@ public class MediaSession2 implements AutoCloseable { * @see #COMMAND_CODE_PLAY_FROM_URI */ public void onPlayFromUri(@NonNull ControllerInfo controller, - @NonNull String uri, @Nullable Bundle extras) { } + @NonNull Uri uri, @Nullable Bundle extras) { } /** * Called when a controller requested to prepare for playing a specific mediaId through @@ -580,8 +580,20 @@ public class MediaSession2 implements AutoCloseable { }; /** - * Base builder class for MediaSession2 and its subclass. - * + * Base builder class for MediaSession2 and its subclass. Any change in this class should be + * also applied to the subclasses {@link MediaSession2.Builder} and + * {@link MediaLibraryService2.MediaLibrarySessionBuilder}. + * <p> + * APIs here should be package private, but should have documentations for developers. + * Otherwise, javadoc will generate documentation with the generic types such as follows. + * <pre>U extends BuilderBase<T, U, C> setSessionCallback(Executor executor, C callback)</pre> + * <p> + * This class is hidden to prevent from generating test stub, which fails with + * 'unexpected bound' because it tries to auto generate stub class as follows. + * <pre>abstract static class BuilderBase< + * T extends android.media.MediaSession2, + * U extends android.media.MediaSession2.BuilderBase< + * T, U, C extends android.media.MediaSession2.SessionCallback>, C></pre> * @hide */ static abstract class BuilderBase @@ -599,9 +611,9 @@ public class MediaSession2 implements AutoCloseable { * <p> * Set {@code null} to reset. * - * @param volumeProvider The provider that will handle volume changes. Can be {@code null} + * @param volumeProvider The provider that will handle volume changes. Can be {@code null}. */ - public U setVolumeProvider(@Nullable VolumeProvider volumeProvider) { + U setVolumeProvider(@Nullable VolumeProvider2 volumeProvider) { mProvider.setVolumeProvider_impl(volumeProvider); return (U) this; } @@ -619,7 +631,7 @@ public class MediaSession2 implements AutoCloseable { * <li>{@link Rating2#RATING_THUMB_UP_DOWN}</li> * </ul> */ - public U setRatingType(@Rating2.Style int type) { + U setRatingType(@Rating2.Style int type) { mProvider.setRatingType_impl(type); return (U) this; } @@ -631,7 +643,7 @@ public class MediaSession2 implements AutoCloseable { * * @param pi The intent to launch to show UI for this session. */ - public U setSessionActivity(@Nullable PendingIntent pi) { + U setSessionActivity(@Nullable PendingIntent pi) { mProvider.setSessionActivity_impl(pi); return (U) this; } @@ -646,7 +658,7 @@ public class MediaSession2 implements AutoCloseable { * @throws IllegalArgumentException if id is {@code null} * @return */ - public U setId(@NonNull String id) { + U setId(@NonNull String id) { mProvider.setId_impl(id); return (U) this; } @@ -658,7 +670,7 @@ public class MediaSession2 implements AutoCloseable { * @param callback session callback. * @return */ - public U setSessionCallback(@NonNull @CallbackExecutor Executor executor, + U setSessionCallback(@NonNull @CallbackExecutor Executor executor, @NonNull C callback) { mProvider.setSessionCallback_impl(executor, callback); return (U) this; @@ -671,7 +683,7 @@ public class MediaSession2 implements AutoCloseable { * @throws IllegalStateException if the session with the same id is already exists for the * package. */ - public T build() { + T build() { return mProvider.build_impl(); } } @@ -682,13 +694,44 @@ public class MediaSession2 implements AutoCloseable { * Any incoming event from the {@link MediaController2} will be handled on the thread * that created session with the {@link Builder#build()}. */ - // TODO(jaewan): Add setRatingType() - // TODO(jaewan): Add setSessionActivity() + // Override all methods just to show them with the type instead of generics in Javadoc. + // This workarounds javadoc issue described in the MediaSession2.BuilderBase. public static final class Builder extends BuilderBase<MediaSession2, Builder, SessionCallback> { public Builder(Context context, @NonNull MediaPlayerInterface player) { super((instance) -> ApiLoader.getProvider(context).createMediaSession2Builder( context, (Builder) instance, player)); } + + @Override + public Builder setVolumeProvider(@Nullable VolumeProvider2 volumeProvider) { + return super.setVolumeProvider(volumeProvider); + } + + @Override + public Builder setRatingType(@Rating2.Style int type) { + return super.setRatingType(type); + } + + @Override + public Builder setSessionActivity(@Nullable PendingIntent pi) { + return super.setSessionActivity(pi); + } + + @Override + public Builder setId(@NonNull String id) { + return super.setId(id); + } + + @Override + public Builder setSessionCallback(@NonNull Executor executor, + @Nullable SessionCallback callback) { + return super.setSessionCallback(executor, callback); + } + + @Override + public MediaSession2 build() { + return super.build(); + } } /** @@ -1035,8 +1078,8 @@ public class MediaSession2 implements AutoCloseable { * If the new player is successfully set, {@link PlaybackListener} * will be called to tell the current playback state of the new player. * <p> - * You can also specify a volume provider. If so, playback in the player is considered as - * remote playback. + * For the remote playback case which you want to handle volume by yourself, use + * {@link #setPlayer(MediaPlayerInterface, VolumeProvider2)}. * * @param player a {@link MediaPlayerInterface} that handles actual media playback in your app. * @throws IllegalArgumentException if the player is {@code null}. @@ -1051,10 +1094,10 @@ public class MediaSession2 implements AutoCloseable { * @param player a {@link MediaPlayerInterface} that handles actual media playback in your app. * @param volumeProvider a volume provider * @see #setPlayer(MediaPlayerInterface) - * @see Builder#setVolumeProvider(VolumeProvider) + * @see Builder#setVolumeProvider(VolumeProvider2) */ public void setPlayer(@NonNull MediaPlayerInterface player, - @NonNull VolumeProvider volumeProvider) { + @NonNull VolumeProvider2 volumeProvider) { mProvider.setPlayer_impl(player, volumeProvider); } diff --git a/media/java/android/media/MicrophoneInfo.java b/media/java/android/media/MicrophoneInfo.java index 21f917166498..131e37bd6646 100644 --- a/media/java/android/media/MicrophoneInfo.java +++ b/media/java/android/media/MicrophoneInfo.java @@ -55,7 +55,7 @@ public final class MicrophoneInfo { /** * Unknown microphone directionality. */ - public static final int DIRECTIONALITY_UNKNOW = 0; + public static final int DIRECTIONALITY_UNKNOWN = 0; /** * Microphone directionality type: omni. @@ -104,7 +104,7 @@ public final class MicrophoneInfo { /** @hide */ @IntDef(flag = true, prefix = { "DIRECTIONALITY_" }, value = { - DIRECTIONALITY_UNKNOW, + DIRECTIONALITY_UNKNOWN, DIRECTIONALITY_OMNI, DIRECTIONALITY_BI_DIRECTIONAL, DIRECTIONALITY_CARDIOID, @@ -309,7 +309,7 @@ public final class MicrophoneInfo { /** * Returns the directionality of microphone. The return value is one of - * {@link #DIRECTIONALITY_UNKNOW}, {@link #DIRECTIONALITY_OMNI}, + * {@link #DIRECTIONALITY_UNKNOWN}, {@link #DIRECTIONALITY_OMNI}, * {@link #DIRECTIONALITY_BI_DIRECTIONAL}, {@link #DIRECTIONALITY_CARDIOID}, * {@link #DIRECTIONALITY_HYPER_CARDIOID}, or {@link #DIRECTIONALITY_SUPER_CARDIOID}. * diff --git a/media/java/android/media/VolumeProvider2.java b/media/java/android/media/VolumeProvider2.java index 00746e25c247..53ba4663aaf6 100644 --- a/media/java/android/media/VolumeProvider2.java +++ b/media/java/android/media/VolumeProvider2.java @@ -32,7 +32,7 @@ import java.lang.annotation.RetentionPolicy; * {@link #setCurrentVolume(int)} each time the volume being provided changes. * <p> * You can set a volume provider on a session by calling - * {@link MediaSession2#setPlayer(MediaPlayerInterface, VolumeProvider)}. + * {@link MediaSession2#setPlayer(MediaPlayerInterface, VolumeProvider2)}. * * @hide */ diff --git a/media/java/android/media/audiofx/Visualizer.java b/media/java/android/media/audiofx/Visualizer.java index 0fe7246e85c4..f2b4fe093248 100644 --- a/media/java/android/media/audiofx/Visualizer.java +++ b/media/java/android/media/audiofx/Visualizer.java @@ -546,22 +546,39 @@ public class Visualizer { /** * Method called when a new waveform capture is available. * <p>Data in the waveform buffer is valid only within the scope of the callback. - * Applications which needs access to the waveform data after returning from the callback + * Applications which need access to the waveform data after returning from the callback * should make a copy of the data instead of holding a reference. * @param visualizer Visualizer object on which the listener is registered. * @param waveform array of bytes containing the waveform representation. - * @param samplingRate sampling rate of the audio visualized. + * @param samplingRate sampling rate of the visualized audio. */ void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate); /** * Method called when a new frequency capture is available. * <p>Data in the fft buffer is valid only within the scope of the callback. - * Applications which needs access to the fft data after returning from the callback + * Applications which need access to the fft data after returning from the callback * should make a copy of the data instead of holding a reference. + * + * <p>In order to obtain magnitude and phase values the following formulas can + * be used: + * <pre class="prettyprint"> + * for (int i = 0; i < fft.size(); i += 2) { + * float magnitude = (float)Math.hypot(fft[i], fft[i + 1]); + * float phase = (float)Math.atan2(fft[i + 1], fft[i]); + * }</pre> * @param visualizer Visualizer object on which the listener is registered. * @param fft array of bytes containing the frequency representation. - * @param samplingRate sampling rate of the audio visualized. + * The fft array only contains the first half of the actual + * FFT spectrum (frequencies up to Nyquist frequency), exploiting + * the symmetry of the spectrum. For each frequencies bin <code>i</code>: + * <ul> + * <li>the element at index <code>2*i</code> in the array contains + * the real part of a complex number,</li> + * <li>the element at index <code>2*i+1</code> contains the imaginary + * part of the complex number.</li> + * </ul> + * @param samplingRate sampling rate of the visualized audio. */ void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate); } diff --git a/media/java/android/media/update/FrameLayoutHelper.java b/media/java/android/media/update/FrameLayoutHelper.java deleted file mode 100644 index 983dc703a9b5..000000000000 --- a/media/java/android/media/update/FrameLayoutHelper.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.media.update; - -import android.content.Context; -import android.graphics.Canvas; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.widget.FrameLayout; - -/** - * Helper class for connecting the public API to an updatable implementation. - * - * @see ViewProvider - * - * @hide - */ -public abstract class FrameLayoutHelper<T extends ViewProvider> extends FrameLayout { - /** @hide */ - final public T mProvider; - - /** @hide */ - public FrameLayoutHelper(ProviderCreator<T> creator, - Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - mProvider = creator.createProvider(this, new SuperProvider()); - } - - /** @hide */ - // TODO @SystemApi - public T getProvider() { - return mProvider; - } - - @Override - public CharSequence getAccessibilityClassName() { - return mProvider.getAccessibilityClassName_impl(); - } - - @Override - public boolean onTouchEvent(MotionEvent ev) { - return mProvider.onTouchEvent_impl(ev); - } - - @Override - public boolean onTrackballEvent(MotionEvent ev) { - return mProvider.onTrackballEvent_impl(ev); - } - - @Override - public void onFinishInflate() { - mProvider.onFinishInflate_impl(); - } - - @Override - public void setEnabled(boolean enabled) { - mProvider.setEnabled_impl(enabled); - } - - @Override - protected void onAttachedToWindow() { - mProvider.onAttachedToWindow_impl(); - } - - @Override - protected void onDetachedFromWindow() { - mProvider.onDetachedFromWindow_impl(); - } - - /** @hide */ - public class SuperProvider implements ViewProvider { - @Override - public CharSequence getAccessibilityClassName_impl() { - return FrameLayoutHelper.super.getAccessibilityClassName(); - } - - @Override - public boolean onTouchEvent_impl(MotionEvent ev) { - return FrameLayoutHelper.super.onTouchEvent(ev); - } - - @Override - public boolean onTrackballEvent_impl(MotionEvent ev) { - return FrameLayoutHelper.super.onTrackballEvent(ev); - } - - @Override - public void onFinishInflate_impl() { - FrameLayoutHelper.super.onFinishInflate(); - } - - @Override - public void setEnabled_impl(boolean enabled) { - FrameLayoutHelper.super.setEnabled(enabled); - } - - @Override - public void onAttachedToWindow_impl() { - FrameLayoutHelper.super.onAttachedToWindow(); - } - - @Override - public void onDetachedFromWindow_impl() { - FrameLayoutHelper.super.onDetachedFromWindow(); - } - } - - /** @hide */ - @FunctionalInterface - public interface ProviderCreator<U extends ViewProvider> { - U createProvider(FrameLayoutHelper<U> instance, ViewProvider superProvider); - } -} diff --git a/media/java/android/media/update/MediaControlView2Provider.java b/media/java/android/media/update/MediaControlView2Provider.java index 95fe36317164..ebde3fefac36 100644 --- a/media/java/android/media/update/MediaControlView2Provider.java +++ b/media/java/android/media/update/MediaControlView2Provider.java @@ -18,6 +18,7 @@ package android.media.update; import android.annotation.SystemApi; import android.media.session.MediaController; +import android.util.AttributeSet; import android.view.View; /** @@ -34,12 +35,10 @@ import android.view.View; * @hide */ // TODO @SystemApi -public interface MediaControlView2Provider extends ViewProvider { +public interface MediaControlView2Provider extends ViewGroupProvider { + void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes); + void setController_impl(MediaController controller); - boolean isShowing_impl(); void setButtonVisibility_impl(int button, int visibility); void requestPlayButtonFocus_impl(); - void onVisibilityAggregated_impl(boolean isVisible); - void setTimeout_impl(long timeout); - long getTimeout_impl(); } diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java index 05790c113804..71bc64a62abf 100644 --- a/media/java/android/media/update/MediaController2Provider.java +++ b/media/java/android/media/update/MediaController2Provider.java @@ -52,7 +52,7 @@ public interface MediaController2Provider extends TransportControlProvider { void prepareFromSearch_impl(String query, Bundle extras); void prepareMediaId_impl(String mediaId, Bundle extras); void playFromSearch_impl(String query, Bundle extras); - void playFromUri_impl(String uri, Bundle extras); + void playFromUri_impl(Uri uri, Bundle extras); void playFromMediaId_impl(String mediaId, Bundle extras); void setRating_impl(Rating2 rating); diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java index 9abf34a740ff..41162e0a15ea 100644 --- a/media/java/android/media/update/MediaSession2Provider.java +++ b/media/java/android/media/update/MediaSession2Provider.java @@ -30,7 +30,7 @@ import android.media.MediaSession2.ControllerInfo; import android.media.MediaSession2.PlaylistParams; import android.media.MediaSession2.SessionCallback; import android.media.SessionToken2; -import android.media.VolumeProvider; +import android.media.VolumeProvider2; import android.os.Bundle; import android.os.ResultReceiver; @@ -44,7 +44,7 @@ import java.util.concurrent.Executor; public interface MediaSession2Provider extends TransportControlProvider { void close_impl(); void setPlayer_impl(MediaPlayerInterface player); - void setPlayer_impl(MediaPlayerInterface player, VolumeProvider volumeProvider); + void setPlayer_impl(MediaPlayerInterface player, VolumeProvider2 volumeProvider); MediaPlayerInterface getPlayer_impl(); SessionToken2 getToken_impl(); List<ControllerInfo> getConnectedControllers_impl(); @@ -116,7 +116,7 @@ public interface MediaSession2Provider extends TransportControlProvider { } interface BuilderBaseProvider<T extends MediaSession2, C extends SessionCallback> { - void setVolumeProvider_impl(VolumeProvider volumeProvider); + void setVolumeProvider_impl(VolumeProvider2 volumeProvider); void setRatingType_impl(int type); void setSessionActivity_impl(PendingIntent pi); void setId_impl(String id); diff --git a/media/java/android/media/update/StaticProvider.java b/media/java/android/media/update/StaticProvider.java index 862a4024e36d..57f04cc88ff5 100644 --- a/media/java/android/media/update/StaticProvider.java +++ b/media/java/android/media/update/StaticProvider.java @@ -67,10 +67,11 @@ import java.util.concurrent.Executor; * @hide */ public interface StaticProvider { - MediaControlView2Provider createMediaControlView2( - MediaControlView2 instance, ViewProvider superProvider); - VideoView2Provider createVideoView2( - VideoView2 instance, ViewProvider superProvider, + MediaControlView2Provider createMediaControlView2(MediaControlView2 instance, + ViewGroupProvider superProvider, ViewGroupProvider privateProvider, + @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes); + VideoView2Provider createVideoView2(VideoView2 instance, + ViewGroupProvider superProvider, ViewGroupProvider privateProvider, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes); CommandProvider createMediaSession2Command(MediaSession2.Command instance, diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java index 10f03d223d9f..7f9ecdd5115c 100644 --- a/media/java/android/media/update/VideoView2Provider.java +++ b/media/java/android/media/update/VideoView2Provider.java @@ -16,12 +16,14 @@ package android.media.update; +import android.annotation.SystemApi; import android.media.AudioAttributes; import android.media.MediaPlayerInterface; import android.media.session.MediaController; import android.media.session.PlaybackState; import android.media.session.MediaSession; import android.net.Uri; +import android.util.AttributeSet; import android.widget.MediaControlView2; import android.widget.VideoView2; @@ -43,15 +45,21 @@ import java.util.concurrent.Executor; * @hide */ // TODO @SystemApi -public interface VideoView2Provider extends ViewProvider { - void setMediaControlView2_impl(MediaControlView2 mediaControlView); +public interface VideoView2Provider extends ViewGroupProvider { + void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes); + + void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs); MediaController getMediaController_impl(); MediaControlView2 getMediaControlView2_impl(); - void showSubtitle_impl(boolean show); + void setSubtitleEnabled_impl(boolean enable); + boolean isSubtitleEnabled_impl(); // TODO: remove setSpeed_impl once MediaController2 is ready. void setSpeed_impl(float speed); void setAudioFocusRequest_impl(int focusGain); void setAudioAttributes_impl(AudioAttributes attributes); + /** + * @hide + */ void setRouteAttributes_impl(List<String> routeCategories, MediaPlayerInterface player); // TODO: remove setRouteAttributes_impl with MediaSession.Callback once MediaSession2 is ready. void setRouteAttributes_impl(List<String> routeCategories, MediaSession.Callback sessionPlayer); diff --git a/media/java/android/media/update/ViewGroupHelper.java b/media/java/android/media/update/ViewGroupHelper.java new file mode 100644 index 000000000000..6b4f15d0fdb7 --- /dev/null +++ b/media/java/android/media/update/ViewGroupHelper.java @@ -0,0 +1,369 @@ +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.update; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +/** + * Helper class for connecting the public API to an updatable implementation. + * + * @see ViewGroupProvider + * + * @hide + */ +public abstract class ViewGroupHelper<T extends ViewGroupProvider> extends ViewGroup { + /** @hide */ + final public T mProvider; + + /** @hide */ + public ViewGroupHelper(ProviderCreator<T> creator, + Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + mProvider = creator.createProvider(this, new SuperProvider(), + new PrivateProvider()); + } + + /** @hide */ + // TODO @SystemApi + public T getProvider() { + return mProvider; + } + + @Override + protected void onAttachedToWindow() { + mProvider.onAttachedToWindow_impl(); + } + + @Override + protected void onDetachedFromWindow() { + mProvider.onDetachedFromWindow_impl(); + } + + @Override + public CharSequence getAccessibilityClassName() { + return mProvider.getAccessibilityClassName_impl(); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + return mProvider.onTouchEvent_impl(ev); + } + + @Override + public boolean onTrackballEvent(MotionEvent ev) { + return mProvider.onTrackballEvent_impl(ev); + } + + @Override + public void onFinishInflate() { + mProvider.onFinishInflate_impl(); + } + + @Override + public void setEnabled(boolean enabled) { + mProvider.setEnabled_impl(enabled); + } + + @Override + public void onVisibilityAggregated(boolean isVisible) { + mProvider.onVisibilityAggregated_impl(isVisible); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + mProvider.onLayout_impl(changed, left, top, right, bottom); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + mProvider.onMeasure_impl(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected int getSuggestedMinimumWidth() { + return mProvider.getSuggestedMinimumWidth_impl(); + } + + @Override + protected int getSuggestedMinimumHeight() { + return mProvider.getSuggestedMinimumHeight_impl(); + } + + // setMeasuredDimension is final + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + return mProvider.dispatchTouchEvent_impl(ev); + } + + @Override + protected boolean checkLayoutParams(LayoutParams p) { + return mProvider.checkLayoutParams_impl(p); + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + return mProvider.generateDefaultLayoutParams_impl(); + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return mProvider.generateLayoutParams_impl(attrs); + } + + @Override + protected LayoutParams generateLayoutParams(LayoutParams lp) { + return mProvider.generateLayoutParams_impl(lp); + } + + @Override + public boolean shouldDelayChildPressedState() { + return mProvider.shouldDelayChildPressedState_impl(); + } + + @Override + protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed) { + mProvider.measureChildWithMargins_impl(child, + parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); + } + + /** @hide */ + public class SuperProvider implements ViewGroupProvider { + @Override + public CharSequence getAccessibilityClassName_impl() { + return ViewGroupHelper.super.getAccessibilityClassName(); + } + + @Override + public boolean onTouchEvent_impl(MotionEvent ev) { + return ViewGroupHelper.super.onTouchEvent(ev); + } + + @Override + public boolean onTrackballEvent_impl(MotionEvent ev) { + return ViewGroupHelper.super.onTrackballEvent(ev); + } + + @Override + public void onFinishInflate_impl() { + ViewGroupHelper.super.onFinishInflate(); + } + + @Override + public void setEnabled_impl(boolean enabled) { + ViewGroupHelper.super.setEnabled(enabled); + } + + @Override + public void onAttachedToWindow_impl() { + ViewGroupHelper.super.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow_impl() { + ViewGroupHelper.super.onDetachedFromWindow(); + } + + @Override + public void onVisibilityAggregated_impl(boolean isVisible) { + ViewGroupHelper.super.onVisibilityAggregated(isVisible); + } + + @Override + public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) { + // abstract method; no super + } + + @Override + public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) { + ViewGroupHelper.super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public int getSuggestedMinimumWidth_impl() { + return ViewGroupHelper.super.getSuggestedMinimumWidth(); + } + + @Override + public int getSuggestedMinimumHeight_impl() { + return ViewGroupHelper.super.getSuggestedMinimumHeight(); + } + + @Override + public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) { + ViewGroupHelper.super.setMeasuredDimension(measuredWidth, measuredHeight); + } + + @Override + public boolean dispatchTouchEvent_impl(MotionEvent ev) { + return ViewGroupHelper.super.dispatchTouchEvent(ev); + } + + @Override + public boolean checkLayoutParams_impl(LayoutParams p) { + return ViewGroupHelper.super.checkLayoutParams(p); + } + + @Override + public LayoutParams generateDefaultLayoutParams_impl() { + return ViewGroupHelper.super.generateDefaultLayoutParams(); + } + + @Override + public LayoutParams generateLayoutParams_impl(AttributeSet attrs) { + return ViewGroupHelper.super.generateLayoutParams(attrs); + } + + @Override + public LayoutParams generateLayoutParams_impl(LayoutParams lp) { + return ViewGroupHelper.super.generateLayoutParams(lp); + } + + @Override + public boolean shouldDelayChildPressedState_impl() { + return ViewGroupHelper.super.shouldDelayChildPressedState(); + } + + @Override + public void measureChildWithMargins_impl(View child, + int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed) { + ViewGroupHelper.super.measureChildWithMargins(child, + parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); + } + } + + /** @hide */ + public class PrivateProvider implements ViewGroupProvider { + @Override + public CharSequence getAccessibilityClassName_impl() { + return ViewGroupHelper.this.getAccessibilityClassName(); + } + + @Override + public boolean onTouchEvent_impl(MotionEvent ev) { + return ViewGroupHelper.this.onTouchEvent(ev); + } + + @Override + public boolean onTrackballEvent_impl(MotionEvent ev) { + return ViewGroupHelper.this.onTrackballEvent(ev); + } + + @Override + public void onFinishInflate_impl() { + ViewGroupHelper.this.onFinishInflate(); + } + + @Override + public void setEnabled_impl(boolean enabled) { + ViewGroupHelper.this.setEnabled(enabled); + } + + @Override + public void onAttachedToWindow_impl() { + ViewGroupHelper.this.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow_impl() { + ViewGroupHelper.this.onDetachedFromWindow(); + } + + @Override + public void onVisibilityAggregated_impl(boolean isVisible) { + ViewGroupHelper.this.onVisibilityAggregated(isVisible); + } + + @Override + public void onLayout_impl(boolean changed, int left, int top, int right, int bottom) { + ViewGroupHelper.this.onLayout(changed, left, top, right, bottom); + } + + @Override + public void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec) { + ViewGroupHelper.this.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public int getSuggestedMinimumWidth_impl() { + return ViewGroupHelper.this.getSuggestedMinimumWidth(); + } + + @Override + public int getSuggestedMinimumHeight_impl() { + return ViewGroupHelper.this.getSuggestedMinimumHeight(); + } + + @Override + public void setMeasuredDimension_impl(int measuredWidth, int measuredHeight) { + ViewGroupHelper.this.setMeasuredDimension(measuredWidth, measuredHeight); + } + + @Override + public boolean dispatchTouchEvent_impl(MotionEvent ev) { + return ViewGroupHelper.this.dispatchTouchEvent(ev); + } + + @Override + public boolean checkLayoutParams_impl(LayoutParams p) { + return ViewGroupHelper.this.checkLayoutParams(p); + } + + @Override + public LayoutParams generateDefaultLayoutParams_impl() { + return ViewGroupHelper.this.generateDefaultLayoutParams(); + } + + @Override + public LayoutParams generateLayoutParams_impl(AttributeSet attrs) { + return ViewGroupHelper.this.generateLayoutParams(attrs); + } + + @Override + public LayoutParams generateLayoutParams_impl(LayoutParams lp) { + return ViewGroupHelper.this.generateLayoutParams(lp); + } + + @Override + public boolean shouldDelayChildPressedState_impl() { + return ViewGroupHelper.this.shouldDelayChildPressedState(); + } + + @Override + public void measureChildWithMargins_impl(View child, + int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed) { + ViewGroupHelper.this.measureChildWithMargins(child, + parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); + } + } + + /** @hide */ + @FunctionalInterface + public interface ProviderCreator<T extends ViewGroupProvider> { + T createProvider(ViewGroupHelper<T> instance, ViewGroupProvider superProvider, + ViewGroupProvider privateProvider); + } +} diff --git a/media/java/android/media/update/ViewProvider.java b/media/java/android/media/update/ViewGroupProvider.java index 0dd8f388a8fe..67e8cea871e9 100644 --- a/media/java/android/media/update/ViewProvider.java +++ b/media/java/android/media/update/ViewGroupProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * Copyright 2018 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. @@ -17,7 +17,10 @@ package android.media.update; import android.annotation.SystemApi; +import android.util.AttributeSet; import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; /** * Interface for connecting the public API to an updatable implementation. @@ -33,8 +36,8 @@ import android.view.MotionEvent; * @hide */ // TODO @SystemApi -public interface ViewProvider { - // TODO Add more (all?) methods from View +public interface ViewGroupProvider { + // View methods void onAttachedToWindow_impl(); void onDetachedFromWindow_impl(); CharSequence getAccessibilityClassName_impl(); @@ -42,4 +45,23 @@ public interface ViewProvider { boolean onTrackballEvent_impl(MotionEvent ev); void onFinishInflate_impl(); void setEnabled_impl(boolean enabled); + void onVisibilityAggregated_impl(boolean isVisible); + void onLayout_impl(boolean changed, int left, int top, int right, int bottom); + void onMeasure_impl(int widthMeasureSpec, int heightMeasureSpec); + int getSuggestedMinimumWidth_impl(); + int getSuggestedMinimumHeight_impl(); + void setMeasuredDimension_impl(int measuredWidth, int measuredHeight); + boolean dispatchTouchEvent_impl(MotionEvent ev); + + // ViewGroup methods + boolean checkLayoutParams_impl(LayoutParams p); + LayoutParams generateDefaultLayoutParams_impl(); + LayoutParams generateLayoutParams_impl(AttributeSet attrs); + LayoutParams generateLayoutParams_impl(LayoutParams lp); + boolean shouldDelayChildPressedState_impl(); + void measureChildWithMargins_impl(View child, int parentWidthMeasureSpec, int widthUsed, + int parentHeightMeasureSpec, int heightUsed); + + // ViewManager methods + // ViewParent methods } diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index 90ee8a6814d5..27eaed05b04d 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -19,12 +19,16 @@ #define LOG_TAG "MediaPlayer2-JNI" #include "utils/Log.h" +#include <sys/stat.h> + #include <media/mediaplayer2.h> #include <media/AudioResamplerPublic.h> +#include <media/DataSourceDesc.h> #include <media/MediaHTTPService.h> #include <media/MediaPlayer2Interface.h> #include <media/MediaAnalyticsItem.h> #include <media/NdkWrapper.h> +#include <media/stagefright/Utils.h> #include <media/stagefright/foundation/ByteUtils.h> // for FOURCC definition #include <stdio.h> #include <assert.h> @@ -234,7 +238,8 @@ static sp<MediaPlayer2> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<Media // event to the client application; otherwise, if exception is not NULL and // opStatus is not OK, this method throws the given exception to the client // application. -static void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) +static void process_media_player_call( + JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) { if (exception == NULL) { // Don't throw exception. Instead, send an event. if (opStatus != (status_t) OK) { @@ -268,7 +273,7 @@ android_media_MediaPlayer2_setDataSourceAndHeaders( jobjectArray keys, jobjectArray values) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); - if (mp == NULL ) { + if (mp == NULL) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } @@ -282,16 +287,25 @@ android_media_MediaPlayer2_setDataSourceAndHeaders( if (tmp == NULL) { // Out of memory return; } - ALOGV("setDataSource: path %s", tmp); + ALOGV("setDataSourceAndHeaders: path %s", tmp); + + if (strncmp(tmp, "content://", 10) == 0) { + ALOGE("setDataSourceAndHeaders: content scheme is not supported in native code"); + jniThrowException(env, "java/io/IOException", + "content scheme is not supported in native code"); + return; + } + + sp<DataSourceDesc> dsd = new DataSourceDesc(); + dsd->mType = DataSourceDesc::TYPE_URL; + dsd->mUrl = tmp; - String8 pathStr(tmp); env->ReleaseStringUTFChars(path, tmp); tmp = NULL; // We build a KeyedVector out of the key and val arrays - KeyedVector<String8, String8> headersVector; if (!ConvertKeyValueArraysToKeyedVector( - env, keys, values, &headersVector)) { + env, keys, values, &dsd->mHeaders)) { return; } @@ -299,20 +313,16 @@ android_media_MediaPlayer2_setDataSourceAndHeaders( if (httpServiceObj != NULL) { httpService = new JMedia2HTTPService(env, httpServiceObj); } - - status_t opStatus = - mp->setDataSource( - httpService, - pathStr, - headersVector.size() > 0? &headersVector : NULL); + dsd->mHttpService = httpService; process_media_player_call( - env, thiz, opStatus, "java/io/IOException", - "setDataSource failed." ); + env, thiz, mp->setDataSource(dsd), "java/io/IOException", + "setDataSourceAndHeaders failed." ); } static void -android_media_MediaPlayer2_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) +android_media_MediaPlayer2_setDataSourceFD( + JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { @@ -325,12 +335,46 @@ android_media_MediaPlayer2_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fi return; } int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); - ALOGV("setDataSourceFD: fd %d", fd); - process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." ); + ALOGV("setDataSourceFD: fd=%d (%s), offset=%lld, length=%lld", + fd, nameForFd(fd).c_str(), (long long)offset, (long long)length); + + struct stat sb; + int ret = fstat(fd, &sb); + if (ret != 0) { + ALOGE("setDataSourceFD: fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); + jniThrowException(env, "java/io/IOException", "setDataSourceFD failed fstat"); + return; + } + + ALOGV("st_dev = %llu", static_cast<unsigned long long>(sb.st_dev)); + ALOGV("st_mode = %u", sb.st_mode); + ALOGV("st_uid = %lu", static_cast<unsigned long>(sb.st_uid)); + ALOGV("st_gid = %lu", static_cast<unsigned long>(sb.st_gid)); + ALOGV("st_size = %llu", static_cast<unsigned long long>(sb.st_size)); + + if (offset >= sb.st_size) { + ALOGE("setDataSourceFD: offset is out of range"); + jniThrowException(env, "java/lang/IllegalArgumentException", + "setDataSourceFD failed, offset is out of range."); + return; + } + if (offset + length > sb.st_size) { + length = sb.st_size - offset; + ALOGV("setDataSourceFD: adjusted length = %lld", (long long)length); + } + + sp<DataSourceDesc> dsd = new DataSourceDesc(); + dsd->mType = DataSourceDesc::TYPE_FD; + dsd->mFD = fd; + dsd->mFDOffset = offset; + dsd->mFDLength = length; + process_media_player_call(env, thiz, mp->setDataSource(dsd), + "java/io/IOException", "setDataSourceFD failed." ); } static void -android_media_MediaPlayer2_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource) +android_media_MediaPlayer2_setDataSourceCallback( + JNIEnv *env, jobject thiz, jobject dataSource) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { @@ -343,7 +387,11 @@ android_media_MediaPlayer2_setDataSourceCallback(JNIEnv *env, jobject thiz, jobj return; } sp<DataSource> callbackDataSource = new JMedia2DataSource(env, dataSource); - process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." ); + sp<DataSourceDesc> dsd = new DataSourceDesc(); + dsd->mType = DataSourceDesc::TYPE_CALLBACK; + dsd->mCallbackSource = callbackDataSource; + process_media_player_call(env, thiz, mp->setDataSource(dsd), + "java/lang/RuntimeException", "setDataSourceCallback failed." ); } static sp<ANativeWindowWrapper> @@ -1099,45 +1147,6 @@ static void android_media_MediaPlayer2_attachAuxEffect(JNIEnv *env, jobject thi process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); } -static jint -android_media_MediaPlayer2_setRetransmitEndpoint(JNIEnv *env, jobject thiz, - jstring addrString, jint port) { - sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); - if (mp == NULL ) { - jniThrowException(env, "java/lang/IllegalStateException", NULL); - return INVALID_OPERATION; - } - - const char *cAddrString = NULL; - - if (NULL != addrString) { - cAddrString = env->GetStringUTFChars(addrString, NULL); - if (cAddrString == NULL) { // Out of memory - return NO_MEMORY; - } - } - ALOGV("setRetransmitEndpoint: %s:%d", - cAddrString ? cAddrString : "(null)", port); - - status_t ret; - if (cAddrString && (port > 0xFFFF)) { - ret = BAD_VALUE; - } else { - ret = mp->setRetransmitEndpoint(cAddrString, - static_cast<uint16_t>(port)); - } - - if (NULL != addrString) { - env->ReleaseStringUTFChars(addrString, cAddrString); - } - - if (ret == INVALID_OPERATION ) { - jniThrowException(env, "java/lang/IllegalStateException", NULL); - } - - return (jint) ret; -} - static void android_media_MediaPlayer2_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) { @@ -1418,7 +1427,6 @@ static const JNINativeMethod gMethods[] = { {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer2_set_audio_session_id}, {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer2_setAuxEffectSendLevel}, {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer2_attachAuxEffect}, - {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer2_setRetransmitEndpoint}, {"setNextMediaPlayer", "(Landroid/media/MediaPlayer2;)V", (void *)android_media_MediaPlayer2_setNextMediaPlayer}, // Modular DRM { "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer2_prepareDrm }, diff --git a/native/android/Android.bp b/native/android/Android.bp index 00fe6382fc17..4fb5e748aaac 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -48,6 +48,7 @@ cc_library_shared { "sensor.cpp", "sharedmem.cpp", "storage_manager.cpp", + "surface_texture.cpp", "trace.cpp", ], diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 3d5ee39e37d3..d6dcd723e721 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -205,6 +205,14 @@ LIBANDROID { AStorageManager_mountObb; AStorageManager_new; AStorageManager_unmountObb; + ASurfaceTexture_acquireANativeWindow; # introduced=28 + ASurfaceTexture_attachToGLContext; # introduced=28 + ASurfaceTexture_detachFromGLContext; # introduced=28 + ASurfaceTexture_fromSurfaceTexture; # introduced=28 + ASurfaceTexture_getTimestamp; # introduced=28 + ASurfaceTexture_getTransformMatrix; # introduced=28 + ASurfaceTexture_release; # introduced=28 + ASurfaceTexture_updateTexImage; # introduced=28 ATrace_beginSection; # introduced=23 ATrace_endSection; # introduced=23 ATrace_isEnabled; # introduced=23 diff --git a/native/android/surface_texture.cpp b/native/android/surface_texture.cpp new file mode 100644 index 000000000000..b26688190ccd --- /dev/null +++ b/native/android/surface_texture.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2018 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.h> +#include <android/surface_texture_jni.h> + +#define LOG_TAG "ASurfaceTexture" + +#include <utils/Log.h> + +#include <gui/GLConsumer.h> +#include <gui/Surface.h> + +#include <android_runtime/android_graphics_SurfaceTexture.h> + +using namespace android; + +struct ASurfaceTexture { + sp<GLConsumer> consumer; + sp<IGraphicBufferProducer> producer; +}; + +ASurfaceTexture* ASurfaceTexture_fromSurfaceTexture(JNIEnv* env, jobject surfacetexture) { + if (!surfacetexture || !android_SurfaceTexture_isInstanceOf(env, surfacetexture)) { + return nullptr; + } + ASurfaceTexture* ast = new ASurfaceTexture; + ast->consumer = SurfaceTexture_getSurfaceTexture(env, surfacetexture); + ast->producer = SurfaceTexture_getProducer(env, surfacetexture); + return ast; +} + +ANativeWindow* ASurfaceTexture_acquireANativeWindow(ASurfaceTexture* st) { + sp<Surface> surface = new Surface(st->producer); + ANativeWindow* win(surface.get()); + ANativeWindow_acquire(win); + return win; +} + +void ASurfaceTexture_release(ASurfaceTexture* st) { + delete st; +} + +int ASurfaceTexture_attachToGLContext(ASurfaceTexture* st, uint32_t tex) { + return st->consumer->attachToContext(tex); +} + +int ASurfaceTexture_detachFromGLContext(ASurfaceTexture* st) { + return st->consumer->detachFromContext(); +} + +int ASurfaceTexture_updateTexImage(ASurfaceTexture* st) { + return st->consumer->updateTexImage(); +} + +void ASurfaceTexture_getTransformMatrix(ASurfaceTexture* st, float mtx[16]) { + st->consumer->getTransformMatrix(mtx); +} + +int64_t ASurfaceTexture_getTimestamp(ASurfaceTexture* st) { + return st->consumer->getTimestamp(); +} diff --git a/packages/CaptivePortalLogin/OWNERS b/packages/CaptivePortalLogin/OWNERS index 6f77e04da3c0..ce50558bf4f6 100644 --- a/packages/CaptivePortalLogin/OWNERS +++ b/packages/CaptivePortalLogin/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com lorenzo@google.com satk@google.com diff --git a/packages/CarrierDefaultApp/res/values-bs/strings.xml b/packages/CarrierDefaultApp/res/values-bs/strings.xml index ad2fc24891f1..bc1ff339fb1a 100644 --- a/packages/CarrierDefaultApp/res/values-bs/strings.xml +++ b/packages/CarrierDefaultApp/res/values-bs/strings.xml @@ -7,7 +7,7 @@ <string name="no_data_notification_id" msgid="668400731803969521">"Prijenos podataka na mobilnoj mreži je deaktiviran"</string> <string name="portal_notification_detail" msgid="2295729385924660881">"Dodirnite da posjetite %s web lokaciju"</string> <string name="no_data_notification_detail" msgid="3112125343857014825">"Obratite se pružaocu usluga %s"</string> - <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"Nema mobilnog prijenosa podataka"</string> + <string name="no_mobile_data_connection_title" msgid="7449525772416200578">"Nema veze za prijenos podataka na mobilnoj mreži"</string> <string name="no_mobile_data_connection" msgid="544980465184147010">"Dodajte plan prijenosa podataka ili rominga putem operatera %s"</string> <string name="mobile_data_status_notification_channel_name" msgid="833999690121305708">"Status prijenosa podataka na mobilnoj mreži"</string> <string name="action_bar_label" msgid="4290345990334377177">"Prijava na mobilnu mrežu"</string> diff --git a/packages/ExtServices/src/android/ext/services/notification/Assistant.java b/packages/ExtServices/src/android/ext/services/notification/Assistant.java index 6fe8975577a4..9a66b07fb74f 100644 --- a/packages/ExtServices/src/android/ext/services/notification/Assistant.java +++ b/packages/ExtServices/src/android/ext/services/notification/Assistant.java @@ -94,7 +94,7 @@ public class Assistant extends NotificationAssistantService { infile = mFile.openRead(); readXml(infile); } catch (FileNotFoundException e) { - // No data yet + Log.d(TAG, "File doesn't exist or isn't readable yet"); } catch (IOException e) { Log.e(TAG, "Unable to read channel impressions", e); } catch (NumberFormatException | XmlPullParserException e) { diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java index 7c35b48310f2..db48f610471d 100644 --- a/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java +++ b/packages/ExtServices/tests/src/android/ext/services/notification/AssistantTest.java @@ -325,7 +325,8 @@ public class AssistantTest extends ServiceTestCase<Assistant> { int dismiss2 = 777; String key2 = mAssistant.getKey("pkg2", 2, "channel2"); - String xml = "<assistant version=\"1\">\n" + String xml = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" + + "<assistant version=\"1\">\n" + "<impression-set key=\"" + key1 + "\" " + "dismisses=\"" + dismiss1 + "\" views=\"" + views1 + "\" streak=\"" + streak1 + "\"/>\n" @@ -377,7 +378,6 @@ public class AssistantTest extends ServiceTestCase<Assistant> { mAssistant.insertImpressions(key2, ci2); mAssistant.insertImpressions(key3, ci3); - XmlSerializer serializer = new FastXmlSerializer(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.setOutput(new BufferedOutputStream(baos), "utf-8"); diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java index f6a259dbf982..53e8813c7363 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java @@ -16,8 +16,8 @@ package com.android.printspooler.model; -import static com.android.internal.print.DumpUtils.writeComponentName; import static com.android.internal.print.DumpUtils.writePrintJobInfo; +import static com.android.internal.util.dump.DumpUtils.writeComponentName; import android.annotation.FloatRange; import android.annotation.NonNull; @@ -59,10 +59,10 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.HandlerCaller; -import com.android.internal.print.DualDumpOutputStream; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.printspooler.R; import com.android.printspooler.util.ApprovedPrintServices; @@ -214,12 +214,11 @@ public final class PrintSpoolerService extends Service { try { synchronized (mLock) { if (dumpAsProto) { - dumpLocked(new DualDumpOutputStream(new ProtoOutputStream(fd), null)); + dumpLocked(new DualDumpOutputStream(new ProtoOutputStream(fd))); } else { try (FileOutputStream out = new FileOutputStream(fd)) { try (PrintWriter w = new PrintWriter(out)) { - dumpLocked(new DualDumpOutputStream(null, new IndentingPrintWriter(w, - " "))); + dumpLocked(new DualDumpOutputStream(new IndentingPrintWriter(w, " "))); } } catch (IOException ignored) { } diff --git a/packages/SettingsLib/common.mk b/packages/SettingsLib/common.mk index 3c2ca2d31888..741db3441699 100644 --- a/packages/SettingsLib/common.mk +++ b/packages/SettingsLib/common.mk @@ -16,11 +16,11 @@ ifeq ($(LOCAL_USE_AAPT2),true) LOCAL_STATIC_JAVA_LIBRARIES += \ android-support-annotations \ - apptoolkit-lifecycle-common + android-arch-lifecycle-common LOCAL_STATIC_ANDROID_LIBRARIES += \ android-support-v4 \ - apptoolkit-lifecycle-runtime \ + android-arch-lifecycle-runtime \ android-support-v7-recyclerview \ android-support-v7-preference \ android-support-v7-appcompat \ diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index 771abe666dc9..f995d585d900 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Wys oortrekareas"</item> <item msgid="2290859360633824369">"Wys areas vir Deuteranomaly"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (verstek)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Standaardlimiet"</item> <item msgid="4071574792028999443">"Geen agtergrondprosesse"</item> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index b3ea9fbab4ea..278b07d8dcdf 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Wys hardewarelae se opdaterings"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Laat hardewarelae groen flits wanneer hulle opgedateer word"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Ontfout GPU-oortrek"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Stel GPU-leweraar"</string> <string name="disable_overlays" msgid="2074488440505934665">"Deaktiveer HW-oorleggers"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Gebruik altyd GPU vir skermsamestelling"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simuleer kleurruimte"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Meer tyd."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Minder tyd."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Skakel aan"</string> + <string name="cancel" msgid="6859253417269739139">"Kanselleer"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Skakel Moenie steur nie aan"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nooit"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Net prioriteit"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index 3cda6ab8718e..3f6d3b8aea31 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Mostra les àrees sobredibuixades"</item> <item msgid="2290859360633824369">"Mostra les àrees amb deuteranomalia"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (predeterminat)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Límit estàndard"</item> <item msgid="4071574792028999443">"Sense processos en segon pla"</item> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 60531f24fff8..d020f801bfe7 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostra actualitzacions capes"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Il·lumina capes de maquinari en verd en actualitzar-se"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Depura sobredibuix de GPU"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Configura renderitzador GPU"</string> <string name="disable_overlays" msgid="2074488440505934665">"Desactiva superposicions HW"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Utilitza sempre GPU per combinar pantalles"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simula l\'espai de color"</string> @@ -354,14 +353,14 @@ <string name="daltonizer_type_overridden" msgid="3116947244410245916">"S\'ha substituït per <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="845431008899029842">"Temps restant aproximat: <xliff:g id="TIME">^1</xliff:g>"</string> <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">^1</xliff:g>"</string> - <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> per completar la pujada"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> per completar la càrrega"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant: <xliff:g id="TIME">^1</xliff:g>"</string> <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Temps restant segons l\'ús que en fas: <xliff:g id="TIME">^1</xliff:g>"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> aproximadament per esgotar la bateria"</string> <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>; temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g>; temps restant: <xliff:g id="TIME">^2</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string> - <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> per completar la pujada"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> per completar la càrrega"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Desconegut"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"S\'està carregant"</string> <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"s\'està carregant"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Més temps"</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Menys temps"</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Activa"</string> + <string name="cancel" msgid="6859253417269739139">"Cancel·la"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Activa el mode No molestis"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Mai"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Només amb prioritat"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string> </resources> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index 9d665a3bed55..7e7bbe1b7323 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Zobrazit překreslované oblasti"</item> <item msgid="2290859360633824369">"Zobrazit oblasti pro deuteranomálii"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (výchozí)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Standardní limit"</item> <item msgid="4071574792028999443">"Procesy na pozadí deaktivovány"</item> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 058f6a76ebb6..c29973c68f33 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Zobrazit aktual. HW vrstev"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikat zeleně hardwarové vrstvy při aktualizaci"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladit překreslování GPU"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Nastavit modul vykreslení"</string> <string name="disable_overlays" msgid="2074488440505934665">"Zakázat hardwarové vrstvy"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Vždy použít GPU ke skládání obrazovky"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simulovat barevný prostor"</string> @@ -411,4 +410,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Delší doba"</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Kratší doba"</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Zapnout"</string> + <string name="cancel" msgid="6859253417269739139">"Zrušit"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Zapněte funkci Nerušit"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikdy"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Pouze prioritní"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 0993d3140097..6d651d52fb3c 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Vis områder med overlap"</item> <item msgid="2290859360633824369">"Vis områder for deuteranomali"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (standard)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Standardgrænse"</item> <item msgid="4071574792028999443">"Ingen baggrundsprocesser"</item> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 98bbaa2ac2c1..14d07ff83485 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Se opdat. af hardwarelag"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelag blinker grønt, når de opdateres"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Ret GPU-overlapsfejl"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Angiv GPU-gengiver"</string> <string name="disable_overlays" msgid="2074488440505934665">"Deaktiver HW-overlejring"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Brug altid GPU til skærmsammensætning"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simuler farverum"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Mere tid."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Mindre tid."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Aktivér"</string> + <string name="cancel" msgid="6859253417269739139">"Annuller"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Aktivér Forstyr ikke"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldrig"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Kun prioritet"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rXC/arrays.xml b/packages/SettingsLib/res/values-en-rXC/arrays.xml index 846e3145ed6b..b66ace9e7d9e 100644 --- a/packages/SettingsLib/res/values-en-rXC/arrays.xml +++ b/packages/SettingsLib/res/values-en-rXC/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Show overdraw areas"</item> <item msgid="2290859360633824369">"Show areas for Deuteranomaly"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (Default)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Standard limit"</item> <item msgid="4071574792028999443">"No background processes"</item> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 6c9be080f3d6..7eb1b31a9a1f 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Show hardware layers updates"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash hardware layers green when they update"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Debug GPU overdraw"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Set GPU Renderer"</string> <string name="disable_overlays" msgid="2074488440505934665">"Disable HW overlays"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Always use GPU for screen compositing"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simulate color space"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"More time."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Less time."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Turn on"</string> + <string name="cancel" msgid="6859253417269739139">"Cancel"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Turn on Do Not Disturb"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index 9ed0c8961f46..0bb28e0b199c 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Näytä päällekkäiset alueet"</item> <item msgid="2290859360633824369">"Näytä alueet puna-vihersokeille näkyvinä"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (oletus)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Vakioraja"</item> <item msgid="4071574792028999443">"Ei taustaprosesseja"</item> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index be19ed639815..5f9bf481bcc0 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Näytä laitt.tason päiv."</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Näytä laitteistotasot vihreinä niiden päivittyessä"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU-objektien päällekkäisyys"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Grafiikan piirtäjä"</string> <string name="disable_overlays" msgid="2074488440505934665">"Poista HW-peittok. käyt."</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Käytä GPU:ta näytön koostamiseen"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simuloi väriavaruus"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Enemmän aikaa"</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Vähemmän aikaa"</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Ota käyttöön"</string> + <string name="cancel" msgid="6859253417269739139">"Peruuta"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Ota Älä häiritse ‑tila käyttöön"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ei koskaan"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Vain tärkeät"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 13b2c4abc1ca..4b5201cb0800 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -196,7 +196,7 @@ <string name="debug_networking_category" msgid="7044075693643009662">"નેટવર્કિંગ"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"વાયરલેસ ડિસ્પ્લે પ્રમાણન"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"વાઇ-ફાઇ વર્બોઝ લૉગિંગ સક્ષમ કરો"</string> - <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"MAC ઍડ્રેસ રેન્ડમાઇઝ કરવું ચાલુ કર્યું"</string> + <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"કનેક્ટ કરેલ MAC ઍડ્રેસને રેન્ડમાઇઝ કરવાનું ચાલુ કરો"</string> <string name="mobile_data_always_on" msgid="8774857027458200434">"મોબાઇલ ડેટા હંમેશાં સક્રિય"</string> <string name="tethering_hardware_offload" msgid="7470077827090325814">"ટિથરિંગ માટે હાર્ડવેર ગતિવૃદ્ધિ"</string> <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"નામ વિનાના બ્લૂટૂથ ઉપકરણો બતાવો"</string> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 1a765b34e4d7..cb8d851a6b13 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"ओवरड्रॉ क्षेत्रों को दिखाएं"</item> <item msgid="2290859360633824369">"हरा रंग पहचानने में कमी के क्षेत्र दिखाएं"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (डिफ़ॉल्ट)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"मानक सीमा"</item> <item msgid="4071574792028999443">"कोई पृष्ठभूमि प्रक्रियाएं नहीं"</item> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index a7a6920ebc6e..16654bef67cc 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेयर लेयर अपडेट दिखाएं"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेयर लेयर अपडेट होने पर उनमें हरी रोशनी डालें"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओवरड्रॉ डीबग करें"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU दाता सेट करें"</string> <string name="disable_overlays" msgid="2074488440505934665">"HW ओवरले बंद करें"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन संयोजन के लिए हमेशा GPU का उपयोग करें"</string> <string name="simulate_color_space" msgid="6745847141353345872">"रंग स्पेस सिम्युलेट करें"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"ज़्यादा समय."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"कम समय."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"चालू करें"</string> + <string name="cancel" msgid="6859253417269739139">"रद्द करें"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"\'परेशान न करें\' चालू करें"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"कभी नहीं"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"सिर्फ़ ज़रूरी"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-mr/arrays.xml b/packages/SettingsLib/res/values-mr/arrays.xml index 606494911c13..2f21e5f88e9d 100644 --- a/packages/SettingsLib/res/values-mr/arrays.xml +++ b/packages/SettingsLib/res/values-mr/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"अधोरेखांकित क्षेत्रे दर्शवा"</item> <item msgid="2290859360633824369">"हरित असंगतिसाठी क्षेत्रे दर्शवा"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (डीफॉल्ट)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"मानक मर्यादा"</item> <item msgid="4071574792028999443">"एकही पार्श्वभूमी प्रक्रिया नाही"</item> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index a15869e4fd99..c1acfd0d022c 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"हार्डवेअर स्तर अपडेट दर्शवा"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"हार्डवेअर स्तर अद्ययावत झाल्यावर ते हिरव्या रंगात फ्लॅश करा"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ओव्हरड्रॉ डीबग करा"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU प्रदाता सेट करा"</string> <string name="disable_overlays" msgid="2074488440505934665">"HW ओव्हरले अक्षम करा"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"स्क्रीन तयार करण्यासाठी नेहमी GPU वापरा"</string> <string name="simulate_color_space" msgid="6745847141353345872">"रंग स्थानाची बतावणी करा"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"जास्त वेळ."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"कमी वेळ."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"चालू करा"</string> + <string name="cancel" msgid="6859253417269739139">"रद्द करा"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"व्यत्यय आणू नका चालू करा"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"कधीही नाही"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"केवळ प्राधान्य"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index c5015968e2f6..77ebdc7dd94f 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Vis maskinvarelag-oppdat."</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Maskinvarelag blinker grønt under oppdatering"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Feilsøk GPU-overtrekk"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Angi GPU-gjengivelse"</string> <string name="disable_overlays" msgid="2074488440505934665">"Slå av maskinvareoverlegg"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Bruk alltid GPU for skjermsammensetting"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simuler fargeområde"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Mer tid."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Mindre tid."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Slå på"</string> + <string name="cancel" msgid="6859253417269739139">"Avbryt"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Slå på Ikke forstyrr"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldri"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Bare prioritet"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index a44ac2947946..9aeb08395867 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -174,9 +174,9 @@ <string name="development_settings_enable" msgid="542530994778109538">"विकासकर्ता विकल्प सक्रिया गर्नुहोस्"</string> <string name="development_settings_summary" msgid="1815795401632854041">"अनुप्रयोग विकासको लागि विकल्पहरू सेट गर्नुहोस्"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"विकासकर्ताका विकल्पहरू यस प्रयोगकर्ताका लागि उपलब्ध छैन"</string> - <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिङ्हरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"कार्यक्षेत्र सीमा सेटिङ्हरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"पहुँच बिन्दु नामको सेटिङ्हरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> + <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिङहरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"कार्यक्षेत्र सीमा सेटिङहरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"पहुँच बिन्दु नामको सेटिङहरू यो प्रयोगकर्ताको लागि उपलब्ध छैन"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डिबग गर्दै"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"USB जडित हुँदा डिबग मोड"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB डिबग गर्ने प्राधिकरणहरू उल्टाउनुहोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index ace58fd3d234..6fcdfd276d89 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Gedeeltes met overbelasting weergeven"</item> <item msgid="2290859360633824369">"Gebieden voor deuteranomalie weergeven"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (standaard)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Standaardlimiet"</item> <item msgid="4071574792028999443">"Geen achtergrondprocessen"</item> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 9fe32ff52ea4..c1ea14ee3215 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Updaten hardwarelgn wrgvn"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwarelagen knipperen groen bij updates"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Foutopsporing GPU-overbelasting"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU-renderer instellen"</string> <string name="disable_overlays" msgid="2074488440505934665">"HW-overlays uitschakelen"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"GPU altijd gebruiken voor schermcompositing"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Kleurruimte simuleren"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Meer tijd."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Minder tijd."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Inschakelen"</string> + <string name="cancel" msgid="6859253417269739139">"Annuleren"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Schakel Niet storen in."</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nooit"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Alleen prioriteit"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 78a24c4d3bb5..384d9f5862fe 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Mostrar áreas de sobreposição"</item> <item msgid="2290859360633824369">"Mostrar áreas para Deuteranomaly"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (predefinição)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Limite padrão"</item> <item msgid="4071574792028999443">"Sem processos em segundo plano"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 16e3d2bbb0fc..2965ca72c14d 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Mostrar atual. cam. hard."</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Camadas de hard. flash verdes quando estão atuali."</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar sobreposição GPU"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Definir renderizador GPU"</string> <string name="disable_overlays" msgid="2074488440505934665">"Desativ. sobreposições HW"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Utilizar sempre GPU para a composição do ecrã"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Simular espaço da cor"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Mais tempo."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Menos tempo."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Ativar"</string> + <string name="cancel" msgid="6859253417269739139">"Cancelar"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Ativar o modo Não incomodar"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Apenas prioridade"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index 05ccc80f37c3..4e771b74e1d0 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Показывать области наложения"</item> <item msgid="2290859360633824369">"Выделять области определенного цвета"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (по умолчанию)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Стандартное ограничение"</item> <item msgid="4071574792028999443">"Без фоновых процессов"</item> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index bdf8a4a6f29d..a4732eb4f9bd 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. аппаратные обновл."</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Выделять аппаратные уровни зеленым при обновлении"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Отладка наложения"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Средство визуализации"</string> <string name="disable_overlays" msgid="2074488440505934665">"Откл. аппарат. наложения"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Всегда использовать GPU при компоновке экрана"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Имитировать аномалию"</string> @@ -411,4 +410,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Увеличить продолжительность"</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Уменьшить продолжительность"</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Включить"</string> + <string name="cancel" msgid="6859253417269739139">"Отмена"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Включите режим \"Не беспокоить\""</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Никогда"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Только важные"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string> </resources> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index e3f21ad6b6f1..4a1c6262e7a9 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Показувати області накладання"</item> <item msgid="2290859360633824369">"Показувати області дейтераномалії"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (за умовчанням)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Стандартне обмеження"</item> <item msgid="4071574792028999443">"Без фонових процесів"</item> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index e9f6c06d868c..6b864ea13b35 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Показ. апаратні оновлення"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Виділяти апаратні рівні зеленим під час оновлення"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Налагодити накладання GPU"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Вибрати засіб обробки відео для ГП"</string> <string name="disable_overlays" msgid="2074488440505934665">"Вимк. апаратн. накладання"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Завжди використовувати GPU для компонування екрана"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Моделювання кольорів"</string> @@ -411,4 +410,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Більше часу."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Менше часу."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Увімкнути"</string> + <string name="cancel" msgid="6859253417269739139">"Скасувати"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Увімкнути режим \"Не турбувати\""</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ніколи"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Лише пріоритетні"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index ce2e89fd6047..7e5696e18c6e 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"顯示透支區域"</item> <item msgid="2290859360633824369">"顯示綠色弱視區域"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"OpenGL (預設)"</item> - <item msgid="2839130076198120436">"OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"標準限制"</item> <item msgid="4071574792028999443">"不執行背景處理程序"</item> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 6b7d7e876468..4e9e4a8b2475 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬體層更新"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬體層更新時閃綠燈"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"針對 GPU 重複繪圖進行偵錯"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"設定 GPU 轉譯器"</string> <string name="disable_overlays" msgid="2074488440505934665">"停用硬體重疊圖層"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"一律使用 GPU 進行畫面合成"</string> <string name="simulate_color_space" msgid="6745847141353345872">"模擬色彩空間"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"增加時間。"</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"減少時間。"</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"開啟"</string> + <string name="cancel" msgid="6859253417269739139">"取消"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"開啟「零打擾」模式"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"永不"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"僅限優先通知"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index 3d0de36adb02..6361dc1e2cf3 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -234,10 +234,6 @@ <item msgid="7688197031296835369">"Bonisa izindawo zokukhipha okungaphezulu"</item> <item msgid="2290859360633824369">"Bonisa izindawo ze-Deuteranomaly"</item> </string-array> - <string-array name="debug_hw_renderer_entries"> - <item msgid="2578620445459945681">"I-OpenGL (Okuzenzakalelayo)"</item> - <item msgid="2839130076198120436">"I-OpenGL (Skia)"</item> - </string-array> <string-array name="app_process_limit_entries"> <item msgid="3401625457385943795">"Isilanganiso esivamile"</item> <item msgid="4071574792028999443">"Azikho izinqubo zesizinda"</item> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index c5d6627c84ed..4f7f4196ef8a 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -275,7 +275,6 @@ <string name="show_hw_layers_updates" msgid="5645728765605699821">"Bonisa izibuyekezo zezendlalelo izingxenyekazi zekhompyutha"</string> <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Izendlalelo zengxenyekazi zekhompyutha eziluhlaza uma zibuyekeza"</string> <string name="debug_hw_overdraw" msgid="2968692419951565417">"Susa iphutha lokukhipha okungaphezulu kwe-GPU"</string> - <string name="debug_hw_renderer" msgid="7568529019431785816">"Setha isinikezeli se-GPU"</string> <string name="disable_overlays" msgid="2074488440505934665">"Khubaza izimbondela ze-HW"</string> <string name="disable_overlays_summary" msgid="3578941133710758592">"Njalo sebenzisa i-GPU ukwakha isikrini"</string> <string name="simulate_color_space" msgid="6745847141353345872">"Qoqa isikhala sombala"</string> @@ -409,4 +408,10 @@ </plurals> <string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Isikhathi esiningi."</string> <string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Isikhathi esincane."</string> + <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Vula"</string> + <string name="cancel" msgid="6859253417269739139">"Khansela"</string> + <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Vula ukungaphazamisi"</string> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Soze"</string> + <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Okubalulekile kuphela"</string> + <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index e11017ce3449..f69944006a87 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -622,6 +622,19 @@ public class AccessPoint implements Comparable<AccessPoint> { return builder.toString(); } + public static String getKey(WifiConfiguration config) { + StringBuilder builder = new StringBuilder(); + + if (TextUtils.isEmpty(config.SSID)) { + builder.append(config.BSSID); + } else { + builder.append(removeDoubleQuotes(config.SSID)); + } + + builder.append(',').append(getSecurity(config)); + return builder.toString(); + } + public String getKey() { return mKey; } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 1ac56a9de98f..fac585e06306 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -92,8 +92,6 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro * and used so as to assist with in-the-field WiFi connectivity debugging */ public static boolean sVerboseLogging; - // TODO(b/36733768): Remove flag includeSaved - // TODO: Allow control of this? // Combo scans can take 5-6s to complete - set to 10s. private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; @@ -106,8 +104,6 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro private final NetworkRequest mNetworkRequest; private final AtomicBoolean mConnected = new AtomicBoolean(false); private final WifiListener mListener; - private final boolean mIncludeSaved; - private final boolean mIncludeScans; @VisibleForTesting MainHandler mMainHandler; @VisibleForTesting WorkHandler mWorkHandler; private HandlerThread mWorkThread; @@ -150,7 +146,6 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro // TODO(sghuman): Change this to be keyed on AccessPoint.getKey private final HashMap<String, ScanResult> mScanResultCache = new HashMap<>(); - private Integer mScanId = 0; private NetworkInfo mLastNetworkInfo; private WifiInfo mLastInfo; @@ -189,16 +184,18 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro @Deprecated public WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved, boolean includeScans) { - this(context, wifiListener, includeSaved, includeScans, + this(context, wifiListener, context.getSystemService(WifiManager.class), context.getSystemService(ConnectivityManager.class), context.getSystemService(NetworkScoreManager.class), newIntentFilter()); } + // TODO(Sghuman): Clean up includeSaved and includeScans from all constructors and linked + // calling apps once IC window is complete public WifiTracker(Context context, WifiListener wifiListener, @NonNull Lifecycle lifecycle, boolean includeSaved, boolean includeScans) { - this(context, wifiListener, includeSaved, includeScans, + this(context, wifiListener, context.getSystemService(WifiManager.class), context.getSystemService(ConnectivityManager.class), context.getSystemService(NetworkScoreManager.class), @@ -208,19 +205,13 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro @VisibleForTesting WifiTracker(Context context, WifiListener wifiListener, - boolean includeSaved, boolean includeScans, WifiManager wifiManager, ConnectivityManager connectivityManager, NetworkScoreManager networkScoreManager, IntentFilter filter) { - if (!includeSaved && !includeScans) { - throw new IllegalArgumentException("Must include either saved or scans"); - } mContext = context; mMainHandler = new MainHandler(Looper.getMainLooper()); mWifiManager = wifiManager; - mIncludeSaved = includeSaved; - mIncludeScans = includeScans; - mListener = wifiListener; + mListener = new WifiListenerWrapper(wifiListener); mConnectivityManager = connectivityManager; // check if verbose logging has been turned on or off @@ -458,7 +449,6 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro private void handleResume() { mScanResultCache.clear(); mSeenBssids.clear(); - mScanId = 0; } private Collection<ScanResult> updateScanResultCache(final List<ScanResult> newResults) { @@ -533,7 +523,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro /** * Update the internal list of access points. * - * <p>Do not called directly (except for forceUpdate), use {@link #updateAccessPoints()} which + * <p>Do not call directly (except for forceUpdate), use {@link #updateAccessPoints()} which * respects {@link #mStaleScanResults}. */ @GuardedBy("mLock") @@ -542,7 +532,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro WifiConfiguration connectionConfig = null; if (mLastInfo != null) { connectionConfig = getWifiConfigurationForNetworkId( - mLastInfo.getNetworkId(), mWifiManager.getConfiguredNetworks()); + mLastInfo.getNetworkId(), configs); } // Swap the current access points into a cached list. @@ -554,43 +544,12 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro accessPoint.clearConfig(); } - /* Lookup table to more quickly update AccessPoints by only considering objects with the - * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ - Multimap<String, AccessPoint> existingApMap = new Multimap<String, AccessPoint>(); - final Collection<ScanResult> results = updateScanResultCache(newScanResults); - // TODO(sghuman): This entire block only exists to populate the WifiConfiguration for - // APs, remove and refactor + final Map<String, WifiConfiguration> configsByKey = new ArrayMap(configs.size()); if (configs != null) { for (WifiConfiguration config : configs) { - if (config.selfAdded && config.numAssociation == 0) { - continue; - } - AccessPoint accessPoint = getCachedOrCreate(config, cachedAccessPoints); - if (mLastInfo != null && mLastNetworkInfo != null) { - accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo); - } - if (mIncludeSaved) { - // If saved network not present in scan result then set its Rssi to - // UNREACHABLE_RSSI - boolean apFound = false; - for (ScanResult result : results) { - if (result.SSID.equals(accessPoint.getSsidStr())) { - apFound = true; - break; - } - } - if (!apFound) { - accessPoint.setUnreachable(); - } - accessPoints.add(accessPoint); - existingApMap.put(accessPoint.getSsidStr(), accessPoint); - } else { - // If we aren't using saved networks, drop them into the cache so that - // we have access to their saved info. - cachedAccessPoints.add(accessPoint); - } + configsByKey.put(AccessPoint.getKey(config), config); } } @@ -626,40 +585,20 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro for (Map.Entry<String, List<ScanResult>> entry : scanResultsByApKey.entrySet()) { // List can not be empty as it is dynamically constructed on each iteration ScanResult firstResult = entry.getValue().get(0); - boolean found = false; - for (AccessPoint accessPoint : existingApMap.getAll(firstResult.SSID)) { - accessPoint.setScanResults(entry.getValue()); - found = true; - break; - } - // Only create a new AP / add to the list if it wasn't already in the saved configs - if (!found) { - AccessPoint accessPoint = - getCachedOrCreate(entry.getValue(), cachedAccessPoints); - if (mLastInfo != null && mLastNetworkInfo != null) { - accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo); - } - - // TODO(sghuman): Move isPasspointNetwork logic into AccessPoint.java - if (firstResult.isPasspointNetwork()) { - // Retrieve a WifiConfiguration for a Passpoint provider that matches - // the given ScanResult. This is used for showing that a given AP - // (ScanResult) is available via a Passpoint provider (provider friendly - // name). - try { - WifiConfiguration config = - mWifiManager.getMatchingWifiConfig(firstResult); - if (config != null) { - accessPoint.update(config); - } - } catch (UnsupportedOperationException e) { - // Passpoint not supported on the device. - } - } + AccessPoint accessPoint = + getCachedOrCreate(entry.getValue(), cachedAccessPoints); + if (mLastInfo != null && mLastNetworkInfo != null) { + accessPoint.update(connectionConfig, mLastInfo, mLastNetworkInfo); + } - accessPoints.add(accessPoint); + // Update the matching config if there is one, to populate saved network info + WifiConfiguration config = configsByKey.get(entry.getKey()); + if (config != null) { + accessPoint.update(config); } + + accessPoints.add(accessPoint); } } @@ -1052,6 +991,39 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro } } + /** + * Wraps the given {@link WifiListener} instance and executes it's methods on the Main Thread. + * + * <p>This mechanism allows us to no longer need a separate MainHandler and WorkHandler, which + * were previously both performing work, while avoiding errors which occur from executing + * callbacks which manipulate UI elements from a different thread than the MainThread. + */ + private static class WifiListenerWrapper implements WifiListener { + + private final Handler mHandler; + private final WifiListener mDelegatee; + + public WifiListenerWrapper(WifiListener listener) { + mHandler = new Handler(Looper.getMainLooper()); + mDelegatee = listener; + } + + @Override + public void onWifiStateChanged(int state) { + mHandler.post(() -> mDelegatee.onWifiStateChanged(state)); + } + + @Override + public void onConnectedChanged() { + mHandler.post(() -> mDelegatee.onConnectedChanged()); + } + + @Override + public void onAccessPointsChanged() { + mHandler.post(() -> mDelegatee.onAccessPointsChanged()); + } + } + public interface WifiListener { /** * Called when the state of Wifi has changed, the state will be one of diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java index b36dda9deecf..6be4936413b7 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java @@ -281,8 +281,6 @@ public class WifiTrackerTest { final WifiTracker wifiTracker = new WifiTracker( mContext, mockWifiListener, - true, - true, mockWifiManager, mockConnectivityManager, mockNetworkScoreManager, @@ -687,6 +685,7 @@ public class WifiTrackerTest { */ @Test public void trackPasspointApWithPasspointDisabled() throws Exception { + // TODO(sghuman): Delete this test and replace with a passpoint test WifiTracker tracker = createMockedWifiTracker(); // Add a Passpoint AP to the scan results. @@ -709,10 +708,7 @@ public class WifiTrackerTest { when(mockWifiManager.getConfiguredNetworks()) .thenReturn(new ArrayList<WifiConfiguration>()); when(mockWifiManager.getScanResults()).thenReturn(results); - doThrow(new UnsupportedOperationException()) - .when(mockWifiManager).getMatchingWifiConfig(any(ScanResult.class)); tracker.forceUpdate(); - verify(mockWifiManager).getMatchingWifiConfig(any(ScanResult.class)); } @Test @@ -758,7 +754,7 @@ public class WifiTrackerTest { tracker.forceUpdate(); verify(mockWifiManager).getConnectionInfo(); - verify(mockWifiManager, times(2)).getConfiguredNetworks(); + verify(mockWifiManager, times(1)).getConfiguredNetworks(); verify(mockConnectivityManager).getNetworkInfo(any(Network.class)); verify(mockWifiListener, never()).onAccessPointsChanged(); // mStaleAccessPoints is true diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index b286f89d0049..537e8dca39c8 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -523,9 +523,6 @@ class SettingsProtoDumpUtil { Settings.Global.WIFI_WAKEUP_ENABLED, GlobalSettingsProto.WIFI_WAKEUP_ENABLED); dumpSetting(s, p, - Settings.Global.WIFI_WAKEUP_AVAILABLE, - GlobalSettingsProto.WIFI_WAKEUP_AVAILABLE); - dumpSetting(s, p, Settings.Global.NETWORK_SCORING_UI_ENABLED, GlobalSettingsProto.NETWORK_SCORING_UI_ENABLED); dumpSetting(s, p, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index d1459bba90c1..adb4dbf98dd0 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2328,7 +2328,9 @@ public class SettingsProvider extends ContentProvider { // Get all uids for the user's packages. final List<PackageInfo> packages; try { - packages = mPackageManager.getInstalledPackages(0, user.id).getList(); + packages = mPackageManager.getInstalledPackages( + PackageManager.MATCH_UNINSTALLED_PACKAGES, + user.id).getList(); } catch (RemoteException e) { throw new IllegalStateException("Package manager not available"); } @@ -3015,7 +3017,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 152; + private static final int SETTINGS_VERSION = 153; private final int mUserId; @@ -3401,7 +3403,9 @@ public class SettingsProvider extends ContentProvider { // Fill each uid with the legacy ssaid to be backwards compatible. final List<PackageInfo> packages; try { - packages = mPackageManager.getInstalledPackages(0, userId).getList(); + packages = mPackageManager.getInstalledPackages( + PackageManager.MATCH_UNINSTALLED_PACKAGES, + userId).getList(); } catch (RemoteException e) { throw new IllegalStateException("Package manager not available"); } @@ -3416,6 +3420,9 @@ public class SettingsProvider extends ContentProvider { // Android Id doesn't exist for this package so create it. ssaidSettings.insertSettingLocked(uid, legacySsaid, null, true, info.packageName); + if (DEBUG) { + Slog.d(LOG_TAG, "Keep the legacy ssaid for uid=" + uid); + } } } } @@ -3540,21 +3547,9 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion == 146) { - // Version 147: Set the default value for WIFI_WAKEUP_AVAILABLE. - if (userId == UserHandle.USER_SYSTEM) { - final SettingsState globalSettings = getGlobalSettingsLocked(); - final Setting currentSetting = globalSettings.getSettingLocked( - Settings.Global.WIFI_WAKEUP_AVAILABLE); - if (currentSetting.getValue() == null) { - final int defaultValue = getContext().getResources().getInteger( - com.android.internal.R.integer.config_wifi_wakeup_available); - globalSettings.insertSettingLocked( - Settings.Global.WIFI_WAKEUP_AVAILABLE, - String.valueOf(defaultValue), - null, true, SettingsState.SYSTEM_PACKAGE_NAME); - } - } - + // Version 147: Removed. (This version previously allowed showing the + // "wifi_wakeup_available" setting). + // The setting that was added here is deleted in 153. currentVersion = 147; } @@ -3621,18 +3616,17 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion == 151) { - // Version 152: Reset wifi wake available for upgrading users - final SettingsState globalSettings = getGlobalSettingsLocked(); - final int defaultValue = getContext().getResources().getInteger( - com.android.internal.R.integer.config_wifi_wakeup_available); - globalSettings.insertSettingLocked( - Settings.Global.WIFI_WAKEUP_AVAILABLE, - String.valueOf(defaultValue), - null, true, SettingsState.SYSTEM_PACKAGE_NAME); - + // Version 152: Removed. (This version made the setting for wifi_wakeup enabled + // by default but it is now no longer configurable). + // The setting updated here is deleted in 153. currentVersion = 152; } + if (currentVersion == 152) { + getGlobalSettingsLocked().deleteSettingLocked("wifi_wakeup_available"); + currentVersion = 153; + } + // vXXX: Add new settings above this point. if (currentVersion != newVersion) { diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS new file mode 100644 index 000000000000..af6dd77224c4 --- /dev/null +++ b/packages/SystemUI/OWNERS @@ -0,0 +1,20 @@ +set noparent + +dsandler@google.com + +asc@google.com +ashaikh@google.com +beverlyt@google.com +cinek@google.com +cwren@google.com +evanlaird@google.com +jmonk@google.com +jaggies@google.com +jjaggi@google.com +juliacr@google.com +dupin@google.com +madym@google.com +roosa@google.com +shahrk@google.com +winsonc@google.com + diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index bf0d6799bfd1..3f5f76fa0add 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Volgende wekker gestel vir <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Vee uit"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Deaktiveer e-SIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Kan nie e-SIM deaktiveer nie"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Die e-SIM kan weens \'n fout nie gedeaktiveer word nie."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Het jy die patroon vergeet?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Verkeerde patroon"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken jou patroon"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Voer SIM se PIN in."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Voer SIM se PIN vir \"<xliff:g id="CARRIER">%1$s</xliff:g>\" in."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Deaktiveer e-SIM om toestel sonder mobiele diens te gebruik."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiveer e-SIM om toestel sonder mobiele diens te gebruik."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Voer PIN in"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Voer wagwoord in"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Kontak diensverskaffer vir besonderhede."</string> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index 340e5141c05d..1cd862d8e0cd 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ቀጣዩ ማንቂያ ለ<xliff:g id="ALARM">%1$s</xliff:g> ተዘጋጅቷል"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ሰርዝ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMን አሰናክል"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMን ማሰናከል አልተቻለም"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"በአንድ ስህተት ምክንያት eSIM ሊሰናከል አልቻለም።"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"አስገባ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ስርዓተ ጥለቱን እርሳ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"የተሳሳተ ስርዓተ ጥለት"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ስርዓተ ጥለትዎን ይሳሉ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"የሲም ፒን ያስገቡ።"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"የ«<xliff:g id="CARRIER">%1$s</xliff:g>» ሲም ፒን ያስገቡ።"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"መሣሪያን ያለተንቀሳቃሽ ስልክ አገልግሎት ለመጠቀም eSIMን ያሰናክሉ።"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> መሣሪያን ያለሞባይል አገልግሎት ለመጠቀም eSIMን ያሰናክሉ።"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ፒን ያስገቡ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"የይለፍ ቃል ያስገቡ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ሲም አሁን ተሰናክሏል። ለመቀጠል የፒዩኬ ኮድ ያስገቡ። ለዝርዝር አገልግሎት አቅራቢን ያግኙ።"</string> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index b0503eade599..3ab93c5c21c9 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Növbəti zəng vaxtı: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Silin"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSİM\'i deaktiv edin"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-i deaktiv etmək alınmadı"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM xəta səbəbi ilə deaktiv edilmədi."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Daxil edin"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Modeli unutmuşam"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Model"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Modeli çəkin"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN\'ni daxil edin."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" üçün SIM PIN\'ni daxil edin."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Mobil xidmət olmadan cihazı istifadə etmək üçün eSIM\'i deaktiv edin."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Mobil xidmət olmadan cihazı istifadə etmək üçün eSIM-i deaktiv edin."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN daxil edin"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Parol daxil edin"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM indi deaktivdir. Davam etmək üçün PUK kod daxil edin. Ətraflı məlumat üçün operatorla əlaqə saxlayın."</string> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 791f5e9626fb..81c56da4146b 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পরবর্তী অ্যালার্ম <xliff:g id="ALARM">%1$s</xliff:g> এ সেট করা হয়েছে"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মুছুন"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"ই-সিমটি অক্ষম করুন"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এন্টার"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"প্যাটার্ন ভুলে গেছি"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল প্যাটার্ন"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"আপনার প্যাটার্ন আঁকুন"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"সিমের পিন লিখুন।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"মোবাইল পরিষেবা ছাড়াই ডিভাইস ব্যবহার করতে ই-সিম অক্ষম করুন।"</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"পিন লিখুন"</string> <string name="kg_password_instructions" msgid="136952397352976538">"পাসওয়ার্ড লিখুন"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"সিমটি এখন অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোডটি লিখুন। বিশদ বিবরণের জন্য পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 1f6addfb2892..6ff819ca45e6 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM karticu"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string> @@ -66,7 +70,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte uzorak"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN SIM kartice."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogućite eSIM karticu za korištenje uređaja bez mobilne usluge."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da nastavite. Za više informacija obratite se operateru."</string> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index dd2844abb6ec..511516ea7926 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"S\'ha definit la pròxima alarma per a l\'hora següent: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Suprimeix"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desactiva l\'eSIM"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retorn"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"He oblidat el patró"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"El patró no és correcte"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuixa el patró"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introdueix el PIN de la SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desactiva l\'eSIM per utilitzar el dispositiu sense servei mòbil."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introdueix el PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Introdueix la contrasenya"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La SIM està desactivada. Introdueix el codi PUK per continuar. Contacta amb l\'operador de telefonia mòbil per obtenir més informació."</string> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index cf7abf121301..d5f80cbd227a 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Další budík je nastaven na <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Smazat"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Deaktivovat eSIM kartu"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nelze deaktivovat eSIM kartu"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM kartu kvůli chybě nelze deaktivovat."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zapomenuté gesto"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nesprávné gesto"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Zadejte gesto"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Zadejte kód PIN SIM karty."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Zadejte kód PIN SIM karty <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"eSIM kartu deaktivujte, chcete-li telefon používat bez mobilních služeb."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> eSIM kartu deaktivujte, chcete-li zařízení používat bez mobilních služeb."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Zadejte kód PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Zadejte heslo"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta byla zablokována. Chcete-li pokračovat, je třeba zadat kód PUK. Podrobné informace získáte od operátora."</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index b6dc72b52bfe..57b98fa47238 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disable eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Can’t disable eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"The eSIM can’t be disabled due to an error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disable eSIM to use device without mobile service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index b6dc72b52bfe..57b98fa47238 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disable eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Can’t disable eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"The eSIM can’t be disabled due to an error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disable eSIM to use device without mobile service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index b6dc72b52bfe..57b98fa47238 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disable eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Can’t disable eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"The eSIM can’t be disabled due to an error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disable eSIM to use device without mobile service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index b6dc72b52bfe..57b98fa47238 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disable eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Can’t disable eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"The eSIM can’t be disabled due to an error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgotten Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \'<xliff:g id="CARRIER">%1$s</xliff:g>\'."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disable eSIM to use device without mobile service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index 97d16c6ed0a5..d27d204165e0 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Next alarm set for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disable eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Can’t disable eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"The eSIM can’t be disabled due to an error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Forgot Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Wrong Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Draw your pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Enter SIM PIN."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Enter SIM PIN for \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disable eSIM to use device without mobile service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disable eSIM to use device without mobile service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Enter PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Enter Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM is now disabled. Enter PUK code to continue. Contact carrier for details."</string> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index ec36fd73966f..780d8d4b53ff 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Inhabilita la tarjeta eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"No se puede inhabilitar la tarjeta eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"No se puede mostrar la tarjeta eSIM debido a un error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"¿Has olvidado el patrón?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Patrón incorrecto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduce el PIN de la tarjeta SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduce el PIN de la tarjeta SIM de <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Inhabilita la tarjeta eSIM para utilizar el dispositivo sin servicio móvil."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduce el PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Introduce tu contraseña"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, introduce el código PUK. Si quieres obtener más información, ponte en contacto con el operador."</string> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index 2b14e3c977bc..44aab01c1052 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Seuraava hälytys asetettu: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Poista"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Poista eSIM käytöstä"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMiä ei voi poistaa käytöstä"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Tapahtui virhe, eikä eSIMiä voitu poistaa käytöstä."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Unohtunut kuvio"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Väärä kuvio"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Piirrä kuvio"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Anna SIM-kortin PIN-koodi."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Anna operaattorin <xliff:g id="CARRIER">%1$s</xliff:g> SIM-kortin PIN-koodi."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Poista eSIM käytöstä, jos haluat käyttää laitetta ilman mobiilipalvelua."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Poista eSIM käytöstä, jos haluat käyttää laitetta ilman mobiililiittymää."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Anna PIN-koodi."</string> <string name="kg_password_instructions" msgid="136952397352976538">"Anna salasana"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortti on nyt poistettu käytöstä. Jatka antamalla PUK-koodi. Saat lisätietoja ottamalla yhteyttä operaattoriin."</string> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index b033311f37b9..e0b14b9232fc 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Supprimer"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Désactiver la carte eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Impossible de désactiver la carte eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"La carte eSIM ne peut pas être réinitialisée à cause d\'une erreur."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Entrée"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Schéma incorrect"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Entrez le NIP de la carte SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Entrez le NIP de la carte SIM pour « <xliff:g id="CARRIER">%1$s</xliff:g> »."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service cellulaire."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Entrez le NIP"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Entrez votre mot de passe."</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Pour obtenir plus de détails, communiquez avec votre fournisseur de services."</string> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index c62bab861686..d2e6c023d3f5 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> માટે આગલું એલાર્મ સેટ કર્યું"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"કાઢી નાખો"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMને અક્ષમ કરો"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"દાખલ કરો"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"પૅટર્ન ભૂલી ગયાં"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ખોટી પૅટર્ન"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"તમારી પૅટર્ન દોરો"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"સિમ પિન દાખલ કરો"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા eSIMને અક્ષમ કરો."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"પિન દાખલ કરો"</string> <string name="kg_password_instructions" msgid="136952397352976538">"પાસવર્ડ દાખલ કરો"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"સિમ હમણાં અક્ષમ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. વિગતો માટે કૅરિઅરનો સંપર્ક કરો."</string> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 641c0727085a..dfd06b2824bd 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अगला अलार्म <xliff:g id="ALARM">%1$s</xliff:g> बजे के लिए सेट किया गया है"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मिटाएं"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM अक्षम करें"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पैटर्न भूल गए हैं"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत पैटर्न"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"अपना पैटर्न बनाएं"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन डालें."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"मोबाइल सेवा के बिना डिवाइस का उपयोग करने के लिए eSIM अक्षम करें."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"पिन डालें"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड डालें"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम अब काम नहीं करेगा. जारी रखने के लिए PUK कोड डालें. ज़्यादा जानकारी के लिए अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें."</string> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 813377aa961a..96bcb1097d05 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Prossima sveglia impostata a: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Elimina"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Disattiva eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Impossibile disattivare la eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Impossibile disattivare la eSIM a causa di un errore."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Invio"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Sequenza dimenticata"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Sequenza sbagliata"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Inserisci la sequenza"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Inserisci il PIN della SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Inserisci il PIN della SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Disattiva l\'eSIM per usare il dispositivo senza servizio dati mobile."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Disattiva la eSIM per usare il dispositivo senza servizio dati mobile."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Inserisci PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Inserisci la password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La scheda SIM è disattivata. Inserisci il codice PUK per continuare. Contatta l\'operatore per avere informazioni dettagliate."</string> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 2c291124aa93..690ce658845c 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> ಗಂಟೆಗೆ ಮುಂದಿನ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ಅಳಿಸಿ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ನಮೂದಿಸಿ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ಪ್ಯಾಟರ್ನ್ ಮರೆತಿದ್ದೀರಿ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ಮೊಬೈಲ್ ಸೇವೆ ಇಲ್ಲದೆಯೇ ಸಾಧನವನ್ನು ಬಳಸಲು eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"ಪಿನ್ ನಮೂದಿಸಿ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ಈಗ ಸಿಮ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 545d32a249d1..10a81d03200a 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ລຶບ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"ປິດການໃຊ້ eSIM ແລ້ວ"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ປ້ອນເຂົ້າ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ລືມຮູບແບບປົດລັອກ?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ຮູບແບບຜິດ"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ປິດການໃຊ້ eSIM ເພື່ອໃຊ້ອຸປະກອນໂດຍບໍ່ມີບໍລິການມືຖື."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"ໃສ່ລະຫັດ PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ໃສ່ລະຫັດຜ່ານ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ຊິມຖືກປິດການນຳໃຊ້ແລ້ວ. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ."</string> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 095178739d66..d060ff421171 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Следниот аларм е поставен во <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Избриши"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Оневозможи ја eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Не може да се оневозможи eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM-картичката не може да се оневозможи поради грешка."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Внеси"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ја заборавивте шемата?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Погрешна шема"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте ја шемата"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Внесете PIN на SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Внесете PIN на SIM за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Оневозможете ја eSIM за да го користите уредот без мобилна услуга."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Оневозможете ја eSIM-картичката за да го користите уредот без мобилна услуга."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Внесете PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Внесете лозинка"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Контактирајте со операторот за детали."</string> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index d62537dcd65c..7e12a227bff6 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"അടുത്ത അലാറം <xliff:g id="ALARM">%1$s</xliff:g>-ന് സജ്ജീകരിച്ചു"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ഇല്ലാതാക്കുക"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM പ്രവർത്തനരഹിതമാക്കുക"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"എന്റർ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"പാറ്റേൺ മറന്നു"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"പാറ്റേൺ തെറ്റാണ്"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"സിം പിൻ നൽകുക."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"മൊബൈൽ സേവനമില്ലാതെ ഉപകരണം ഉപയോഗിക്കാൻ eSIM പ്രവർത്തനരഹിതമാക്കുക."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"പിൻ നൽകുക"</string> <string name="kg_password_instructions" msgid="136952397352976538">"പാസ്വേഡ് നൽകുക"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 7d04edc8b785..daa40c60d99b 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"पुढील अलार्म <xliff:g id="ALARM">%1$s</xliff:g> साठी सेट केला"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"हटवा"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM बंद करा"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"एंटर करा"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पॅटर्न विसरलात"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"चुकीचा पॅटर्न"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"तुमचा पॅटर्न काढा"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन एंटर करा"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"मोबाइल सेवांशिवाय डिव्हाइस वापरण्यासाठी eSIM बंद करा."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"पिन एंटर करा"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड एंटर करा"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम आता अक्षम केले आहे. सुरू ठेवण्यासाठी PUK कोड एंटर करा. तपशीलांसाठी वाहकाशी संपर्क साधा."</string> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index fb8558989868..a7236cf976bf 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"နောက်နှိုးစက်အချိန်ကို <xliff:g id="ALARM">%1$s</xliff:g> တွင် သတ်မှတ်ထားပါသည်"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ဖျက်ရန်"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ကို ပိတ်ရန်"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM ကို ပိတ်၍မရခြင်း"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"အမှားအယွင်းရှိနေသောကြောင့် eSIM ကို ပိတ်၍မရပါ။"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter ခလုတ်"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ပုံစံအား မေ့သွားပါသည်"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ပုံစံ မမှန်ကန်ပါ"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ပုံစံကို ဆွဲပါ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ဆင်းမ်ကဒ် ပင်နံပါတ်ကို ထည့်ပါ။"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" အတွက် ဆင်းမ်ကဒ်ပင်နံပါတ်ကို ထည့်ပါ။"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"စက်ပစ္စည်းကို မိုဘိုင်းဝန်ဆောင်မှုမပါဘဲ အသုံးပြုရန် eSIM ကို ပိတ်ပါ။"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> မိုဘိုင်းဝန်ဆောင်မှု မရှိဘဲ စက်ပစ္စည်းကို အသုံးပြုရန် eSIM ကို ပိတ်ပါ။"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ပင်နံပါတ်ကို ထည့်ပါ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"စကားဝှက်ကို ထည့်ပါ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်ကို ထည့်ပါ။ ပိုမိုလေ့လာရန် မိုဘိုင်းဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်နိုင်ပါသည်။"</string> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index ca51c968b410..2c0e3d6c4c3a 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Neste alarm er stilt inn for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Slett"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Deaktiver e-SIM-kortet"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glemt mønsteret?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Feil mønster"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn mønsteret ditt"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Skriv inn PIN-koden for SIM-kortet."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Deaktiver e-SIM-kortet for å bruke enheten uten mobiltjeneste."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"Skriv inn PIN-koden"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Skriv inn passordet"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 90d6c5cfc00c..dcb309f59d04 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अर्को अलार्म <xliff:g id="ALARM">%1$s</xliff:g> का लागि सेट गरियो"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मेट्नुहोस्"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM लाई असक्षम पार्नुहोस्"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"प्रविष्टि गर्नुहोस्"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ढाँचा बिर्सनुभयो"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत ढाँचा"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"आफ्नो ढाँचा कोर्नुहोस्"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्ट गर्नुहोस्।"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"मोबाइल सेवा बिना यन्त्रको प्रयोग गर्न eSIM लाई असक्षम पार्नुहोस्।"</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN प्रविष्टि गर्नुहोस्"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड प्रविष्ट गर्नुहोस्"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM कार्ड अहिले असक्षम छ। सुचारु गर्नको लागि PUK कोड प्रविष्ट गर्नुहोस्। विवरणको लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।"</string> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index d5d27cacf525..ddb83e980be7 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ਅਗਲਾ ਅਲਾਰਮ <xliff:g id="ALARM">%1$s</xliff:g> \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ਮਿਟਾਓ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ਦਾਖਲ ਕਰੋ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ਗਲਤ ਪੈਟਰਨ"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ eSIM ਬੰਦ ਕਰੋ।"</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ਸਿਮ ਹੁਣ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index bb547f157185..5c02d4fd5926 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Excluir"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desativar eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Não é possível desativar o eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Não é possível desativar o eSIM devido a um erro."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Inserir"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueci o padrão"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Informe o PIN do cartão SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Informe o PIN do cartão SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desative o eSIM para usar o dispositivo sem serviço móvel."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Digite o PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Digite a senha"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O SIM foi desativado. Insira o código PUK para continuar. Entre em contato com a operadora para mais detalhes."</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 6a0e6274b161..73f2b7f1e2a7 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desativar eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Não é possível desativar o eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Não é possível desativar o eSIM devido a um erro."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Tecla Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueceu-se do padrão"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe o seu padrão"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduza o PIN do cartão SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduza o PIN do cartão SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desativar eSIM para utilizar sem serviço móvel"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para utilizar o dispositivo sem serviço móvel."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduza o PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Introduza a palavra-passe"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O cartão SIM está agora desativado. Introduza o código PUK para continuar. Contacte o operador para obter mais detalhes."</string> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index bb547f157185..5c02d4fd5926 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próximo alarme definido para <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Excluir"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desativar eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Não é possível desativar o eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Não é possível desativar o eSIM devido a um erro."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Inserir"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueci o padrão"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrão incorreto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenhe seu padrão"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Informe o PIN do cartão SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Informe o PIN do cartão SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desative o eSIM para usar o dispositivo sem serviço móvel."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desative o eSIM para usar o dispositivo sem serviço móvel."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Digite o PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Digite a senha"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"O SIM foi desativado. Insira o código PUK para continuar. Entre em contato com a operadora para mais detalhes."</string> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 341c95297733..f449701b8bcb 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Următoarea alarmă este setată pentru <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ștergeți"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Dezactivați cardul eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nu se poate dezactiva cardul eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Cardul eSIM nu poate fi dezactivat din cauza unei erori."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Introduceți"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ați uitat modelul"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Model greșit"</string> @@ -66,7 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Desenați modelul"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduceți codul PIN al cardului SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduceți codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Dezactivați cardul eSIM pentru a folosi dispozitivul fără serviciu mobil."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduceți codul PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Introduceți parola"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Cardul SIM este acum dezactivat. Pentru a continua, introduceți codul PUK. Pentru detalii, contactați operatorul."</string> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 1a794ee0a7b4..dbdbf9303554 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Время следующего сигнала будильника: <xliff:g id="ALARM">%1$s</xliff:g>."</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Удалить"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Отключить eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Произошла ошибка"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Не удалось отключить eSIM."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Клавиша ввода"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Забыли графический ключ?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Неверный графический ключ"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Введите графический ключ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Введите PIN-код SIM-карты."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Введите PIN-код SIM-карты \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Чтобы пользоваться устройством без мобильной связи, отключите eSIM."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Чтобы пользоваться устройством без мобильной связи, отключите eSIM."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Введите PIN-код"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Введите пароль"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-карта отключена. Чтобы продолжить, введите PUK-код. За подробной информацией обратитесь к оператору связи."</string> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index d36e7520b6ad..a670f16c743e 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g>ට ඊළඟ එලාමය සකසා ඇත"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"මකන්න"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM අබල කරන්න"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM අබල කළ නොහැකිය."</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"දෝෂයක් හේතුවෙන් eSIM අබල කළ නොහැකිය."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ඇතුල් කරන්න"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"රටාව අමතකයි"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"වැරදි රටාවකි"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ඔබගේ රටාව අඳින්න"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN ඇතුළු කරන්න"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" සඳහා SIM PIN ඇතුළු කරන්න"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ජංගම සේවාවෙන් තොරව උපාංගය භාවිත කිරීමට eSIM අබල කරන්න."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ජංගම සේවාවෙන් තොරව උපාංගය භාවිත කිරීමට eSIM අබල කරන්න."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN එක ඇතුළු කරන්න"</string> <string name="kg_password_instructions" msgid="136952397352976538">"මුරපදය ඇතුළු කරන්න"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"දැන් SIM එක අබල කර ඇත. ඉදිරියට යාමට PUK කේතය යොදන්න. විස්තර සඳහා වාහකයා අමතන්න."</string> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 7e85131783eb..06acf81d13a7 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Kengele inayofuata italia saa <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Futa"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Zima eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Imeshindwa kuzima eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Hitilafu imetokea wakati wa kuzima eSIM."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Weka"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Umesahau Mchoro"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Mchoro si Sahihi"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Chora mchoro wako"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Weka PIN ya SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Weka PIN ya SIM ya \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Zima eSIM ili utumie kifaa bila huduma ya vifaa vya mkononi."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zima eSIM ili utumie kifaa bila huduma ya vifaa vya mkononi."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Weka PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Weka Nenosiri"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM sasa imefungwa. Weka nambari ya PUK ili uendelee. Wasiliana na mtoa huduma za mtandao kwa maelezo."</string> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index 2ce57a09875c..376c74f29338 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"அடுத்த அலாரம் <xliff:g id="ALARM">%1$s</xliff:g>க்கு அமைக்கப்பட்டுள்ளது"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"நீக்கும் பொத்தான்"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"இ-சிம்மை முடக்கும்"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"என்டர் பொத்தான்"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"பேட்டர்ன் நினைவில்லையா"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"தவறான பேட்டர்ன்"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"பேட்டர்னை வரையவும்"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"சிம் பின்னை உள்ளிடவும்."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"மொபைல் சேவை இல்லாமல் சாதனத்தைப் பயன்படுத்த, இ-சிம்மை முடக்கவும்."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"பின்னை உள்ளிடவும்"</string> <string name="kg_password_instructions" msgid="136952397352976538">"கடவுச்சொல்லை உள்ளிடவும்"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர, PUK குறியீட்டை உள்ளிடவும். விவரங்களுக்கு, தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index bdee4a3a0b66..934d6a234cee 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"తర్వాత అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"తొలగించు"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMని నిలిపివేయండి"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"నమూనాను మర్చిపోయాను"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ఆకృతి తప్పు"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"మీ నమూనాను గీయండి"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM పిన్ని నమోదు చేయండి."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్ని నమోదు చేయండి."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"మొబైల్ సేవ లేకుండా డివైజ్ని ఉపయోగించడం కోసం eSIMని నిలిపివేయండి."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"పిన్ను నమోదు చేయండి"</string> <string name="kg_password_instructions" msgid="136952397352976538">"పాస్వర్డ్ని నమోదు చేయండి"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ఇప్పుడు SIM నిలిపివేయబడింది. కొనసాగించాలంటే, PUK కోడ్ను నమోదు చేయండి. వివరాల కోసం క్యారియర్ను సంప్రదించండి."</string> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index ca53dfb8fd69..e716ee488434 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> olarak ayarlandı"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM\'i devre dışı bırak"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Deseni unuttunuz mu?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Desen"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Deseninizi çizin"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN kodunu girin."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Cihazı mobil hizmet olmadan kullanmak için eSIM\'i devre dışı bırakın."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN\'i girin"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Şifreyi Girin"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kart artık devre dışı bırakıldı. Devam etmek için PUK kodunu girin. Ayrıntılı bilgi için operatörle bağlantı kurun."</string> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index 4b79744573d6..277b1033e747 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Наступний сигнал: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Видалити"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Вимкнути eSIM-карту"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Не вдається вимкнути eSIM-карту"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Не вдається вимкнути eSIM-карту через помилку."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Ввести"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Не пам’ятаю ключ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Неправильний ключ"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйте ключ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Введіть PIN-код SIM-карти."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Введіть PIN-код SIM-карти для оператора \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Вимкнути eSIM-карту, щоб використовувати пристрій без мобільного зв’язку."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Вимкніть eSIM-карту, щоб використовувати пристрій без мобільного зв’язку."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Введіть PIN-код"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Введіть пароль"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Зараз SIM-карту вимкнено. Введіть PUK-код, щоб продовжити. Зв’яжіться з оператором, щоб дізнатися більше."</string> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index cd99c9279890..28a52c0eb613 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"اگلا الارم <xliff:g id="ALARM">%1$s</xliff:g> کیلئے سیٹ ہے"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"حذف کریں"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM غیر فعال کریں"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"درج کریں"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"پیٹرن بھول گئے"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"غلط پیٹرن"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"اپنا پیٹرن ڈرا کریں"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN درج کریں۔"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔"</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN درج کریں"</string> <string name="kg_password_instructions" msgid="136952397352976538">"پاسورڈ درج کریں"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index 204bb8b0b737..3272cb28aa5b 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Signal <xliff:g id="ALARM">%1$s</xliff:g> da chalinadi."</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"O‘chirib tashlash"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMni faolsizlantirish"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter tugmasi"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Grafik kalit esimdan chiqdi"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Grafik kalit xato"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Grafik kalit chizing"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM karta PIN kodini kiriting."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi PIN kodini kiriting."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Qurilmadan mobil xizmatlarsiz foydalanish uchun eSIMni faolsizlantiring."</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN kodni kiriting"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Parol kiriting"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta hozir o‘chirilgan. Davom etish uchun PUK kodni kiriting. Batafsil axborot olish uchun tarmoq operatori bilan bog‘laning."</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index 45ab5938a286..ee234cc91634 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -53,6 +53,10 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"刪除"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM 卡"</string> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘記解鎖圖案"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"解鎖圖案錯誤"</string> @@ -65,7 +69,8 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出解鎖圖案"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"停用 eSIM 卡即可在沒有行動服務的情況下使用裝置。"</string> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> <string name="kg_pin_instructions" msgid="4069609316644030034">"輸入 PIN 碼"</string> <string name="kg_password_instructions" msgid="136952397352976538">"輸入密碼"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡已遭停用,輸入 PUK 碼即可繼續使用。如需瞭解詳情,請與電信業者聯絡。"</string> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index 2329320bdf30..2415bf38101d 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"I-alamu elandelayo esethelwe i-<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Susa"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Khubaza i-eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Ayikwazi ukukhubaz i-eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"I-eSIM ayikwakhi ukukhutshazwa ngenxa yephutha."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Faka"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ukhohlwe iphethini?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Iphatheni engalungile"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dweba iphethini yakho"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Faka i-PIN ye-SIM"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Faka i-PIN ye-SIM ye-\"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Khubaza i-eSIM ukusebenzisa idivayisi ngaphandle kwesevisi yeselula."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Khubaza i-eSIM ukuze usebenzise le sevisi yeselula."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Faka iphinikhodi"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Faka iphasiwedi"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Xhumana nenkampani yenethiwekhi ngemininingwane."</string> diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index 100c2aa51b4d..97472a49187a 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -20,7 +20,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/qs_footer" android:layout_width="match_parent" - android:layout_height="48dp" + android:layout_height="@dimen/qs_footer_height" android:elevation="4dp" android:baselineAligned="false" android:clickable="false" @@ -28,6 +28,12 @@ android:clipToPadding="false"> <View + android:id="@+id/qs_footer_background" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@drawable/qs_background_primary" /> + + <View android:id="@+id/qs_footer_divider" android:layout_width="match_parent" android:layout_height="1dp" diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 1dab76183864..15b0f002d3b2 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -54,7 +54,6 @@ android:layout_marginTop="@*android:dimen/quick_qs_offset_height" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="48dp" android:elevation="4dp" /> diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml index c2b1009c3137..a3118b0a5d91 100644 --- a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml +++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml @@ -84,7 +84,25 @@ android:layout_height="@dimen/screen_pinning_request_button_height" android:layout_weight="0" android:paddingStart="@dimen/screen_pinning_request_frame_padding" - android:paddingEnd="@dimen/screen_pinning_request_frame_padding" > + android:paddingEnd="@dimen/screen_pinning_request_frame_padding" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + <ImageView + android:id="@+id/screen_pinning_home_bg_light" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="matrix" + android:src="@drawable/screen_pinning_light_bg_circ" /> + + <ImageView + android:id="@+id/screen_pinning_home_bg" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingEnd="@dimen/screen_pinning_request_inner_padding" + android:paddingStart="@dimen/screen_pinning_request_inner_padding" + android:paddingTop="@dimen/screen_pinning_request_inner_padding" + android:scaleType="matrix" + android:src="@drawable/screen_pinning_bg_circ" /> <ImageView android:layout_width="match_parent" diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml index b5ef1d72fd8f..61fe906d65fc 100644 --- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml +++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml @@ -78,7 +78,25 @@ android:id="@+id/screen_pinning_home_group" android:layout_height="@dimen/screen_pinning_request_button_width" android:layout_width="@dimen/screen_pinning_request_button_height" - android:layout_weight="0" > + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + <ImageView + android:id="@+id/screen_pinning_home_bg_light" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:src="@drawable/screen_pinning_light_bg_circ" /> + + <ImageView + android:id="@+id/screen_pinning_home_bg" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:paddingLeft="@dimen/screen_pinning_request_inner_padding" + android:paddingTop="@dimen/screen_pinning_request_inner_padding" + android:paddingBottom="@dimen/screen_pinning_request_inner_padding" + android:src="@drawable/screen_pinning_bg_circ" /> <ImageView android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml index f3a6d44f5ec7..d1ca2ce5935c 100644 --- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml +++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml @@ -80,7 +80,27 @@ android:id="@+id/screen_pinning_home_group" android:layout_height="@dimen/screen_pinning_request_button_width" android:layout_width="@dimen/screen_pinning_request_button_height" - android:layout_weight="0" > + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent" > + + <ImageView + android:id="@+id/screen_pinning_home_bg_light" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_padding_negative" + android:src="@drawable/screen_pinning_light_bg_circ" /> + + <ImageView + android:id="@+id/screen_pinning_home_bg" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_button_offset" + android:paddingRight="@dimen/screen_pinning_request_inner_padding" + android:paddingTop="@dimen/screen_pinning_request_inner_padding" + android:paddingBottom="@dimen/screen_pinning_request_inner_padding" + android:src="@drawable/screen_pinning_bg_circ" /> <ImageView android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 53dff05b74ef..36298ca0c095 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -20,14 +20,15 @@ android:background="@android:color/transparent" android:theme="@style/qs_theme" android:clipChildren="false" > + <!-- right-aligned to be physically near volume button --> <LinearLayout android:id="@+id/volume_dialog" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical|end" + android:layout_gravity="center_vertical|right" android:minWidth="@dimen/volume_dialog_panel_width" android:background="@android:color/transparent" - android:layout_margin="12dp" + android:layout_margin="@dimen/volume_dialog_base_margin" android:translationZ="8dp" android:orientation="vertical" android:clipChildren="false" > @@ -38,8 +39,8 @@ android:layout_height="wrap_content" android:clipChildren="false" android:clipToPadding="false" - android:paddingTop="12dp" - android:paddingBottom="12dp" + android:paddingTop="10dp" + android:paddingBottom="10dp" android:background="@drawable/rounded_bg_full" android:translationZ="8dp" android:orientation="horizontal" > @@ -71,7 +72,7 @@ android:maxLines="1" android:layout_centerVertical="true" android:textColor="?android:attr/colorControlNormal" - android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="@style/TextAppearance.Volume.Header" /> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/ringer_icon" @@ -89,7 +90,7 @@ android:ellipsize="end" android:maxLines="1" android:textColor="?android:attr/colorControlNormal" - android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" /> </LinearLayout> </LinearLayout> diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index a9e5adfa531a..70654a803b44 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -29,15 +29,16 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:padding="10dp"> + android:padding="5dp"> <TextView android:id="@+id/volume_row_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" + android:maxLength="10" android:maxLines="1" android:textColor="?android:attr/colorControlNormal" - android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="@style/TextAppearance.Volume.Header" /> <LinearLayout android:id="@+id/output_chooser" android:orientation="vertical" @@ -53,9 +54,10 @@ android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:maxLength="10" android:ellipsize="end" android:maxLines="1" - android:textAppearance="@style/TextAppearance.QS.DetailItemSecondary" /> + android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" /> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/output_chooser_button" android:layout_width="24dp" @@ -73,15 +75,18 @@ android:id="@+id/volume_row_slider_frame" android:padding="0dp" android:layout_width="@dimen/volume_dialog_panel_width" - android:layout_height="150dp"> + android:layoutDirection="rtl" + android:layout_height="@dimen/volume_dialog_panel_width"> <SeekBar android:id="@+id/volume_row_slider" + android:clickable="true" android:padding="0dp" android:layout_margin="0dp" - android:layout_width="150dp" + android:layout_width="@dimen/volume_dialog_panel_width" android:layout_height="@dimen/volume_dialog_panel_width" + android:layoutDirection="rtl" android:layout_gravity="center" - android:rotation="270" /> + android:rotation="90" /> </FrameLayout> <com.android.keyguard.AlphaOptimizedImageButton diff --git a/packages/SystemUI/res/values-af/config.xml b/packages/SystemUI/res/values-af/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-af/config.xml +++ b/packages/SystemUI/res/values-af/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 52420299370b..9d090ba744c2 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"maak kamera oop"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Kies nuwe taakuitleg"</string> <string name="cancel" msgid="6442560571259935130">"Kanselleer"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Programikoon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Hulpboodskapgebied"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Versoenbaarheid-zoem se knoppie."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoem kleiner na groter skerm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth gekoppel."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi af"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi is aan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen Wi-Fi-netwerke beskikbaar nie"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Saai uit"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Saai tans uit"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Onbenoemde toestel"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Koppel tans …"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"USB-verbinding"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Warmkol"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Skakel tans aan …"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d toestelle</item> + <item quantity="one">%d toestel</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Kennisgewings"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flitslig"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiele data"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> gebruik"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g>-limiet"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> waarskuwing"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Werkprofiel"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Kennisgewings en programme is af"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Aandbeligting"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan by sonsondergang"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot sonsopkoms"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is in veiligmodus gedeaktiveer."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vee alles uit"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trek hier om verdeelde skerm te gebruik"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swiep op om programme te wissel"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Verdeel horisontaal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verdeel vertikaal"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Verdeel gepasmaak"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Skakel nou af"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Vou uit"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Vou in"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Wissel uitvoertoestel"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skerm is vasgespeld"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Oorsig om dit te ontspeld."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Het dit"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nee, dankie"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Versteek <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Dit sal verskyn die volgende keer wanneer jy dit in instellings aanskakel."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Versteek"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Met kragkennisgewingkontroles kan jy \'n belangrikheidvlak van 0 tot 5 vir \'n program se kennisgewings stel. \n\n"<b>"Vlak 5"</b>" \n- Wys aan die bokant van die kennisgewinglys \n- Laat volskermonderbreking toe \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 4"</b>" \n- Verhoed volskermonderbreking \n- Wys altyd opspringkennisgewings \n\n"<b>"Vlak 3"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n\n"<b>"Vlak 2"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n\n"<b>"Vlak 1"</b>" \n- Verhoed volskermonderbreking \n- Verhoed opspringkennisgewings \n- Moet nooit \'n klank maak of vibreer nie \n- Versteek van sluitskerm en statusbalk \n- Wys aan die onderkant van die kennisgewinglys \n\n"<b>"Vlak 0"</b>" \n- Blokkeer alle kennisgewings van die program af"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Kennisgewings"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Jy sal nie meer hierdie kennisgewings sien nie"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Jy maak hierdie kennisgewings gewoonlik toe. \nMoet ons aanhou om hulle te wys?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Hou aan om hierdie kennisgewings te wys?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop kennisgewings"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Hou aan wys"</string> diff --git a/packages/SystemUI/res/values-am/config.xml b/packages/SystemUI/res/values-am/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-am/config.xml +++ b/packages/SystemUI/res/values-am/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index f08c71e8c66d..cf1adf2d9a7d 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ካሜራ ክፈት"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string> <string name="cancel" msgid="6442560571259935130">"ይቅር"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"የመተግበሪያ አዶ"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"የእገዛ መልዕክት አካባቢ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"የተኳኋኝአጉላ አዝራር።"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"አነስተኛውን ማያ ወደ ትልቅ አጉላ።"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ብሉቱዝ ተያይዟል።"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ጠፍቷል"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"በማገናኘት ላይ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"በማገናኘት ላይ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"መገናኛ ነጥብ"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"በማብራት ላይ..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d መሣሪያዎች</item> + <item quantity="other">%d መሣሪያዎች</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ማሳወቂያዎች"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"የባትሪ ብርሃን"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"የተንቀሳቃሽ ስልክ ውሂብ"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ጥቅም ላይ ውሏል"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ገደብ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"የ<xliff:g id="DATA_LIMIT">%s</xliff:g> ማስጠንቀቂያ"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"የሥራ መገለጫ"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"ማሳወቂያዎች እና መተግበሪያዎች ጠፍተዋል"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"የምሽት ብርሃን"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ጸሐይ ስትጠልቅ ይበራል"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ጸሐይ እስክትወጣ ድረስ"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> በጥንቃቄ ሁነታ ውስጥ ታግዷል።"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ሁሉንም አጽዳ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"የተከፈለ ማያ ገጽን ለመጠቀም እዚህ ላይ ይጎትቱ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"አግድም ክፈል"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ቁልቁል ክፈል"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"በብጁ ክፈል"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"አሁን አጥፋ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"አስፋ"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ሰብስብ"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"የውጽዓት መሣሪያን ይቀይሩ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ማያ ገጽ ተሰክቷል"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና አጠቃላይ ዕይታ የሚለውን ይጫኑ እና ይያዙ።"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል አጠቃላይ ዕይታ ተጭነው ይያዙ።"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ገባኝ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"አይ፣ አመሰግናለሁ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ይደበቅ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"በቅንብሮች ውስጥ በሚቀጥለው ጊዜ እንዲበራ በሚያደርጉበት ጊዜ ዳግመኛ ብቅ ይላል።"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ደብቅ"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"በኃይል ማሳወቂያ መቆጣጠሪያዎች አማካኝነት የአንድ መተግበሪያ ማሳወቂያዎች የአስፈላጊነት ደረጃ ከ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="7506845022070889909">"ማሳወቂያዎች"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"እነዚህን ማሳወቂያዎችን ከእንግዲህ አይመለከቷቸውም"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"አብዛኛውን ጊዜ እነዚህን ማሳወቂያዎች ያሰናብቷቸዋል። \nመታየታቸው ይቀጥል??"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"እነዚህን ማሳወቂያዎች ማሳየት ይቀጥሉ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ማሳወቂያዎችን አስቁም"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ማሳየትን ቀጥል"</string> diff --git a/packages/SystemUI/res/values-ar/config.xml b/packages/SystemUI/res/values-ar/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ar/config.xml +++ b/packages/SystemUI/res/values-ar/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-az/config.xml b/packages/SystemUI/res/values-az/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-az/config.xml +++ b/packages/SystemUI/res/values-az/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 17d7718b9341..e00a2dd8d515 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"kemaranı açın"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni tapşırıq sxemi seçin"</string> <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Tətbiq ikonası"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı bölməsi"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyğunluq zoom düyməsi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha böyük ekranda uzaqlaşdır."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth qoşulub."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayım"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Qoşulur..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Birləşmə"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Aktiv edilir..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d cihaz</item> + <item quantity="one">%d cihaz</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Bildirişlər"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"İşartı"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobil data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"İndi deaktiv edin"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Genişləndirin"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Yığcamlaşdırın"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Çıxış cihazına keçin"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrana sancaq taxıldı"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım!"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Yox, çox sağ olun"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlədilsin?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlarda onu aktivləşdirəcəyiniz vaxta qədər o, yenidən görünəcək."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizlədin"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Enerji bildiriş nəzarəti ilə, tətbiq bildirişləri üçün əhəmiyyət səviyyəsini 0-dan 5-ə kimi ayarlaya bilərsiniz. \n\n"<b>"Səviyyə 5"</b>" \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n- Tam ekran kəsintisinə icazə verin \n- Hər zaman izləyin \n\n"<b>"Səviyyə 4"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Hər zaman izləyin \n\n"<b>"Level 3"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n\n"<b>"Level 2"</b>" \n- Tam ekran kəsintisinin qarşısını alın \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n\n"<b>"Səviyyə 1"</b>" \n- Prevent full screen interruption \n- Heç vaxt izləməyin \n- Heç vaxt səsliyə və ya vibrasiyaya qoymayın \n- Ekran kilidi və ya status panelindən gizlədin \n- Bildiriş siyahısının yuxarı hissəsində göstərin \n\n"<b>"Səviyyə 0"</b>" \n- Bütün bildirişləri tətbiqdən blok edin"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirişlər"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Artıq bu bildirişləri görməyəcəkəsiniz"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Adətən bu bildirişləri rədd edirsiniz. \nBildirişlər göstərilsin?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirişlər göstərilməyə davam edilsin?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bildirişləri dayandırın"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Göstərməyə davam edin"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/config.xml b/packages/SystemUI/res/values-b+sr+Latn/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/config.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-be/config.xml b/packages/SystemUI/res/values-be/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-be/config.xml +++ b/packages/SystemUI/res/values-be/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-bg/config.xml b/packages/SystemUI/res/values-bg/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-bg/config.xml +++ b/packages/SystemUI/res/values-bg/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-bn/config.xml b/packages/SystemUI/res/values-bn/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-bn/config.xml +++ b/packages/SystemUI/res/values-bn/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 4cbb5edbb5fe..eb08f5094db9 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string> <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"অ্যাপ্লিকেশনের আইকন"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"সহায়তার মেসেজ দেখানোর জায়গা"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"সামঞ্জস্যের জুম বোতাম৷"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ছোট থেকে বৃহৎ স্ক্রীণে জুম করুন৷"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযুক্ত হয়েছে৷"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ওয়াই-ফাই বন্ধ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাস্ট করুন"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"সংযুক্ত হচ্ছে..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেদারিং"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"চালু করা হচ্ছে…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%dটি ডিভাইস</item> + <item quantity="other">%dটি ডিভাইস</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"বিজ্ঞপ্তিগুলি"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্ল্যাশলাইট"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"মোবাইল ডেটা"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যবহৃত হয়েছে"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"সীমা <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সতর্কতা"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"কাজের প্রোফাইল"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"বিজ্ঞপ্তি ও অ্যাপ বন্ধ আছে"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"নাইট লাইট"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"সূর্যাস্তে চালু হবে"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"সূর্যোদয় পর্যন্ত"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"নিরাপদ মোডে <xliff:g id="APP">%s</xliff:g> অক্ষম করা হয়েছে৷"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"সবকিছু সাফ করুন"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভক্ত স্ক্রীন ব্যবহার করতে এখানে টেনে আনুন"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"অনুভূমিক স্প্লিট"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উল্লম্ব স্প্লিট"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"কাস্টম স্প্লিট করুন"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"এখনই বন্ধ করুন"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"বড় করুন"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"সঙ্কুচিত করুন"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্রিন পিন করা হয়েছে"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ফিরুন এবং ওভারভিউ স্পর্শ করে ধরে থাকুন।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ওভারভিউ স্পর্শ করে ধরে থাকুন৷"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"বুঝেছি"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"না থাক"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকাবেন?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপনি পরের বার সেটিংস-এ এটি চালু করলে এটি উপস্থিত হবে"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকান"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"পাওয়ার বিজ্ঞপ্তির নিয়ন্ত্রণগুলি ব্যহবার করে, আপনি কোনও অ্যাপ্লিকেশনের বিজ্ঞপ্তির জন্য ০ থেকে ৫ পর্যন্ত একটি গুরুত্বের লেভেলকে সেট করতে পারবেন৷ \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="7506845022070889909">"বিজ্ঞপ্তি"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"এই বিজ্ঞপ্তিগুলি আপনাকে আর দেখানো হবে না"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"এই বিজ্ঞপ্তিগুলিকে আপনি সাধারণত বাতিল করেন। \nসেগুলি দেখতে চান?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"এই বিজ্ঞপ্তিগুলি পরেও দেখে যেতে চান?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"বিজ্ঞপ্তি বন্ধ করুন"</string> <string name="inline_keep_button" msgid="6665940297019018232">"দেখতে থাকুন"</string> diff --git a/packages/SystemUI/res/values-bs/config.xml b/packages/SystemUI/res/values-bs/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-bs/config.xml +++ b/packages/SystemUI/res/values-bs/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 7f8d001cc2a8..676ecd0fe3a4 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -104,12 +104,9 @@ <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Prostor za poruku za pomoć"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme za uvećavanje u slučaju nekompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Uvećani prikaz manjeg ekrana na većem ekranu."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth je povezan."</string> @@ -210,13 +207,13 @@ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Uključen način rada u avionu."</string> <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Način rada u avionu je isključen."</string> <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Način rada u avionu je uključen."</string> - <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Opcija Ne ometaj je uključena, čut će se samo prioritetna obavještenja."</string> - <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Opcija Ne ometaj je uključena, potpuna tišina."</string> - <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Opcija Ne ometaj je uključena, čut će se samo alarmi."</string> + <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"Način rada Ne ometaj je uključen, čut će se samo prioritetna obavještenja."</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Način rada Ne ometaj je uključen, potpuna tišina."</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Način rada Ne ometaj je uključen, čut će se samo alarmi."</string> <string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Ne ometaj."</string> - <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Opcija Ne ometaj je isključena."</string> - <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Opcija Ne ometaj je isključena."</string> - <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Opcija Ne ometaj je uključena."</string> + <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Način rada Ne ometaj je isključen."</string> + <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Način rada Ne ometaj je isključen."</string> + <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"Način rada Ne ometaj je uključen."</string> <string name="accessibility_quick_settings_bluetooth" msgid="6341675755803320038">"Bluetooth."</string> <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth isključen."</string> <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth uključen."</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi isključen"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nema dostupnih Wi-Fi mreža"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string> @@ -329,9 +328,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Povezivanje..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Dijeljenje veze"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Pristupna tačka"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Uključivanje…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d uređaj</item> + <item quantity="few">%d uređaja</item> + <item quantity="other">%d uređaja</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obavještenja"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svjetiljka"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Prijenos podataka na mobilnoj mreži"</string> @@ -341,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Iskorišteno <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Radni profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Isključena su obavještenja i aplikacije"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noćno svjetlo"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svitanja"</string> @@ -362,8 +362,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> je onemogućena u sigurnom načinu rada."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje za korištenje podijeljenog ekrana"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prevucite prema gore za promjenu aplikacije"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podjela po horizontali"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podjela po vertikali"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođena podjela"</string> @@ -504,11 +503,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi sada"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je prikačen"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Razumijem"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojavit će se sljedeći put kada opciju uključite u postavkama."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string> @@ -590,8 +603,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Uz kontrolu obavještenja o napajanju, možete postaviti nivo značaja obavještenja iz aplikacije, i to od nivoa 0 do 5. \n\n"<b>"Nivo 5"</b>" \n- Prikaži na vrhu liste obavještenja \n- Dopusti prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nvio 4"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Uvijek izviruj \n\n"<b>"Nivo 3"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n\n"<b>"Nivo 2"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikad ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n\n"<b>"Nivo 1"</b>" \n- Spriječi prekid prikaza cijelog ekrana \n- Nikada ne izviruj \n- Nikada ne puštaj zvuk ili vibraciju \n- Sakrij sa ekrana za zaključavanje i statusne trake \n- Prikaži na dnu liste obavještenja \n\n"<b>"Nivo 0"</b>" \n- Blokiraj sva obavještenja iz aplikacije"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Obavještenja"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Nećete više vidjeti ova obavještenja"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obavještenja. \nNastaviti ih prikazivati?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Nastaviti prikazivanje ovih obavještenja?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavještenja"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivanje"</string> @@ -668,7 +680,7 @@ <string name="tuner_full_zen_title" msgid="4540823317772234308">"Prikazati sa kontrolama jačine zvuka"</string> <string name="volume_and_do_not_disturb" msgid="3373784330208603030">"Ne ometaj"</string> <string name="volume_dnd_silent" msgid="4363882330723050727">"Prečica za dugmad za Jačinu zvuka"</string> - <string name="volume_up_silent" msgid="7141255269783588286">"Deaktiviraj režim Ne ometaj kada se zvuk pojača"</string> + <string name="volume_up_silent" msgid="7141255269783588286">"Deaktiviraj način rada Ne ometaj kada se zvuk pojača"</string> <string name="battery" msgid="7498329822413202973">"Baterija"</string> <string name="clock" msgid="7416090374234785905">"Sat"</string> <string name="headset" msgid="4534219457597457353">"Slušalice s mikrofonom"</string> @@ -802,10 +814,10 @@ <string name="mobile_data" msgid="7094582042819250762">"Prijenos podataka na mobilnoj mreži"</string> <string name="wifi_is_off" msgid="1838559392210456893">"Wi-Fi veza je isključena"</string> <string name="bt_is_off" msgid="2640685272289706392">"Bluetooth je isključen"</string> - <string name="dnd_is_off" msgid="6167780215212497572">"Opcija Ne ometaj je isključena"</string> + <string name="dnd_is_off" msgid="6167780215212497572">"Način rada Ne ometaj je isključen"</string> <string name="qs_dnd_prompt_auto_rule" msgid="862559028345233052">"Opciju Ne ometaju uključilo je automatsko pravilo (<xliff:g id="ID_1">%s</xliff:g>)."</string> - <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"Opciju Ne ometaj uključila je aplikacija <xliff:g id="ID_1">%s</xliff:g>."</string> - <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"Opciju Ne ometaj uključilo je automatsko pravilo ili aplikacija."</string> + <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"Način rada Ne ometaj uključila je aplikacija <xliff:g id="ID_1">%s</xliff:g>."</string> + <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"Način rada Ne ometaj uključilo je automatsko pravilo ili aplikacija."</string> <string name="qs_dnd_until" msgid="3469471136280079874">"Do <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="qs_dnd_keep" msgid="1825009164681928736">"Zadrži"</string> <string name="qs_dnd_replace" msgid="8019520786644276623">"Zamijeni"</string> diff --git a/packages/SystemUI/res/values-ca/config.xml b/packages/SystemUI/res/values-ca/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ca/config.xml +++ b/packages/SystemUI/res/values-ca/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 8d61a9a24880..4eff30d6527e 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -33,13 +33,13 @@ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string> <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacions"</string> <string name="battery_low_title" msgid="6456385927409742437">"Queda poca bateria"</string> - <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca bateria. Activa el mode Estalvi de bateria."</string> + <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca bateria. Activa el mode d\'estalvi de bateria."</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>."</string> <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>; temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="battery_low_percent_format_hybrid_short" msgid="9025795469949145586">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>; temps restant aproximat: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="battery_low_percent_format_saver_started" msgid="7879389868952879166">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g>. La funció Estalvi de bateria està activada."</string> - <string name="invalid_charger" msgid="4549105996740522523">"Pujada d\'USB no admesa.\nUtilitza només el carregador proporcionat."</string> - <string name="invalid_charger_title" msgid="3515740382572798460">"La pujada per USB no és compatible."</string> + <string name="invalid_charger" msgid="4549105996740522523">"Càrrega per USB no admesa.\nUtilitza només el carregador proporcionat."</string> + <string name="invalid_charger_title" msgid="3515740382572798460">"La càrrega per USB no és compatible."</string> <string name="invalid_charger_text" msgid="5474997287953892710">"Fes servir només el carregador proporcionat amb el dispositiu."</string> <string name="battery_low_why" msgid="4553600287639198111">"Configuració"</string> <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"Vols activar la funció Estalvi de bateria?"</string> @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"obre la càmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el disseny de la tasca nova"</string> <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona d\'aplicació"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Àrea de missatge d\'ajuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botó de zoom de compatibilitat."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Amplia menys com més gran sigui la pantalla."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connectat."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desconnectada"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"La Wi-Fi està activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hi ha cap xarxa Wi-Fi disponible"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emet"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"S\'està connectant..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartició de xarxa"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Punt d\'accés Wi-Fi"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"S\'està activant..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositius</item> + <item quantity="one">%d dispositiu</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificacions"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Llanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dades mòbils"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Utilitzats: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertiment: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil professional"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notificacions i les aplicacions estan desactivades"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Llum nocturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"A la posta de sol"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Fins a l\'alba"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"En mode segur, l\'aplicació <xliff:g id="APP">%s</xliff:g> està desactivada."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Esborra-ho tot"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrossega-ho aquí per utilitzar la pantalla dividida"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Llisca cap amunt per canviar d\'aplicació"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisió horitzontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisió vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisió personalitzada"</string> @@ -370,7 +368,7 @@ <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"Divideix la pantalla cap a la dreta"</string> <string name="expanded_header_battery_charged" msgid="5945855970267657951">"Carregada"</string> <string name="expanded_header_battery_charging" msgid="205623198487189724">"S\'està carregant"</string> - <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> per completar la pujada"</string> + <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> per completar la càrrega"</string> <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"No s\'està carregant"</string> <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"És possible que la xarxa\nestigui controlada"</string> <string name="description_target_search" msgid="3091587249776033139">"Cerca"</string> @@ -397,9 +395,9 @@ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Silenci\ntotal"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Només\ninterr. prior."</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Només\nalarmes"</string> - <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregant (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar la pujada)"</string> - <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Pujada ràpida (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar-se)"</string> - <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Pujada lenta (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar-se)"</string> + <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Carregant (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar la càrrega)"</string> + <string name="keyguard_indication_charging_time_fast" msgid="9018981952053914986">"Càrrega ràpida (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar-se)"</string> + <string name="keyguard_indication_charging_time_slowly" msgid="955252797961724952">"Càrrega lenta (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> per completar-se)"</string> <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"Canvia d\'usuari"</string> <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"Canvia d\'usuari. Usuari actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_inactive" msgid="1424081831468083402">"Usuari actual: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desactiva ara"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Amplia"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Replega"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"La pantalla està fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes els botons Enrere i Aplicacions recents."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premut el botó Aplicacions recents."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"D\'acord"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, gràcies"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vols amagar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tornarà a mostrar-se la propera vegada que l\'activis a la configuració."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Amaga"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Amb els controls de notificació millorats, pots establir un nivell d\'importància d\'entre 0 i 5 per a les notificacions d\'una aplicació. \n\n"<b>"Nivell 5"</b>" \n- Mostra les notificacions a la part superior de la llista \n- Permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 4"</b>" \n- No permet la interrupció de la pantalla completa \n- Permet sempre la previsualització \n\n"<b>"Nivell 3"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n\n"<b>"Nivell 2"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- Les notificacions no poden emetre sons ni vibracions \n\n"<b>"Nivell 1"</b>" \n- No permet la interrupció de la pantalla completa \n- No permet mai la previsualització \n- No activa mai el so ni la vibració \n- Amaga les notificacions de la pantalla de bloqueig i de la barra d\'estat \n- Mostra les notificacions a la part inferior de la llista \n\n"<b>"Nivell 0"</b>" \n- Bloqueja totes les notificacions de l\'aplicació"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificacions"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Ja no veuràs aquestes notificacions"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalment ignores aquestes notificacions. \nVols que es continuïn mostrant?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vols continuar rebent aquestes notificacions?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Deixa d\'enviar notificacions"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continua rebent"</string> @@ -614,7 +625,7 @@ <item quantity="one">%d minut</item> </plurals> <string name="battery_panel_title" msgid="7944156115535366613">"Consum de la bateria"</string> - <string name="battery_detail_charging_summary" msgid="1279095653533044008">"La funció Estalvi de bateria no està disponible durant la pujada"</string> + <string name="battery_detail_charging_summary" msgid="1279095653533044008">"La funció Estalvi de bateria no està disponible durant la càrrega"</string> <string name="battery_detail_switch_title" msgid="6285872470260795421">"Estalvi de bateria"</string> <string name="battery_detail_switch_summary" msgid="9049111149407626804">"Redueix el rendiment i les dades en segon pla"</string> <string name="keyboard_key_button_template" msgid="6230056639734377300">"Botó <xliff:g id="NAME">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-cs/config.xml b/packages/SystemUI/res/values-cs/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-cs/config.xml +++ b/packages/SystemUI/res/values-cs/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 3c3e1d42c7bd..faa1f1f5e083 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -105,12 +105,9 @@ <string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string> <string name="cancel" msgid="6442560571259935130">"Zrušit"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikace"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast pro zprávu nápovědy"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tlačítko úpravy velikosti z důvodu kompatibility"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zvětšit menší obrázek na větší obrazovku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Rozhraní Bluetooth je připojeno."</string> @@ -317,6 +314,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi vypnuta"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Odeslat"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string> @@ -333,9 +332,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Připojování..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Sdílené připojení"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Zapínání..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="few">%d zařízení</item> + <item quantity="many">%d zařízení</item> + <item quantity="other">%d zařízení</item> + <item quantity="one">%d zařízení</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Oznámení"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svítilna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilní data"</string> @@ -345,10 +348,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využito: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornění při <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Pracovní profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Oznámení a aplikace jsou vypnuty"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noční režim"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Zapnout při soumraku"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do svítání"</string> @@ -366,8 +367,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikace <xliff:g id="APP">%s</xliff:g> je v nouzovém režimu zakázána."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazat vše"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Rozdělenou obrazovku můžete použít přetažením zde"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Přejetím nahoru přepnete aplikace"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vodorovné rozdělení"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikální rozdělení"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Vlastní rozdělení"</string> @@ -508,11 +508,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Vypnout"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozbalit"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sbalit"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Přepnout zařízení pro výstup"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je připnuta"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Přehled."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Rozumím"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, děkuji"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skrýt <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tato položka se znovu zobrazí, až ji v nastavení znovu zapnete."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrýt"</string> @@ -592,8 +605,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Rozšířené ovládací prvky oznámení umožňují nastavit úroveň důležitosti oznámení aplikace od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazit na začátku seznamu oznámení \n– Povolit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 4"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Vždy zobrazit náhled \n\n"<b>"Úroveň 3"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n\n"<b>"Úroveň 2"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat žádný zvukový signál ani nevibrovat \n\n"<b>"Úroveň 1"</b>" \n– Zabránit vyrušení na celou obrazovku \n– Nikdy nezobrazovat náhled \n– Nikdy nevydávat zvukový signál ani nevibrovat \n– Skrýt z obrazovky uzamčení a stavového řádku \n– Zobrazovat na konci seznamu oznámení \n\n"<b>";Úroveň 0"</b>" \n– Blokovat všechna oznámení z aplikace"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Oznámení"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Tato oznámení již nebudete dostávat"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Tato oznámení obvykle odmítáte. \nChcete je nadále zobrazovat?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Mají se tato oznámení nadále zobrazovat?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Přestat zobrazovat oznámení"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nadále zobrazovat"</string> diff --git a/packages/SystemUI/res/values-da/config.xml b/packages/SystemUI/res/values-da/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-da/config.xml +++ b/packages/SystemUI/res/values-da/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-de/config.xml b/packages/SystemUI/res/values-de/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-de/config.xml +++ b/packages/SystemUI/res/values-de/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-el/config.xml b/packages/SystemUI/res/values-el/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-el/config.xml +++ b/packages/SystemUI/res/values-el/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/config.xml b/packages/SystemUI/res/values-en-rAU/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-en-rAU/config.xml +++ b/packages/SystemUI/res/values-en-rAU/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 3f6d5e5fffd9..3e9e3a2349e3 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d devices</item> + <item quantity="one">%d device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Torch"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Turn off now"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"You won\'t see these notifications anymore"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> diff --git a/packages/SystemUI/res/values-en-rCA/config.xml b/packages/SystemUI/res/values-en-rCA/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-en-rCA/config.xml +++ b/packages/SystemUI/res/values-en-rCA/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index d49c25abafdc..e5f4ecedc679 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d devices</item> + <item quantity="one">%d device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flashlight"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Turn off now"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"You won\'t see these notifications anymore"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> diff --git a/packages/SystemUI/res/values-en-rGB/config.xml b/packages/SystemUI/res/values-en-rGB/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-en-rGB/config.xml +++ b/packages/SystemUI/res/values-en-rGB/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 3f6d5e5fffd9..3e9e3a2349e3 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d devices</item> + <item quantity="one">%d device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Torch"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Turn off now"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"You won\'t see these notifications anymore"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> diff --git a/packages/SystemUI/res/values-en-rIN/config.xml b/packages/SystemUI/res/values-en-rIN/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-en-rIN/config.xml +++ b/packages/SystemUI/res/values-en-rIN/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 3f6d5e5fffd9..3e9e3a2349e3 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d devices</item> + <item quantity="one">%d device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Torch"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Turn off now"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"You won\'t see these notifications anymore"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> diff --git a/packages/SystemUI/res/values-en-rXC/config.xml b/packages/SystemUI/res/values-en-rXC/config.xml index f015d9b378d4..5309563e3986 100644 --- a/packages/SystemUI/res/values-en-rXC/config.xml +++ b/packages/SystemUI/res/values-en-rXC/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 0571c1ff9b0d..35cef208cb30 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Compatibility zoom button."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom smaller to larger screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connected."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connecting..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Turning on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d devices</item> + <item quantity="one">%d device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flashlight"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Turn off now"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No thanks"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"With power notification controls, you can set an importance level from 0 to 5 for an app\'s notifications. \n\n"<b>"Level 5"</b>" \n- Show at the top of the notification list \n- Allow full screen interruption \n- Always peek \n\n"<b>"Level 4"</b>" \n- Prevent full screen interruption \n- Always peek \n\n"<b>"Level 3"</b>" \n- Prevent full screen interruption \n- Never peek \n\n"<b>"Level 2"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound and vibration \n\n"<b>"Level 1"</b>" \n- Prevent full screen interruption \n- Never peek \n- Never make sound or vibrate \n- Hide from lock screen and status bar \n- Show at the bottom of the notification list \n\n"<b>"Level 0"</b>" \n- Block all notifications from the app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"You won\'t see these notifications anymore"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> diff --git a/packages/SystemUI/res/values-es-rUS/config.xml b/packages/SystemUI/res/values-es-rUS/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-es-rUS/config.xml +++ b/packages/SystemUI/res/values-es-rUS/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-es/config.xml b/packages/SystemUI/res/values-es/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-es/config.xml +++ b/packages/SystemUI/res/values-es/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 5cc6ab6a0b2c..2a409a51574e 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -88,7 +88,7 @@ <string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string> <string name="accessibility_menu" msgid="316839303324695949">"Menú"</string> <string name="accessibility_accessibility_button" msgid="7601252764577607915">"Accesibilidad"</string> - <string name="accessibility_rotate_button" msgid="7402949513740253006">"Girar la pantalla"</string> + <string name="accessibility_rotate_button" msgid="7402949513740253006">"Girar pantalla"</string> <string name="accessibility_recent" msgid="5208608566793607626">"Aplicaciones recientes"</string> <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string> @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar diseño de tarea nueva"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icono de aplicación"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensaje de ayuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desactivado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay ninguna red Wi-Fi disponible"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Enviar"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Enviando"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string> @@ -329,9 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Compartir conexión"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activando..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositivos</item> + <item quantity="one">%d dispositivo</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Datos móviles"</string> @@ -341,10 +342,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> usado"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de trabajo"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Las notificaciones y las aplicaciones están desactivadas"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz nocturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string> @@ -362,8 +361,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para utilizar la pantalla dividida"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Desliza el dedo hacia arriba para cambiar de aplicación"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string> @@ -504,11 +502,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desactivar"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Mostrar"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ocultar"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambiar dispositivo de salida"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fijada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás y Aplicaciones recientes."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Aplicaciones recientes."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendido"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, gracias"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que actives esta opción en Ajustes."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -588,8 +599,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Los controles de energía de las notificaciones permiten establecer un nivel de importancia de 0 a 5 para las notificaciones de las aplicaciones. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones \n- Permitir interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 4"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- Mostrar siempre \n\n"<b>"Nivel 3"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n\n"<b>"Nivel 2"</b>" \n- Evitar interrumpir en el modo de pantalla completa\n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n\n"<b>"Nivel 1"</b>" \n- Evitar interrumpir en el modo de pantalla completa \n- No mostrar nunca \n- No emitir sonido ni vibrar nunca \n- Ocultar de la pantalla de bloqueo y de la barra de estado \n- Mostrar en la parte inferior de la lista de notificaciones \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la aplicación"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"No volverás a ver estas notificaciones"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente ignoras estas notificaciones. \n¿Quieres seguir viéndolas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Detener las notificaciones"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Seguir mostrando"</string> diff --git a/packages/SystemUI/res/values-et/config.xml b/packages/SystemUI/res/values-et/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-et/config.xml +++ b/packages/SystemUI/res/values-et/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-eu/config.xml b/packages/SystemUI/res/values-eu/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-eu/config.xml +++ b/packages/SystemUI/res/values-eu/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-fa/config.xml b/packages/SystemUI/res/values-fa/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-fa/config.xml +++ b/packages/SystemUI/res/values-fa/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-fi/config.xml b/packages/SystemUI/res/values-fi/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-fi/config.xml +++ b/packages/SystemUI/res/values-fi/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 34072db40a24..e7fcb43e0ab2 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"avaa kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Valitse uusi tehtävien asettelu"</string> <string name="cancel" msgid="6442560571259935130">"Peruuta"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Sovelluskuvake"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Ohjeviestialue"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Yhteensopivuuszoomaus-painike."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoomaa pienemmältä suuremmalle ruudulle."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth yhdistetty."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi-yhteys pois käytöstä"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi on käytössä"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ei Wi-Fi-verkkoja käytettävissä"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Suoratoisto"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Lähetetään"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimetön laite"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Yhdistetään…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jaettu yhteys"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Otetaan käyttöön…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d laitetta</item> + <item quantity="one">%d laite</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ilmoitukset"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taskulamppu"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiilidata"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"käytetty <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"kiintiö <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> – varoitus"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Työprofiili"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Ilmoitukset ja sovellukset on poistettu käytöstä"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Yövalo"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Auringon laskiessa"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Auringonnousuun"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> on poistettu käytöstä vikasietotilassa."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tyhjennä kaikki"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Jaa näyttö vetämällä tähän."</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Vaihda sovellusta pyyhkäisemällä ylös"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vaakasuuntainen jako"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pystysuuntainen jako"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Muokattu jako"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Sammuta nyt"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Laajenna."</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Tiivistä."</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Vaihda toistolaitetta"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Näyttö on kiinnitetty"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Viimeisimmät."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Selvä"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ei kiitos"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Piilotetaanko <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Se tulee takaisin näkyviin, kun seuraavan kerran otat sen käyttöön asetuksissa."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Piilota"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Ilmoitusten tehohallinnan avulla voit määrittää sovelluksen ilmoituksille tärkeystason väliltä 0–5. \n\n"<b>"Taso 5"</b>" \n– Ilmoitukset näytetään ilmoitusluettelon yläosassa \n– Näkyminen koko näytön tilassa sallitaan \n– Ilmoitukset kurkistavat aina näytölle\n\n"<b>"Taso 4"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ilmoitukset kurkistavat aina näytölle \n\n"<b>"Taso 3"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n\n"<b>"Taso 2"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n\n"<b>"Taso 1"</b>" \n– Näkyminen koko näytön tilassa estetään \n– Ei kurkistamista \n– Ei ääniä eikä värinää \n– Ilmoitukset piilotetaan lukitusnäytöltä ja tilapalkista \n– Ilmoitukset näytetään ilmoitusluettelon alaosassa \n\n"<b>"Taso 0"</b>" \n– Kaikki sovelluksen ilmoitukset estetään"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Ilmoitukset"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Et näe näitä ilmoituksia enää"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Hylkäät yleensä nämä ilmoitukset. \nHaluatko, että niitä näytetään myös jatkossa?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Jatketaanko näiden ilmoitusten näyttämistä?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Lopeta ilmoitukset"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Jatka näyttämistä"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/config.xml b/packages/SystemUI/res/values-fr-rCA/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-fr-rCA/config.xml +++ b/packages/SystemUI/res/values-fr-rCA/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 16a4eac8af1d..56ca97c2a67f 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -88,6 +88,7 @@ <string name="accessibility_home" msgid="8217216074895377641">"Domicile"</string> <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string> <string name="accessibility_accessibility_button" msgid="7601252764577607915">"Accessibilité"</string> + <string name="accessibility_rotate_button" msgid="7402949513740253006">"Faire pivoter l\'écran"</string> <string name="accessibility_recent" msgid="5208608566793607626">"Aperçu"</string> <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string> @@ -102,6 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string> <string name="cancel" msgid="6442560571259935130">"Annuler"</string> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône de l\'application"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string> @@ -180,7 +184,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> - <string name="accessibility_work_mode" msgid="2478631941714607225">"Mode Travail"</string> + <!-- no translation found for accessibility_work_mode (702887484664647430) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string> @@ -277,6 +282,10 @@ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"BLUETOOTH DÉSACTIVÉ"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Aucun des appareils associés n\'est disponible"</string> + <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> + <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> + <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Écouteurs"</string> + <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string> <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Rotation automatique de l\'écran"</string> @@ -301,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi à proximité"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Diffuser"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string> @@ -317,6 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès sans fil"</string> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activation en cours…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d appareil</item> + <item quantity="other">%d appareils</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampe de poche"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Données cellulaires"</string> @@ -326,8 +342,13 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Quantité de données utilisées :<xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Mode Travail"</string> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil professionnel"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notifications et les applications sont désactivées"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éclairage nocturne"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Au coucher du soleil"</string> + <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'au lev. soleil"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Actif à <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC activée"</string> @@ -340,6 +361,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> est désactivée en mode sans échec."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Effacer tout"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Glissez l\'élément ici pour utiliser l\'écran partagé"</string> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Balayez vers le haut pour changer d\'application"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Séparation horizontale"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Séparation verticale"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Séparation personnalisée"</string> @@ -480,11 +502,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Désactiver maintenant"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Développer"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Réduire"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Changer d\'appareil de sortie"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"L\'écran est épinglé"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour » et « Aperçu »."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Aperçu »."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Non, merci"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Masquer"</string> @@ -564,9 +599,10 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Avec les réglages avancés des notifications, vous pouvez définir un degré d\'importance de 0 à 5 pour les notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher dans le haut de la liste des notifications \n- Autoriser les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 4"</b>" \n- Empêcher les interruptions en mode plein écran \n- Toujours afficher les aperçus \n\n"<b>"Niveau 3"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n\n"<b>"Niveau 2"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n\n"<b>"Niveau 1"</b>" \n- Empêcher les interruptions en mode plein écran \n- Ne jamais afficher les aperçus \n- Ne pas autoriser les sons et les vibrations \n- Masquer de l\'écran de verrouillage et de la barre d\'état status bar \n- Afficher dans le bas de la liste des notifications \n\n"<b>"Level 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Vous ne verrez plus ces notifications"</string> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez habituellement ces notifications. \nSouhaitez-vous continuer à les afficher?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuer à afficher ces notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string> - <string name="inline_keep_button" msgid="6665940297019018232">"Continuez à afficher"</string> + <string name="inline_keep_button" msgid="6665940297019018232">"Continuer à afficher"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string> <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Les paramètres des notifications pour <xliff:g id="APP_NAME">%1$s</xliff:g> sont ouverts"</string> @@ -658,7 +694,8 @@ <item msgid="1545641631806817203">"Presse-papiers"</item> <item msgid="5742013440802239414">"Code de touche"</item> <item msgid="8802889973626281575">"Sélecteur de clavier"</item> - <item msgid="8175437057325747277">"Aucun"</item> + <item msgid="7095517796293767867">"Suggestion de rotation"</item> + <item msgid="8494159969042135235">"Aucun"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normale"</item> @@ -782,4 +819,10 @@ <string name="running_foreground_services_msg" msgid="6326247670075574355">"Touchez pour afficher des détails sur l\'utilisation de la pile et des données"</string> <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Désactiver les données cellulaires?"</string> <string name="touch_filtered_warning" msgid="8671693809204767551">"Une application obscurcit une demande d\'autorisation, alors Paramètres ne peut pas vérifier votre réponse."</string> + <string name="slice_permission_title" msgid="7465009437851044444">"Autoriser <xliff:g id="APP_0">%1$s</xliff:g> à afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches?"</string> + <string name="slice_permission_text_1" msgid="3514586565609596523">"- Il peut lire de l\'information de <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="slice_permission_text_2" msgid="3146758297471143723">"- Il peut effectuer des actions dans <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des tranches de n\'importe quelle application"</string> + <string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string> + <string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/config.xml b/packages/SystemUI/res/values-fr/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-fr/config.xml +++ b/packages/SystemUI/res/values-fr/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-gl/config.xml b/packages/SystemUI/res/values-gl/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-gl/config.xml +++ b/packages/SystemUI/res/values-gl/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-gu/config.xml b/packages/SystemUI/res/values-gu/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-gu/config.xml +++ b/packages/SystemUI/res/values-gu/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 27d3ba86f91a..7c530cd80723 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string> <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ઍપ્લિકેશનનું આઇકન"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"સહાય સંદેશનું ક્ષેત્ર"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"સુસંગતતા ઝૂમ બટન."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"નાનીથી મોટી સ્ક્રીન પર ઝૂમ કરો."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"બ્લૂટૂથ કનેક્ટ થયું."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"વાઇ-ફાઇ બંધ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"વાઇ-ફાઇ ચાલુ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"કોઈ વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ નથી"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"કાસ્ટ કરો"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"કાસ્ટ કરી રહ્યાં છે"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"અનામાંકિત ઉપકરણ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"કનેક્ટ કરી રહ્યું છે..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ટિથરિંગ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"હૉટસ્પૉટ"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ચાલુ કરી રહ્યાં છીએ…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d ઉપકરણ</item> + <item quantity="other">%d ઉપકરણો</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"નોટિફિકેશનો"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ફ્લેશલાઇટ"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"મોબાઇલ ડેટા"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> વાપર્યો"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> મર્યાદા"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ચેતવણી"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"કાર્યાલયની પ્રોફાઇલ"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"નોટિફિકેશન અને ઍપ બંધ છે"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"રાત્રિ પ્રકાશ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"સૂર્યાસ્ત વખતે"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"સૂર્યોદય સુધી"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"સુરક્ષિત મોડમાં <xliff:g id="APP">%s</xliff:g> અક્ષમ કરેલ છે."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"બધું સાફ કરો"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરવા માટે અહીં ખેંચો"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"આડું વિભક્ત કરો"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ઊભું વિભક્ત કરો"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"કસ્ટમ વિભક્ત કરો"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"હમણાં બંધ કરો"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"વિસ્તૃત કરો"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"સંકુચિત કરો"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"સ્ક્રીન પિન કરેલ છે"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને ઝલકને સ્પર્શ કરી રાખો."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે ઝલકને સ્પર્શ કરી રાખો."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"સમજાઈ ગયું"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ના, આભાર"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ને છુપાવીએ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"તે સેટિંગ્સમાં તમે તેને ચાલુ કરશો ત્યારે આગલી વખતે ફરીથી દેખાશે."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"છુપાવો"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"પાવર સૂચના નિયંત્રણો સાથે, તમે ઍપની સૂચનાઓ માટે 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="7506845022070889909">"નોટિફિકેશનો"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"તમને હવેથી આ નોટિફિકેશન દેખાશે નહીં"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"તમે સામાન્ય રીતે આ નોટીફિકેશનને છોડી દો છો. \nતેમને બતાવવાનું ચાલુ રાખીએ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"આ નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"નોટિફિકેશન બંધ કરો"</string> <string name="inline_keep_button" msgid="6665940297019018232">"બતાવવાનું ચાલુ રાખો"</string> diff --git a/packages/SystemUI/res/values-hi/config.xml b/packages/SystemUI/res/values-hi/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-hi/config.xml +++ b/packages/SystemUI/res/values-hi/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index bb2e897ba419..379d1abc4b49 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"कैमरा खोलें"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ऐप्लिकेशन आइकॉन"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"सहायता का मैसेज दिखाने की जगह"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"संगतता ज़ूम बटन."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"छोटी से बड़ी स्क्रीन पर ज़ूम करें."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लूटूथ कनेक्ट किया गया."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाई-फ़ाई बंद"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाई-फ़ाई चालू है"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"कोई भी वाई-फ़ाई नेटवर्क उपलब्ध नहीं है"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करें"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"कास्टिंग"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"अनाम डिवाइस"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट हो रहा है..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"चालू किया जा रहा है..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d डिवाइस</item> + <item quantity="other">%d डिवाइस</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"सूचनाएं"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"फ़्लैशलाइट"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"मोबाइल डेटा"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> उपयोग किया गया"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> सीमा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"कार्य प्रोफ़ाइल"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"सूचनाएं और ऐप्लिकेशन बंद हैं"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"नाइट लाइट"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"शाम को चालू की जाएगी"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सुबह तक चालू रहेगी"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> को सुरक्षित-मोड में बंद किया गया."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"स्क्रीन के दो हिस्से में बंट जाने, स्पिल्ट स्क्रीन, का इस्तेमाल करने के लिए यहां खींचें और छोडें"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अपने मुताबिक बांटें"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार करें"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"छोटा करें"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन कर दी गई है"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'खास जानकारी\' को दबाकर रखें."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ठीक है"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"नहीं, रहने दें"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> को छिपाएं?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"जब आप उसे अगली बार सेटिंग में चालू करेंगे तो वह फिर से दिखाई देगी."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"छिपाएं"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"पावर सूचना नियंत्रण के ज़रिये, आप किसी ऐप की सूचना को उसकी अहमियत के हिसाब से 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="7506845022070889909">"सूचना"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"अब आपको ये सूचनाएं दिखाई नहीं देंगी"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"अाप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ये सूचनाएं दिखाना जारी रखें?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाएं दिखाना बंद करें"</string> <string name="inline_keep_button" msgid="6665940297019018232">"दिखाना जारी रखें"</string> @@ -807,10 +818,10 @@ <string name="running_foreground_services_msg" msgid="6326247670075574355">"बैटरी और डेटा खर्च की जानकारी के लिए छूएं"</string> <string name="data_usage_disable_mobile" msgid="5116269981510015864">"मोबाइल डेटा बंद करना चाहते हैं?"</string> <string name="touch_filtered_warning" msgid="8671693809204767551">"ऐप की वजह से मंज़ूरी के अनुरोध को समझने में दिक्कत हो रही है, इसलिए सेटिंग से आपके जवाब की पुष्टि नहीं हो पा रही है."</string> - <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> को <xliff:g id="APP_2">%2$s</xliff:g> से हिस्से (स्लाइस) दिखाने की मंज़ूरी दें?"</string> + <string name="slice_permission_title" msgid="7465009437851044444">"<xliff:g id="APP_0">%1$s</xliff:g> को <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें?"</string> <string name="slice_permission_text_1" msgid="3514586565609596523">"- यह <xliff:g id="APP">%1$s</xliff:g> से सूचना पढ़ सकता है"</string> <string name="slice_permission_text_2" msgid="3146758297471143723">"- यह <xliff:g id="APP">%1$s</xliff:g> में कार्रवाई कर सकता है"</string> - <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> को किसी भी ऐप्लिकेशन से हिस्से (स्लाइस) दिखाने की मंज़ूरी दें."</string> + <string name="slice_permission_checkbox" msgid="7986504458640562900">"<xliff:g id="APP">%1$s</xliff:g> को किसी भी ऐप्लिकेशन के हिस्से (स्लाइस) दिखाने की मंज़ूरी दें"</string> <string name="slice_permission_allow" msgid="2340244901366722709">"मंज़ूरी दें"</string> <string name="slice_permission_deny" msgid="7683681514008048807">"नामंज़ूर करें"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/config.xml b/packages/SystemUI/res/values-hr/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-hr/config.xml +++ b/packages/SystemUI/res/values-hr/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-hu/config.xml b/packages/SystemUI/res/values-hu/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-hu/config.xml +++ b/packages/SystemUI/res/values-hu/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-hy/config.xml b/packages/SystemUI/res/values-hy/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-hy/config.xml +++ b/packages/SystemUI/res/values-hy/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-in/config.xml b/packages/SystemUI/res/values-in/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-in/config.xml +++ b/packages/SystemUI/res/values-in/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-is/config.xml b/packages/SystemUI/res/values-is/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-is/config.xml +++ b/packages/SystemUI/res/values-is/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-it/config.xml b/packages/SystemUI/res/values-it/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-it/config.xml +++ b/packages/SystemUI/res/values-it/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 880da638a7a2..89e9cc185761 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"apri fotocamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleziona un nuovo layout per le attività"</string> <string name="cancel" msgid="6442560571259935130">"Annulla"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona dell\'applicazione"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Area dei messaggi di assistenza"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Pulsante zoom compatibilità."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom inferiore per schermo più grande."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth collegato."</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi disattivato"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi attivo"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nessuna rete Wi-Fi disponibile"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Trasmetti"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"In trasmissione"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo senza nome"</string> @@ -329,9 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connessione..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Attivazione…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositivi</item> + <item quantity="one">%d dispositivo</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifiche"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Torcia"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dati mobili"</string> @@ -501,11 +502,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Disattiva ora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Espandi"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Comprimi"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambia dispositivo di uscita"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"La schermata è fissata"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Indietro e Panoramica."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Panoramica."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, grazie"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Nascondere <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Verranno visualizzate di nuovo quando le riattiverai nelle impostazioni."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Nascondi"</string> @@ -585,8 +599,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"I controlli di gestione delle notifiche ti consentono di impostare un livello di importanza compreso tra 0 e 5 per le notifiche di un\'app. \n\n"<b>"Livello 5"</b>" \n- Mostra in cima all\'elenco di notifiche \n- Consenti l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 4"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Visualizza sempre \n\n"<b>"Livello 3"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n\n"<b>"Livello 2"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n\n"<b>"Livello 1"</b>" \n- Impedisci l\'interruzione a schermo intero \n- Non visualizzare mai \n- Non emettere mai suoni e vibrazioni \n- Nascondi da schermata di blocco e barra di stato \n- Mostra in fondo all\'elenco di notifiche \n\n"<b>"Livello 0"</b>" \n- Blocca tutte le notifiche dell\'app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifiche"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Non vedrai più queste notifiche"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"In genere ignori queste notifiche. \nVuoi continuare a riceverle?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuare a ricevere queste notifiche?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Interrompi la ricezione di notifiche"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continua a mostrare"</string> diff --git a/packages/SystemUI/res/values-iw/config.xml b/packages/SystemUI/res/values-iw/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-iw/config.xml +++ b/packages/SystemUI/res/values-iw/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ja/config.xml b/packages/SystemUI/res/values-ja/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ja/config.xml +++ b/packages/SystemUI/res/values-ja/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ka/config.xml b/packages/SystemUI/res/values-ka/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ka/config.xml +++ b/packages/SystemUI/res/values-ka/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-kk/config.xml b/packages/SystemUI/res/values-kk/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-kk/config.xml +++ b/packages/SystemUI/res/values-kk/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-km/config.xml b/packages/SystemUI/res/values-km/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-km/config.xml +++ b/packages/SystemUI/res/values-km/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-kn/config.xml b/packages/SystemUI/res/values-kn/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-kn/config.xml +++ b/packages/SystemUI/res/values-kn/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index a8b30077badd..4b638f57d99c 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ಚಿಕ್ಕ ಪರದೆಯಿಂದ ದೊಡ್ಡ ಪರದೆಗೆ ಝೂಮ್ ಮಾಡು."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ವೈ-ಫೈ ಆಫ್"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ಯಾವುದೇ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ಬಿತ್ತರಿಸುವಿಕೆ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ಟೆಥರಿಂಗ್"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ಹಾಟ್ಸ್ಪಾಟ್"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d ಸಾಧನಗಳು</item> + <item quantity="other">%d ಸಾಧನಗಳು</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ಅಧಿಸೂಚನೆಗಳು"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ಫ್ಲಾಶ್ಲೈಟ್"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ಮೊಬೈಲ್ ಡೇಟಾ"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ಬಳಸಲಾಗಿದೆ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ಮಿತಿ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ಎಚ್ಚರಿಕೆ"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಆಫ್ ಆಗಿವೆ"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ನೈಟ್ ಲೈಟ್"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ಸೂರ್ಯಾಸ್ತದಲ್ಲಿ"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ಸೂರ್ಯೋದಯದ ತನಕ"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ವಿಭಜಿತ ಪರದೆಯನ್ನು ಬಳಸಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ಈಗ ಆಫ್ ಮಾಡಿ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ವಿಸ್ತರಿಸು"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ಸಂಕುಚಿಸು"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ತಿಳಿಯಿತು"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ಧನ್ಯವಾದಗಳು"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ಮರೆಮಾಡುವುದೇ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿದಾಗ ಅದು ಮರುಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ಮರೆಮಾಡಿ"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ಪವರ್ ಅಧಿಸೂಚನೆ ನಿಯಂತ್ರಣಗಳ ಮೂಲಕ, ನೀವು ಅಪ್ಲಿಕೇಶನ್ಗಳ ಅಧಿಸೂಚನೆಗಳನ್ನು 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="7506845022070889909">"ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ನೀವು ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ನೋಡುವುದಿಲ್ಲ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ. \nಅವುಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ತೋರಿಸುತ್ತಲಿರಿ"</string> diff --git a/packages/SystemUI/res/values-ko/config.xml b/packages/SystemUI/res/values-ko/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ko/config.xml +++ b/packages/SystemUI/res/values-ko/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ky/config.xml b/packages/SystemUI/res/values-ky/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ky/config.xml +++ b/packages/SystemUI/res/values-ky/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-lo/config.xml b/packages/SystemUI/res/values-lo/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-lo/config.xml +++ b/packages/SystemUI/res/values-lo/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 338da6cf31af..1b56074e4268 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ເປີດກ້ອງ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກແຜນຜັງໜ້າວຽກໃໝ່"</string> <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ໄອຄອນແອັບພລິເຄຊັນ"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ປຸ່ມຊູມທີ່ໃຊ້ຮ່ວມກັນໄດ້."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ຊູມຈໍນ້ອຍໄປເປັນຈໍຂະຫນາດໃຫຍ່."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ເຊື່ອມຕໍ່ Bluetooth ແລ້ວ."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ປິດ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ເປີດ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ບໍ່ມີເຄືອຂ່າຍ Wi-Fi ຢູ່"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ການສົ່ງສັນຍານ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ກຳລັງສົ່ງສັນຍານ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ອຸປະກອນບໍ່ມີຊື່"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"ກຳລັງເຊື່ອມຕໍ່..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ການປ່ອນສັນຍານ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ຮັອດສະປອດ"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ກຳລັງເປີດ..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d ອຸປະກອນ</item> + <item quantity="one">%d ອຸປະກອນ</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ການແຈ້ງເຕືອນ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ໄຟສາຍ"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ອິນເຕີເນັດມືຖື"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"ໃຊ້ໄປແລ້ວ <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ຈຳກັດ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"ຄຳເຕືອນ <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"ການແຈ້ງເຕືອນ ແລະ ແອັບຖືກປິດໄວ້"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ແສງກາງຄືນ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ເປີດຕອນຕາເວັນຕົກ"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ຈົນກວ່າຕາເວັນຂຶ້ນ"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ຖືກປິດໃຊ້ໃນໂໝດຄວາມມປອດໄພ."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ລຶບລ້າງທັງໝົດ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ລາກມາບ່ອນນີ້ເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ປັດຂື້ນເພື່ອສະຫຼັບແອັບ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ການແຍກລວງຂວາງ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ການແຍກລວງຕັ້ງ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ການແຍກກຳນົດເອງ"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ປິດດຽວນີ້"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ຂະຫຍາຍ"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ຫຍໍ້ລົງ"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ເຂົ້າໃຈແລ້ວ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ບໍ່, ຂອບໃຈ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ເຊື່ອງ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ຫຼືບໍ່?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ມັນຈະສະແດງຄືນໃໝ່ເມື່ອທ່ານເປີດນຳໃຊ້ມັນໃນການຕັ້ງຄ່າຄັ້ງຕໍ່ໄປ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ເຊື່ອງ"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ດ້ວຍການຄວບຄຸມການແຈ້ງເຕືອນ, ທ່ານສາມາດຕັ້ງລະດັບຄວາມສຳຄັນຈາກ 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="7506845022070889909">"ການແຈ້ງເຕືອນ"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ທ່ານຈະບໍ່ໄດ້ຮັບການແຈ້ງເຕືອນເຫຼົ່ານີ້ອີກຕໍ່ໄປ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"ໂດຍປົກກະຕິທ່ານປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄວ້. \nສືບຕໍ່ສະແດງພວກມັນບໍ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ສະແດງການແຈ້ງເຕືອນເຫຼົ່ານີ້ຕໍ່ໄປບໍ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ຢຸດການແຈ້ງເຕືອນ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ສະແດງຕໍ່ໄປ"</string> diff --git a/packages/SystemUI/res/values-lt/config.xml b/packages/SystemUI/res/values-lt/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-lt/config.xml +++ b/packages/SystemUI/res/values-lt/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-lv/config.xml b/packages/SystemUI/res/values-lv/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-lv/config.xml +++ b/packages/SystemUI/res/values-lv/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-mk/config.xml b/packages/SystemUI/res/values-mk/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-mk/config.xml +++ b/packages/SystemUI/res/values-mk/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 9808ab6c95e8..07ea7aa04109 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"отвори камера"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона за апликацијата"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Поле за пораки за помош"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Копче за компатибилност на зум."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумот е помал на поголем екран."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth е поврзан."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi е исклучено"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Вклучено е Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Нема достапни Wi-Fi мрежи"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Емитувај"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Емитување"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименуван уред"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Се поврзува..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Поврзување"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка на пристап"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Се вклучува…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d уред</item> + <item quantity="other">%d уреди</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Известувања"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Светилка"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилен интернет"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Исклучи сега"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Прошири"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Собери"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Префрлете го излезниот уред"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екранот е прикачен"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Краток преглед“ за откачување."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Сфатив"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Не, фала"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сокриј <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ќе се појави повторно следниот пат кога ќе го вклучите во поставки."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сокриј"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Со контролите за известувањата за напојување, може да поставите ниво на важност од 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="7506845022070889909">"Известувања"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Веќе нема да ги гледате овие известувања"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично ги отфрлате известувањава. \nДа продолжат да се прикажуваат?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Дали да продолжат да се прикажуваат известувањава?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Запри ги известувањата"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Продолжи да ги прикажуваш"</string> diff --git a/packages/SystemUI/res/values-ml/config.xml b/packages/SystemUI/res/values-ml/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ml/config.xml +++ b/packages/SystemUI/res/values-ml/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 446f0e4e128b..d4d629738140 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ക്യാമറ തുറക്കുക"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string> <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ആപ്പ് ഐക്കൺ"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"സഹായ സന്ദേശ ഏരിയ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"അനുയോജ്യതാ സൂം ബട്ടൺ."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ചെറുതിൽ നിന്ന് വലിയ സ്ക്രീനിലേക്ക് സൂം ചെയ്യുക."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"വൈഫൈ ഓഫുചെയ്യുക"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"കാസ്റ്റുചെയ്യുക"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"കാസ്റ്റുചെയ്യുന്നു"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാത്ത ഉപകരണം"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"കണക്റ്റുചെയ്യുന്നു..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ടെതറിംഗ്"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ഹോട്ട്സ്പോട്ട്"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ഓൺ ചെയ്യുന്നു..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d ഉപകരണങ്ങൾ</item> + <item quantity="one">%d ഉപകരണം</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"അറിയിപ്പുകൾ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ടോർച്ച്"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"മൊബൈൽ ഡാറ്റ"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ഉപയോഗിച്ചു"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> പരിധി"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> മുന്നറിയിപ്പ്"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"അറിയിപ്പുകളും ആപ്പുകളും ഓഫാണ്"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"നൈറ്റ് ലൈറ്റ്"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"സൂര്യാസ്തമയത്തിന്"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"സൂര്യോദയം വരെ"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"സുരക്ഷിത മോഡിൽ <xliff:g id="APP">%s</xliff:g> പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"എല്ലാം മായ്ക്കുക"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"സ്പ്ലിറ്റ് സ്ക്രീൻ ഉപയോഗിക്കുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"തിരശ്ചീനമായി വേർതിരിക്കുക"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ലംബമായി വേർതിരിക്കുക"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ഇഷ്ടാനുസൃതമായി വേർതിരിക്കുക"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ഇപ്പോൾ ഓഫ് ചെയ്യുക"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"വികസിപ്പിക്കുക"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ചുരുക്കുക"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"സ്ക്രീൻ പിൻ ചെയ്തു"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ\', \'ചുരുക്കവിവരണം\' എന്നിവ സ്പർശിച്ച് പിടിക്കുക."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ചുരുക്കവിവരണം\' സ്പർശിച്ച് പിടിക്കുക."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"മനസ്സിലായി"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"വേണ്ട, നന്ദി"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> എന്നത് മറയ്ക്കണോ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"അടുത്ത തവണ നിങ്ങൾ അത് ക്രമീകരണങ്ങളിൽ ഓണാക്കുമ്പോൾ അത് വീണ്ടും ദൃശ്യമാകും."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"മറയ്ക്കുക"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"പവർ അറിയിപ്പ് നിയന്ത്രണം ഉപയോഗിച്ച്, ഒരു ആപ്പിനായുള്ള അറിയിപ്പുകൾക്ക് 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="7506845022070889909">"അറിയിപ്പുകൾ"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"നിങ്ങൾ ഇനി ഈ അറിയിപ്പുകൾ കാണില്ല"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"സാധാരണയായി നിങ്ങൾ ഈ അറിയിപ്പുകൾ നിരാകരിക്കുന്നു. \nഅവ തുടർന്നും കാണിക്കണോ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ഈ അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"അറിയിപ്പുകൾ നിർത്തുക"</string> <string name="inline_keep_button" msgid="6665940297019018232">"തുടർന്നും കാണിക്കുക"</string> diff --git a/packages/SystemUI/res/values-mn/config.xml b/packages/SystemUI/res/values-mn/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-mn/config.xml +++ b/packages/SystemUI/res/values-mn/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-mr/config.xml b/packages/SystemUI/res/values-mr/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-mr/config.xml +++ b/packages/SystemUI/res/values-mr/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 804e91623b1e..c34811017954 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"कॅमेरा उघडा"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अॅप्लिकेशन आयकन"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मदत संदेश क्षेत्र"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"सुसंगतता झूम बटण."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"लहानपासून मोठ्या स्क्रीनवर झूम करा."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लूटूथ कनेक्ट केले."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाय-फाय बंद"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाय-फाय चालू"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"वाय-फाय नेटवर्क उपलब्ध नाहीत"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करा"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"निनावी डिव्हाइस"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"कनेक्ट करत आहे..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदरिंग"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हॉटस्पॉट"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"चालू करत आहे…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d डिव्हाइस</item> + <item quantity="other">%d डिव्हाइस</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"सूचना"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"फ्लॅशलाइट"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"मोबाइल डेटा"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> वापरले"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> मर्यादा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावणी"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"कार्य प्रोफाइल"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"सूचना आणि अॅप्स बंद आहेत"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"रात्रीचा प्रकाश"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"संध्याकाळी चालू असते"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयापर्यंत"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> सुरक्षित-मोडमध्ये अक्षम केला आहे."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सर्व साफ करा"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रीन वापर करण्यासाठी येथे ड्रॅग करा"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज विभाजित करा"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"अनुलंब विभाजित करा"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"सानुकूल विभाजित करा"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"आता बंद करा"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तृत करा"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"संकुचित करा"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन केलेली आहे"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"समजले"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"नाही, नको"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"आपण सेटिंग्जमध्ये ते पुढील वेळी चालू कराल तेव्हा ते पुन्हा दिसेल."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लपवा"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"पॉवर सूचना नियंत्रणांच्या साहाय्याने तुम्ही अॅप सूचनांसाठी 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="7506845022070889909">"सूचना"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"आता तुम्हाला या सूचना दिसणार नाहीत"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"तुम्ही या सूचना सामान्यतः डिसमिस करता. \nते दाखवत राहायचे?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"या सूचना दाखवणे सुरू ठेवायचे?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचना थांबवा"</string> <string name="inline_keep_button" msgid="6665940297019018232">"दाखवणे सुरू ठेवा"</string> diff --git a/packages/SystemUI/res/values-ms/config.xml b/packages/SystemUI/res/values-ms/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ms/config.xml +++ b/packages/SystemUI/res/values-ms/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-my/config.xml b/packages/SystemUI/res/values-my/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-my/config.xml +++ b/packages/SystemUI/res/values-my/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 972f4ee11ede..41f28e2093e1 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string> <string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"အပလီကေးရှင်း သင်္ကေတ"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"အံဝင်ခွင်ကျ ဇူးမ်ခလုတ်"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ဖန်သားပြင်ပေါ်တွင် အသေးမှအကြီးသို့ ဇူးမ်ဆွဲခြင်း"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ဝိုင်ဖိုင်ပိတ်ရန်"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"ဆက်သွယ်နေ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"တွဲချီပေးခြင်း"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ဟော့စပေါ့"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ဖွင့်နေသည်..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">စက် %d ခု</item> + <item quantity="one">စက် %d ခု</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"အကြောင်းကြားချက်များ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ဖလက်ရှ်မီး"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"မိုဘိုင်းဒေတာ"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ပိတ်ရန်"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"တိုးချဲ့ရန်"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ခေါက်သိမ်းရန်..."</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"အထွက် စက်ပစ္စည်းကို ပြောင်းပါ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ရပါပြီ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"မလိုတော့ပါ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ဝှက်မည်လား?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ဖျောက်ထားမည်"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ပါဝါအကြောင်းကြားချက် ထိန်းချုပ်မှုများကိုအသုံးပြုပြီး အက်ပ်တစ်ခု၏ အကြောင်းကြားချက် အရေးပါမှု ၀ မှ ၅ အထိသတ်မှတ်ပေးနိုင်သည်။ \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="7506845022070889909">"အကြောင်းကြားချက်များ"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ဤအကြောင်းကြားချက်များကို မြင်ရတော့မည် မဟုတ်ပါ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"သင်သည် အများအားဖြင့် ဤအကြောင်းကြားချက်များကို ပယ်လေ့ရှိပါသည်။ \n၎င်းတို့ကို ဆက်လက်ပြသလိုပါသလား။"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ဤအကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string> <string name="inline_stop_button" msgid="4172980096860941033">"အကြောင်းကြားချက်များကို ရပ်ရန်"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ဆက်ပြရန်"</string> diff --git a/packages/SystemUI/res/values-nb/config.xml b/packages/SystemUI/res/values-nb/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-nb/config.xml +++ b/packages/SystemUI/res/values-nb/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index d4d61607733c..5bd4f2ee321d 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"åpne kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Velg en ny utforming for oppgaver"</string> <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appikon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område for hjelpemelding"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Zoomknapp for kompatibilitet."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom fra mindre til større skjerm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth er tilkoblet."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi er av"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Kobler til …"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internettdeling"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Wi-Fi-sone"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Slår på …"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d enheter</item> + <item quantity="one">%d enhet</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Varsler"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lommelykt"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobildata"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> brukt"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Grense på <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advarsel for <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Jobbprofil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Varsler og apper er slått av"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nattlys"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På ved solnedgang"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til soloppgang"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er slått av i sikker modus."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tøm alt"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit for å bruke delt skjerm"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Sveip opp for å bytte apper"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Del horisontalt"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Del vertikalt"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Del tilpasset"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Slå av nå"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Utvid"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skjul"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skjermen er låst"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Oversikt for å løsne den."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Skjønner"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nei takk"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den vises igjen neste gang du slår den på i innstillingene."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skjul"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Med effektive varselinnstillinger kan du angi viktighetsnivåer fra 0 til 5 for appvarsler. \n\n"<b>"Nivå 5"</b>" \n– Vis øverst på varsellisten \n– Tillat forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 4"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis alltid raskt \n\n"<b>"Nivå 3"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n\n"<b>"Nivå 2"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri fort \n– Tillat aldri lyder eller vibrering \n\n"<b>"Nivå 1"</b>" \n– Forhindre forstyrrelser ved fullskjermmodus \n– Vis aldri raskt \n– Tillat aldri lyder eller vibrering \n– Skjul fra låseskjermen og statusfeltet \n– Vis nederst på varsellisten \n\n"<b>"Nivå 0"</b>" \n– Blokkér alle varsler fra appen"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Varsler"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Du ser ikke disse varslene lenger"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Du avviser vanligvis disse varslene. \nVil du fortsette å vise dem?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsette å vise disse varslene?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stopp varsler"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Fortsett å vise"</string> diff --git a/packages/SystemUI/res/values-ne/config.xml b/packages/SystemUI/res/values-ne/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ne/config.xml +++ b/packages/SystemUI/res/values-ne/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index e3efe1bf70f7..ca81f44f7cac 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -41,7 +41,7 @@ <string name="invalid_charger" msgid="4549105996740522523">"USB चार्ज गर्न समर्थित छैन।\n आपूर्ति गरिएको चार्जर मात्र प्रयोग गर्नुहोस्।"</string> <string name="invalid_charger_title" msgid="3515740382572798460">"USB चार्ज समर्थित छैन।"</string> <string name="invalid_charger_text" msgid="5474997287953892710">"आपूर्ति गरिएको चार्जर मात्र प्रयोग गर्नुहोस्।"</string> - <string name="battery_low_why" msgid="4553600287639198111">"सेटिङ्हरू"</string> + <string name="battery_low_why" msgid="4553600287639198111">"सेटिङहरू"</string> <string name="battery_saver_confirmation_title" msgid="2052100465684817154">"ब्याट्री सेभर सक्रिय गर्ने हो?"</string> <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"खोल्नुहोस्"</string> <string name="battery_saver_start_action" msgid="8187820911065797519">"ब्याट्री सेभर सक्रिय गर्नुहोस्"</string> @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"क्यामेरा खोल्नुहोस्"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string> <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अनुप्रयोग जनाउने आइकन"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"मिलाउने जुम बटन।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"स्क्रिनलाई सानोबाट ठूलो पार्नुहोस्।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब्लुटुथ जडान भयो।"</string> @@ -264,8 +261,8 @@ <item quantity="other">भित्र थप <xliff:g id="NUMBER_1">%s</xliff:g> सूचनाहरू छन्।</item> <item quantity="one">भित्र थप <xliff:g id="NUMBER_0">%s</xliff:g> सूचना छ।</item> </plurals> - <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"अधिसूचना सेटिङ्हरू"</string> - <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> सेटिङ्हरू"</string> + <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"अधिसूचना सेटिङहरू"</string> + <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> सेटिङहरू"</string> <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"स्क्रिन स्वतः घुम्ने छ।"</string> <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"स्क्रिनलाई ल्यान्डस्केप अवस्थामा बन्द गरिएको छ।"</string> <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"स्क्रिन पोर्टेट अभिमूखमा लक गरिएको छ।"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बन्द"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi सक्रिय छ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi नेटवर्क अनुपलब्ध"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"प्रसारण गर्दै"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"बेनाम उपकरण"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"जडान हुँदै..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"टेदर गर्दै"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"हटस्पट"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"सक्रिय गर्दै…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d यन्त्रहरू</item> + <item quantity="one">%d यन्त्र</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"अधिसूचनाहरू"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"फ्ल्यासलाइट"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"मोबाइल डेटा"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> प्रयोग गरियो"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> सीमा"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी दिँदै"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"कार्य प्रोफाइल"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"सूचना तथा अनुप्रयोगहरू निष्क्रिय छन्"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"रात्रिको प्रकाश"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"सूर्यास्तमा सक्रिय"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"सूर्योदयसम्म"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> लाई सुरक्षित-मोडमा असक्षम गरिएको छ।"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सबै हटाउनुहोस्"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रिनको प्रयोग गर्नका लागि यहाँ तान्नुहोस्"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"तेर्सो रूपमा विभाजन गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ठाडो रूपमा विभाजन गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"आफू अनुकूल विभाजन गर्नुहोस्"</string> @@ -376,11 +374,11 @@ <string name="description_target_search" msgid="3091587249776033139">"खोज्नुहोस्"</string> <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि माथि धिसार्नुहोस्"</string> <string name="description_direction_left" msgid="7207478719805562165">"स्लाइड <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ।"</string> - <string name="zen_priority_introduction" msgid="1149025108714420281">"तपाईंलाई अलार्म, रिमाइन्डर, कार्यक्रम र तपाईंले निर्दिष्ट गर्नुभएका कलरहरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string> - <string name="zen_alarms_introduction" msgid="4934328096749380201">"तपाईंलाई अलार्महरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै संगीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string> + <string name="zen_priority_introduction" msgid="1149025108714420281">"तपाईंलाई अलार्म, रिमाइन्डर, कार्यक्रम र तपाईंले निर्दिष्ट गर्नुभएका कलरहरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै सङ्गीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string> + <string name="zen_alarms_introduction" msgid="4934328096749380201">"तपाईंलाई अलार्महरू बाहेकका ध्वनि र कम्पनहरूले बाधा पुऱ्याउने छैनन्। तपाईंले अझै सङ्गीत, भिडियो र खेलहरू लगायत आफूले प्ले गर्न छनौट गरेका जुनसुकै कुरा सुन्न सक्नुहुनेछ।"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"आफू अनुकूल बनाउनुहोस्"</string> - <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायत सबैका ध्वनि र कम्पनहरूमाथि रोक लगाउँछ। तपाईं अझै पनि फोन कलहरू गर्न सक्नुहुनेछ।"</string> - <string name="zen_silence_introduction" msgid="3137882381093271568">"यसले अलार्म, संगीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।"</string> + <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"यसले अलार्म, सङ्गीत, भिडियो, र खेलहरू लगायत सबैका ध्वनि र कम्पनहरूमाथि रोक लगाउँछ। तपाईं अझै पनि फोन कलहरू गर्न सक्नुहुनेछ।"</string> + <string name="zen_silence_introduction" msgid="3137882381093271568">"यसले अलार्म, सङ्गीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।"</string> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"तल कम जरुरी सूचनाहरू"</string> <string name="notification_tap_again" msgid="7590196980943943842">"खोल्न पुनः ट्याप गर्नुहोस्"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"अहिले नै निष्क्रिय पार्नुहोस्"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार गर्नुहोस्"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"संक्षिप्त पार्नुहोस्"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"पर्दा राखेका छ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"बुझेँ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"धन्यवाद पर्दैन"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"लुकाउनुहुन्छ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"यो तपाईं सेटिङ् मा यो बारी अर्को समय देखापर्नेछ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लुकाउनुहोस्"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"सशक्त सूचना नियन्त्रणहरू मार्फत तपाईं अनुप्रयाेगका सूचनाहरूका लागि ० देखि ५ सम्मको महत्व सम्बन्धी स्तर सेट गर्न सक्नुहुन्छ। \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="7506845022070889909">"सूचनाहरू"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"तपाईं अब उप्रान्त यी सूचनाहरू देख्नु हुने छैन"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"तपाईं सामान्यतया यी सूचनाहरूलाई खारेज गर्ने गर्नुहुन्छ। \nतिनलाई देखाइरहने हो?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"यी सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाहरू देखाउन छाड्नुहोस्"</string> <string name="inline_keep_button" msgid="6665940297019018232">"देखाउने क्रम जारी राख्नुहोस्"</string> @@ -656,7 +667,7 @@ <string name="keyboard_shortcut_group_applications_contacts" msgid="2064197111278436375">"सम्पर्कहरू"</string> <string name="keyboard_shortcut_group_applications_email" msgid="6257036897441939004">"इमेल"</string> <string name="keyboard_shortcut_group_applications_sms" msgid="638701213803242744">"SMS"</string> - <string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"संगीत"</string> + <string name="keyboard_shortcut_group_applications_music" msgid="4775559515850922780">"सङ्गीत"</string> <string name="keyboard_shortcut_group_applications_youtube" msgid="6555453761294723317">"YouTube"</string> <string name="keyboard_shortcut_group_applications_calendar" msgid="9043614299194991263">"पात्रो"</string> <string name="tuner_full_zen_title" msgid="4540823317772234308">"भोल्युम नियन्त्रणसहित देखाउनुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/config.xml b/packages/SystemUI/res/values-nl/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-nl/config.xml +++ b/packages/SystemUI/res/values-nl/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pa/config.xml b/packages/SystemUI/res/values-pa/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-pa/config.xml +++ b/packages/SystemUI/res/values-pa/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 4e391065e73a..9308fee0d546 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string> <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਪ੍ਰਤੀਕ"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ਅਨੁਰੂਪਤਾ ਜ਼ੂਮ ਬਟਨ।"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ਵੱਡੀ ਸਕ੍ਰੀਨ ਤੇ ਛੋਟਾ ਜ਼ੂਮ ਕਰੋ।"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ਵਾਈ-ਫਾਈ ਬੰਦ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ਵਾਈ-ਫਾਈ ਚਾਲੂ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ਕਾਸਟ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਾ ਡੀਵਾਈਸ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ਟੈਦਰਿੰਗ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ਹੌਟਸਪੌਟ"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d ਡੀਵਾਈਸ</item> + <item quantity="other">%d ਡੀਵਾਈਸਾਂ</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ਸੂਚਨਾਵਾਂ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ਫਲੈਸ਼ਲਾਈਟ"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ਮੋਬਾਈਲ ਡਾਟਾ"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ਵਰਤਿਆ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਸੀਮਾ"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ਚਿਤਾਵਨੀ"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"ਸੂਚਨਾਵਾਂ ਅਤੇ ਐਪਾਂ ਬੰਦ ਹਨ"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ਰਾਤਰੀ ਲਾਈਟ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ਸੂਰਜ ਛਿਪਣ \'ਤੇ ਚਾਲੂ"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"ਸੂਰਜ ਚੜ੍ਹਨ ਤੱਕ"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਸੁਰੱਖਿਅਤ-ਮੋਡ ਵਿੱਚ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ਹੌਰੀਜ਼ੌਂਟਲ ਸਪਲਿਟ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ਵਰਟੀਕਲ ਸਪਲਿਟ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਵਿਉਂਂਤੀ ਸਪਲਿਟ"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ਹੁਣੇ ਬੰਦ ਕਰੋ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ਨਸ਼ਟ ਕਰੋ"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ਸਮਝ ਲਿਆ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ਨਹੀਂ ਧੰਨਵਾਦ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ਕੀ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ਇਹ ਅਗਲੀ ਵਾਰ ਮੁੜ ਪ੍ਰਗਟ ਹੋਵੇਗਾ ਜਦੋਂ ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰਦੇ ਹੋ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ਲੁਕਾਓ"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ਪਾਵਰ ਸੂਚਨਾ ਕੰਟਰੋਲਾਂ ਨਾਲ, ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਲਈ ਮਹੱਤਤਾ ਪੱਧਰ ਨੂੰ 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="7506845022070889909">"ਸੂਚਨਾਵਾਂ"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ਤੁਹਾਨੂੰ ਹੁਣ ਇਹ ਸੂਚਨਾਵਾਂ ਦਿਖਾਈ ਨਹੀਂ ਦੇਣਗੀਆਂ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ ਖਾਰਜ ਕਰਦੇ ਹੋ। \nਕੀ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ਕੀ ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ"</string> diff --git a/packages/SystemUI/res/values-pl/config.xml b/packages/SystemUI/res/values-pl/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-pl/config.xml +++ b/packages/SystemUI/res/values-pl/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/config.xml b/packages/SystemUI/res/values-pt-rBR/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-pt-rBR/config.xml +++ b/packages/SystemUI/res/values-pt-rBR/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 3472d1d2f506..982b8b7df37b 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão de zoom da compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aumentar a tela com zoom."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado."</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -329,9 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ponto de acesso"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ativando…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d dispositivo</item> + <item quantity="other">%d dispositivos</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificações"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dados móveis"</string> @@ -501,11 +502,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desativar agora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Recolher"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -585,8 +599,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"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="7506845022070889909">"Notificações"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Você deixará de ver essas notificações"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/config.xml b/packages/SystemUI/res/values-pt-rPT/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-pt-rPT/config.xml +++ b/packages/SystemUI/res/values-pt-rPT/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index a631fcc2f956..2bc1c03edd44 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo esquema de tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone de aplicação"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão zoom de compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom menor para ecrã maior."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ligado."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ligado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Não estão disponíveis redes Wi-Fi"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmissão"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"A ligar..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Associação"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"A ativar…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositivos</item> + <item quantity="one">%d dispositivo</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificações"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dados móveis"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilizado(s)"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Aviso de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de trabalho"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"As notificações e as aplicações estão desativadas"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz noturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ativ. ao pôr-do-sol"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Até ao nascer do sol"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para utilizar o ecrã dividido"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslizar rapidamente para cima para mudar de aplicação"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desativar agora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Reduzir"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Mudar de dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"O ecrã está fixado"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Vista geral para soltar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Compreendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Pretende ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Reaparecerá da próxima vez que a funcionalidade for ativada nas definições."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Com os controlos de notificações do consumo de energia, pode definir um nível de importância de 0 a 5 para as notificações de aplicações. \n\n"<b>"Nível 5"</b>" \n- Mostrar no início da lista de notificações \n- Permitir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre \n\n"<b>"Nível 4"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Aparecer rapidamente sempre\n\n"<b>"Nível 3"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n\n"<b>"Nível 2"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n\n"<b>"Nível 1"</b>" \n- Impedir a interrupção do ecrã inteiro \n- Nunca aparecer rapidamente \n- Nunca tocar nem vibrar \n- Ocultar do ecrã de bloqueio e da barra de estado \n- Mostrar no fim da lista de notificações \n\n"<b>"Nível 0"</b>" \n- Bloquear todas as notificações da aplicação"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificações"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Nunca mais verá estas notificações."</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente, ignora estas notificações. \nPretende continuar a mostrá-las?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Pretende continuar a ver estas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Parar notificações"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar a mostrar"</string> diff --git a/packages/SystemUI/res/values-pt/config.xml b/packages/SystemUI/res/values-pt/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-pt/config.xml +++ b/packages/SystemUI/res/values-pt/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 3472d1d2f506..982b8b7df37b 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botão de zoom da compatibilidade."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aumentar a tela com zoom."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado."</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -329,9 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Ponto de acesso"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ativando…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d dispositivo</item> + <item quantity="other">%d dispositivos</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificações"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dados móveis"</string> @@ -501,11 +502,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desativar agora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Recolher"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -585,8 +599,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"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="7506845022070889909">"Notificações"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Você deixará de ver essas notificações"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string> diff --git a/packages/SystemUI/res/values-ro/config.xml b/packages/SystemUI/res/values-ro/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ro/config.xml +++ b/packages/SystemUI/res/values-ro/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 58b6b753a572..d7652821560e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -104,12 +104,9 @@ <string name="camera_label" msgid="7261107956054836961">"deschideți camera foto"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selectați noul aspect pentru activitate"</string> <string name="cancel" msgid="6442560571259935130">"Anulați"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Pictograma aplicației"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zona mesajelor de ajutor"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Buton zoom pentru compatibilitate."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Faceți zoom de la o imagine mai mică la una mai mare."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Conectat prin Bluetooth."</string> @@ -315,6 +312,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi deconectat"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activat"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Proiectați"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Se proiectează"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispozitiv nedenumit"</string> @@ -331,9 +330,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Se conectează..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Se activează..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="few">%d dispozitive</item> + <item quantity="other">%d de dispozitive</item> + <item quantity="one">%d dispozitiv</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificări"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanternă"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Date mobile"</string> @@ -503,11 +505,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Dezactivați acum"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Extindeți"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Restrângeți"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Comutați dispozitivul de ieșire"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ecranul este fixat"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Am înțeles"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nu, mulțumesc"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ascundeți <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Va reapărea la următoarea activare în setări."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ascundeți"</string> @@ -587,8 +602,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Folosind comenzile de gestionare a notificărilor, puteți să setați un nivel de importanță de la 0 la 5 pentru notificările unei aplicații. \n\n"<b>"Nivelul 5"</b>" \n– Se afișează la începutul listei de notificări \n– Se permite întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 4"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Se afișează întotdeauna scurt \n\n"<b>"Nivelul 3"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n\n"<b>"Nivelul 2"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n\n"<b>"Nivelul 1"</b>" \n– Se împiedică întreruperea pe ecranul complet \n– Nu se afișează niciodată scurt \n– Nu se emit sunete și nu vibrează niciodată \n– Se ascunde în ecranul de blocare și în bara de stare \n– Se afișează la finalul listei de notificări \n\n"<b>"Nivelul 0"</b>" \n– Se blochează toate notificările din aplicație"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificări"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Nu veți mai vedea aceste notificări"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"De regulă respingeți aceste notificări. \nDoriți să fie afișate în continuare?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Doriți să continuați afișarea acestor notificări?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Opriți notificările"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuați afișarea"</string> diff --git a/packages/SystemUI/res/values-ru/config.xml b/packages/SystemUI/res/values-ru/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ru/config.xml +++ b/packages/SystemUI/res/values-ru/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 3bda5eb5297b..9cd90827a39c 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -105,12 +105,9 @@ <string name="camera_label" msgid="7261107956054836961">"Открыть камеру."</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string> <string name="cancel" msgid="6442560571259935130">"Отмена"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок приложения"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Справочное сообщение"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка масштабирования (режим совместимости)"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Уменьшение изображения для увеличения свободного места на экране."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-соединение установлено."</string> @@ -317,6 +314,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi выкл."</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi включен"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Не удалось найти доступные сети Wi-Fi"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Передача изображения"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Безымянное устройство"</string> @@ -333,9 +332,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Соединение..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступа"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Подождите…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d устройство</item> + <item quantity="few">%d устройства</item> + <item quantity="many">%d устройств</item> + <item quantity="other">%d устройства</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Уведомления"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Фонарик"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобильный Интернет"</string> @@ -345,10 +348,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Использовано: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупреждение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Рабочий профиль"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Уведомления и приложения отключены"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Ночной режим"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Включить на закате"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До рассвета"</string> @@ -366,8 +367,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" отключено в безопасном режиме."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистить все"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетащите сюда, чтобы разделить экран"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Чтобы переключиться между приложениями, проведите по экрану вверх."</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Разделить по горизонтали"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Разделить по вертикали"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Разделить по-другому"</string> @@ -508,11 +508,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Отключить"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Развернуть"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Свернуть"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Сменить устройство аудиовыхода"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Блокировка в приложении включена"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Обзор\"."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Обзор\"."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"ОК"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Нет, спасибо"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Скрыть параметр \"<xliff:g id="TILE_LABEL">%1$s</xliff:g>\"?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Этот параметр появится в следующий раз, когда вы включите его."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скрыть"</string> @@ -592,8 +605,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"С помощью этой функции вы можете устанавливать уровень важности уведомлений от 0 до 5 для каждого приложения.\n\n"<b>"Уровень 5"</b>\n"‒ Помещать уведомления в начало списка.\n‒ Показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 4\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Показывать всплывающие уведомления.\nУровень 3\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\nУровень 2\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\nУровень 1\n"<b></b>\n"‒ Не показывать полноэкранные уведомления.\n‒ Не показывать всплывающие уведомления.\n‒ Не использовать звук и вибрацию.\n‒ Не показывать на экране блокировки и в строке состояния.\n‒ Помещать уведомления в конец списка.\nУровень 0\n"<b></b>\n"‒ Блокировать все уведомления приложения."</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Уведомления"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Вы больше не будете получать эти уведомления."</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Обычно вы скрываете эти уведомления.\nПоказывать их?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Показывать эти уведомления?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Отключить уведомления"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Показывать"</string> diff --git a/packages/SystemUI/res/values-si/config.xml b/packages/SystemUI/res/values-si/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-si/config.xml +++ b/packages/SystemUI/res/values-si/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 8c9208b68549..b041d48d1cc4 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"කැමරාව විවෘත කරන්න"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"නව කාර්යය සැකැස්ම තෝරන්න"</string> <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"යෙදුම් නිරූපකය"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"උදවු පණිවිඩ ප්රදේශය"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ගැළපෙන විශාලන බොත්තම."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"විශාල තිරය වෙත කුඩාව විශාලනය කරන්න."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"බ්ලූටූත් සම්බන්ධිතයි."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi අක්රියයි"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ක්රියාත්මකයි"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ජාල ලබා ගත නොහැකිය"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"කාස්ට් කිරීම"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"නම් නොකළ උපාංගය"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"සම්බන්ධ වෙමින්..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ටෙදරින්"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"හොට්ස්පොට්"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ක්රියාත්මක කරමින්…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">උපාංග %d</item> + <item quantity="other">උපාංග %d</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"දැනුම්දීම්"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"සැණෙළි ආලෝකය"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ජංගම දත්ත"</string> @@ -499,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"දැන් ක්රියාවිරහිත කරන්න"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"දිග හරින්න"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"හකුළන්න"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ප්රතිදාන උපාංගය මාරු කරන්න"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"තීරය අමුණන ලදි"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"හරි, තේරුණා"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"එපා ස්තූතියි"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> සඟවන්නද?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ඊළඟ අවස්ථාවේ සැකසීම් තුළ ඔබ එය සක්රිය කළ විට එය නැවත දිසිවේ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"සඟවන්න"</string> @@ -583,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"බල දැනුම්දීම් පාලන සමගින්, ඔබට යෙදුමක දැනුම්දීම් සඳහා වැදගත්කම 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="7506845022070889909">"දැනුම් දීම්"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ඔබට තවදුරටත් මෙම දැනුම්දීම් නොදකිනු ඇත"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"ඔබ සාමාන්යයෙන් මෙවැනි දැනුම්දීම් ඉවත දමයි. \nඒවා දිගටම පෙන්වන්නද?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"මෙම දැනුම්දීම් පෙන්වමින් තබන්නද?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"දැනුම්දීම් නවත්වන්න"</string> <string name="inline_keep_button" msgid="6665940297019018232">"පෙන්වමින් තබන්න"</string> diff --git a/packages/SystemUI/res/values-sk/config.xml b/packages/SystemUI/res/values-sk/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sk/config.xml +++ b/packages/SystemUI/res/values-sk/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sl/config.xml b/packages/SystemUI/res/values-sl/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sl/config.xml +++ b/packages/SystemUI/res/values-sl/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sq/config.xml b/packages/SystemUI/res/values-sq/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sq/config.xml +++ b/packages/SystemUI/res/values-sq/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sr/config.xml b/packages/SystemUI/res/values-sr/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sr/config.xml +++ b/packages/SystemUI/res/values-sr/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sv/config.xml b/packages/SystemUI/res/values-sv/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sv/config.xml +++ b/packages/SystemUI/res/values-sv/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sw/config.xml b/packages/SystemUI/res/values-sw/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-sw/config.xml +++ b/packages/SystemUI/res/values-sw/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 3880540bb9d3..a74f8a4c4e19 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"fungua kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Chagua muundo mpya wa kazi"</string> <string name="cancel" msgid="6442560571259935130">"Ghairi"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Aikoni ya programu"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Sehemu ya ujumbe wa usaidizi"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kichupo cha kukuza kwa utangamanifu"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kuza kidogo kwa skrini kubwa."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth imeunganishwa."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Imezimwa"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Imewasha Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hakuna mitandao ya Wi-Fi inayopatikana"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Tuma"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Inatuma"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Kifaa hakina jina"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Inaunganisha..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Kusambaza mtandao"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Mtandao-hewa"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Inawasha..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">Vifaa %d</item> + <item quantity="one">Kifaa %d</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Arifa"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Tochi"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data ya mtandao wa simu"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> imetumika"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"kikomo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Onyo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Wasifu wa kazini"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Umezima kipengele cha arifa na programu"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Mwanga wa Usiku"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Itawashwa machweo"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hadi macheo"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> imezimwa katika hali salama."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Futa zote"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Buruta hapa ili utumie skrini iliyogawanywa"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Telezesha kidole juu ili ubadilishe programu"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gawanya Mlalo"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Gawanya Wima"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Maalum Iliyogawanywa"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Izime sasa"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Panua"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Kunja"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Badilisha kifaa cha kutoa sauti"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skrini imebandikwa"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Muhtasari ili ubandue."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Nimeelewa"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Hapana, asante"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ungependa kuficha <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Itaonekana tena wakati mwingine utakapoiwasha katika mipangilio."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ficha"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Ukiwa na udhibiti wa arifa, unaweza kuweka kiwango cha umuhimu wa arifa za programu kuanzia 0 hadi 5. \n\n"<b>"Kiwango cha 5"</b>" \n- Onyesha katika sehemu ya juu ya orodha ya arifa \n- Ruhusu ukatizaji wa skrini nzima \n- Ruhusu arifa za kuchungulia kila wakati\n\n"<b>"Kiwango cha 4"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Ruhusu arifa za kuchungulia kila wakati \n\n"<b>"Kiwango cha 3"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia\n\n"<b>"Kiwango cha 2"</b>" \n- Zuia ukatizaji wa skrini nzima\n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti au mtetemo \n\n"<b>"Kiwango cha 1"</b>" \n- Zuia ukatizaji wa skrini nzima \n- Usiruhusu kamwe arifa za kuchungulia \n- Usiruhusu kamwe sauti na mtetemo \n- Usionyeshe skrini iliyofungwa na sehemu ya arifa \n- Onyesha katika sehemu ya chini ya orodha ya arifa \n\n"<b>"Kiwango cha 0"</b>" \n- Zuia arifa zote kutoka programu"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Arifa"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Hutaona tena arifa hizi"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Wewe huondoa arifa hizi. \nUngependa kuzionyesha?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Ungependa kuendelea kuonyesha arifa hizi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Acha kuonyesha arifa"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Endelea kuonyesha"</string> diff --git a/packages/SystemUI/res/values-ta/config.xml b/packages/SystemUI/res/values-ta/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ta/config.xml +++ b/packages/SystemUI/res/values-ta/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 774b2f24197b..c8ff5a175c95 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"கேமராவைத் திற"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string> <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"பயன்பாட்டு ஐகான்"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"உதவிச் செய்திக்கான பகுதி"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"பொருந்துமாறு அளவை மாற்றும் பொத்தான்."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"சிறியதிலிருந்து பெரிய திரைக்கு அளவை மாற்றும்."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"புளூடூத் இணைக்கப்பட்டது."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"வைஃபையை முடக்கு"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"இணைக்கிறது..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"டெதெரிங்"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ஹாட்ஸ்பாட்"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ஆன் செய்கிறது..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d சாதனங்கள்</item> + <item quantity="one">%d சாதனம்</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"அறிவிப்புகள்"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"டார்ச் லைட்"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"மொபைல் டேட்டா"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"பயன்படுத்தியது - <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> வரம்பு"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> எச்சரிக்கை"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"பணிச் சுயவிவரம்"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"அறிவிப்புகள் & ஆப்ஸ் ஆஃப் செய்யப்பட்டுள்ளன"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"இரவு ஒளி"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"மாலையில் ஆன் செய்"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"சூரிய உதயம் வரை"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"பாதுகாப்புப் பயன்முறையில் <xliff:g id="APP">%s</xliff:g> முடக்கப்பட்டது."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"அனைத்தையும் அழி"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"திரைப் பிரிப்பைப் பயன்படுத்த, இங்கே இழுக்கவும்"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"தனிவிருப்பத்தில் பிரி"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"இப்போதே முடக்கு"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"விரிவாக்கு"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"சுருக்கு"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"திரை பொருத்தப்பட்டது"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"புரிந்தது"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"வேண்டாம்"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"மறை"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ஆற்றல்மிக்க அறிவிப்புக் கட்டுப்பாடுகள் மூலம், பயன்பாட்டின் அறிவிப்புகளுக்கு முக்கியத்துவ நிலையை (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="7506845022070889909">"அறிவிப்புகள்"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"இந்த அறிவிப்புகளை இனி பார்க்கமாட்டீர்கள்"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"வழக்கமாக, இந்த அறிவிப்புகளை நிராகரிக்கிறீர்கள். \nதொடர்ந்து இவற்றைக் காட்டலாமா?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"இந்த அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"அறிவிப்புகளை நிறுத்து"</string> <string name="inline_keep_button" msgid="6665940297019018232">"அறிவிப்புகளைத் தொடர்ந்து காட்டு"</string> diff --git a/packages/SystemUI/res/values-te/config.xml b/packages/SystemUI/res/values-te/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-te/config.xml +++ b/packages/SystemUI/res/values-te/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index e143b906f7f8..292fddd0a90a 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string> <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"అప్లికేషన్ చిహ్నం"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"సహాయ సందేశ ప్రాంతం"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"అనుకూలత జూమ్ బటన్."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"చిన్న స్క్రీన్ నుండి పెద్దదానికి జూమ్ చేయండి."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"బ్లూటూత్ కనెక్ట్ చేయబడింది."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ఆఫ్లో ఉంది"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ఆన్లో ఉంది"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi నెట్వర్క్లు ఏవీ అందుబాటులో లేవు"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ప్రసారం చేయండి"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ప్రసారం చేస్తోంది"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"పేరులేని పరికరం"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"కనెక్ట్ అవుతోంది..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"టీథరింగ్"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"హాట్స్పాట్"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ఆన్ చేస్తోంది…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d పరికరాలు</item> + <item quantity="one">%d పరికరం</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"నోటిఫికేషన్లు"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ఫ్లాష్లైట్"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"మొబైల్ డేటా"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> వినియోగించబడింది"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> పరిమితి"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> హెచ్చరిక"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"కార్యాలయ ప్రొఫైల్"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"నోటిఫికేషన్లు & యాప్లు ఆఫ్ చేయి"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"రాత్రి కాంతి"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"సూర్యాస్తమయానికి"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"సూర్యోదయం వరకు"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> సురక్షిత-మోడ్లో నిలిపివేయబడింది."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"అన్నీ తీసివేయి"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"విభజన స్క్రీన్ను ఉపయోగించడానికి ఇక్కడ లాగండి"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"యాప్లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"సమతలంగా విభజించు"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"లంబంగా విభజించు"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"అనుకూలంగా విభజించు"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ఇప్పుడు ఆఫ్ చేయండి"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"విస్తరింపజేయండి"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"కుదించండి"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"స్క్రీన్ పిన్ చేయబడింది"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి స్థూలదృష్టిని తాకి & అలాగే పట్టుకోండి."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"అర్థమైంది"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"వద్దు, ధన్యవాదాలు"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ని దాచాలా?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"మీరు సెట్టింగ్ల్లో దీన్ని ఆన్ చేసిన తదుపరిసారి ఇది కనిపిస్తుంది."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"దాచు"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"పవర్ నోటిఫికేషన్ నియంత్రణలతో, మీరు యాప్ నోటిఫికేషన్ల కోసం ప్రాముఖ్యత స్థాయిని 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="7506845022070889909">"నోటిఫికేషన్లు"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ఇకపై మీకు ఈ నోటిఫికేషన్లు కనిపించవు"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"మీరు సాధారణంగా ఈ నోటిఫికేషన్లను విస్మరిస్తారు. \nవాటి ప్రదర్శనను కొనసాగించాలా?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ఈ నోటిఫికేషన్లను చూపిస్తూ ఉండాలా?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"నోటిఫికేషన్లను ఆపివేయి"</string> <string name="inline_keep_button" msgid="6665940297019018232">"చూపిస్తూనే ఉండు"</string> diff --git a/packages/SystemUI/res/values-th/config.xml b/packages/SystemUI/res/values-th/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-th/config.xml +++ b/packages/SystemUI/res/values-th/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-tl/config.xml b/packages/SystemUI/res/values-tl/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-tl/config.xml +++ b/packages/SystemUI/res/values-tl/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-tr/config.xml b/packages/SystemUI/res/values-tr/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-tr/config.xml +++ b/packages/SystemUI/res/values-tr/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 8a289be4251e..9adc14150c7f 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"kamerayı aç"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni görev düzenini seçin"</string> <string name="cancel" msgid="6442560571259935130">"İptal"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Uygulama simgesi"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı alanı"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Uyumluluk zum düğmesi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Daha büyük ekrana daha küçük yakınlaştır."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth bağlandı."</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Kablosuz Kapalı"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kablosuz Bağlantı Açık"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Kullanılabilir kablosuz ağ yok"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayınla"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Yayınlanıyor"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Bağlanılıyor..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Açılıyor..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d cihaz</item> + <item quantity="one">%d cihaz</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Bildirimler"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Fener"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobil veri"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> kullanıldı"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Sınır: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> uyarısı"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"İş profili"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Bildirimler ve uygulamalar kapalı"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Gece Işığı"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Gün batımı açılacak"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Gün doğumuna kadar"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>, güvenli modda devre dışıdır."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tümünü temizle"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölünmüş olarak kullanmak için burayı sürükleyin"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Yatay Ayırma"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dikey Ayırma"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Özel Ayırma"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Şimdi kapat"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Genişlet"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Daralt"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran sabitlendi"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Genel bakış\'a dokunup basılı tutun."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Hayır, teşekkürler"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlensin mi?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlardan etkinleştirdiğiniz bir sonraki sefer tekrar görünür."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizle"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Güç bildirim kontrolleriyle, bir uygulamanın bildirimleri için 0 ile 5 arasında bir önem düzeyi ayarlayabilirsiniz. \n\n"<b>"5. Düzey"</b>" \n- Bildirim listesinin en üstünde gösterilsin \n- Tam ekran kesintisine izin verilsin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"4. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda her zaman kısaca belirsin \n\n"<b>"3. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n\n"<b>"2. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman belirmesin \n- Hiçbir zaman ses çıkarmasın ve titreştirmesin \n\n"<b>"1. Düzey"</b>" \n- Tam ekran kesintisi engellensin \n- Ekranda hiçbir zaman kısaca belirmesin \n- Hiçbir zaman ses çıkarmasın veya titreştirmesin \n- Kilit ekranından ve durum çubuğundan gizlensin \n- Bildirim listesinin en altında gösterilsin \n\n"<b>"0. Düzey"</b>" \n- Uygulamadan gelen tüm bildirimler engellensin"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirimler"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Bu bildirimleri artık görmeyeceksiniz"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Bu bildirimleri genellikle kapatıyorsunuz. \nBildirimler gösterilmeye devam edilsin mi?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirimler gösterilmeye devam edilsin mi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bildirimleri durdur"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Göstermeye devam et"</string> diff --git a/packages/SystemUI/res/values-uk/config.xml b/packages/SystemUI/res/values-uk/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-uk/config.xml +++ b/packages/SystemUI/res/values-uk/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index f2961437380f..38347531fa05 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -105,12 +105,9 @@ <string name="camera_label" msgid="7261107956054836961">"відкрити камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string> <string name="cancel" msgid="6442560571259935130">"Скасувати"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок додатка"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Область довідкового повідомлення"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка масштабування сумісності."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Збільшення екрана."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth під’єднано."</string> @@ -317,6 +314,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi вимкнено"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi увімкнено"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Немає доступних мереж Wi-Fi"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляція"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string> @@ -333,9 +332,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"З’єднання…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Режим модема"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка доступу"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Увімкнення…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d пристрій</item> + <item quantity="few">%d пристрої</item> + <item quantity="many">%d пристроїв</item> + <item quantity="other">%d пристрою</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Сповіщення"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Ліхтарик"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобільне передавання даних"</string> @@ -345,10 +348,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Використовується: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Обмеження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Застереження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Робочий профіль"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Сповіщення й додатки вимкнено"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Нічний режим"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Вмикається ввечері"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До сходу сонця"</string> @@ -366,8 +367,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Додаток <xliff:g id="APP">%s</xliff:g> вимкнено в безпечному режимі."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистити все"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетягніть сюди, щоб увімкнути режим розділеного екрана"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Проводьте пальцем угору, щоб переходити між додатками"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Розділити горизонтально"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Розділити вертикально"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Розділити (власний варіант)"</string> @@ -508,11 +508,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Вимкнути"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Розгорнути"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Згорнути"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Увімкніть пристрій виведення"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екран закріплено"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопку \"Огляд\"."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Зрозуміло"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ні, дякую"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сховати <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"З’явиться знову, коли ви ввімкнете його в налаштуваннях."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сховати"</string> @@ -592,8 +605,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"За допомогою елементів керування сповіщеннями ви можете налаштувати пріоритет сповіщень додатка – від 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="7506845022070889909">"Сповіщення"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Ви більше не бачитимете цих сповіщень"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Ви зазвичай закриваєте ці сповіщення. \nПоказувати їх?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Чи показувати ці сповіщення надалі?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Не показувати сповіщення"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Показувати надалі"</string> diff --git a/packages/SystemUI/res/values-ur/config.xml b/packages/SystemUI/res/values-ur/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-ur/config.xml +++ b/packages/SystemUI/res/values-ur/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 8099ef48c4c4..9ebdfeb0c0b5 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"کیمرا کھولیں"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string> <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ایپلیکیشن کا آئیکن"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"امدادی پیغام کا علاقہ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"مطابقت پذیری زوم بٹن۔"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"چھوٹی سے بڑی اسکرین پر زوم کریں۔"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"بلوٹوتھ مربوط ہے۔"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi آف ہے"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi آن ہے"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"کوئی WI-FI نیٹ ورک دستیاب نہیں"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"کاسٹ کریں"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"کاسٹنگ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"بغیر نام والا آلہ"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"مربوط ہو رہا ہے…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ٹیدرنگ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ہاٹ اسپاٹ"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"آن ہو رہا ہے…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d آلات</item> + <item quantity="one">%d آلہ</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"اطلاعات"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"فلیش لائٹ"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"موبائل ڈیٹا"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استعمال کردہ"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> حد"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> وارننگ"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"دفتری پروفائل"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"اطلاعات اور ایپس آف ہیں"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"نائٹ لائٹ"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"غروب آفتاب کے وقت آن ہوگی"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"طلوع آفتاب تک"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"محفوظ موڈ میں <xliff:g id="APP">%s</xliff:g> غیر فعال ہوتی ہے۔"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"سبھی کو صاف کریں"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"اسپلٹ اسکرین استعمال کرنے کیلئے یہاں گھسیٹیں"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"بلحاظ افقی الگ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"بلحاظ عمودی الگ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"بلحاظ حسب ضرورت الگ کریں"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ابھی بند کریں"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"پھیلائیں"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"سکیڑیں"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"اسکرین پن کردہ ہے"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے مجموعی جائزہ بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"سمجھ آ گئی"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"نہیں شکریہ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> کو چھپائیں؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"اگلی بار جب آپ اسے ترتیبات میں آن کریں گے تو یہ ظاہر ہوگی۔"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"چھپائیں"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"پاور اطلاع کنٹرولز کے ساتھ آپ کسی ایپ کی اطلاعات کیلئے 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="7506845022070889909">"اطلاعات"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"آپ کو یہ اطلاعات مزید دکھائی نہیں دیں گی"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"آپ عام طور پر ان اطلاعات کو مسترد کرتے ہیں۔ \nان کو دکھاتے رہیں؟"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"یہ اطلاعات دکھانا جاری رکھیں؟"</string> <string name="inline_stop_button" msgid="4172980096860941033">"اطلاعات روک دیں"</string> <string name="inline_keep_button" msgid="6665940297019018232">"دکھانا جاری رکھیں"</string> diff --git a/packages/SystemUI/res/values-uz/config.xml b/packages/SystemUI/res/values-uz/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-uz/config.xml +++ b/packages/SystemUI/res/values-uz/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 612859ba7e3a..37d81182c5bd 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"kamerani ochish"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yangi vazifa tartibini tanlash"</string> <string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ilova ikonkasi"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yordam xabari"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kattalashtirish tugmasi mosligi."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kattaroq ekran uchun kichikroqni kattalashtirish."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ulandi."</string> @@ -288,7 +285,7 @@ <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Garnitura"</string> - <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Matn kiritish"</string> + <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Kirish"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Yorqinlik"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtomatik burilish"</string> <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Ekranning avtomatik burilishi"</string> @@ -313,6 +310,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi o‘chiq"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi yoqilgan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hech qanday Wi-Fi tarmog‘i mavjud emas"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Translatsiya"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Translatsiya qilinmoqda"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nomsiz qurilma"</string> @@ -329,9 +328,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Ulanmoqda…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Modem rejimi"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Yoqilmoqda…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d ta qurilma</item> + <item quantity="one">%d ta qurilma</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Bildirishnomalar"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Fonar"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobil internet"</string> @@ -341,10 +342,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ishlatilgan"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Cheklov: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Ogohlantirish: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Ishchi profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Bildirishnomalar va ilovalar o‘chiq"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Tungi rejim"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kunbotarda yoqish"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Quyosh chiqqunicha"</string> @@ -362,8 +361,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Xavfsiz rejimda <xliff:g id="APP">%s</xliff:g> ilovasi o‘chirib qo‘yildi."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hammasini tozalash"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranni bo‘lish xususiyatidan foydalanish uchun bu yerga torting"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Ilovalarni almashtirish uchun ekranni tepaga suring"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gorizontal yo‘nalishda bo‘lish"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikal yo‘nalishda bo‘lish"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Boshqa usulda bo‘lish"</string> @@ -504,11 +502,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"O‘chiring"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Yoyish"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Yig‘ish"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran qadaldi"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Umumiy ma’lumot” tugmasini bosib turing."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Yo‘q, kerakmas"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> berkitilsinmi?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Keyingi safar sozlamalardan yoqilgan paydo bo‘ladi."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Berkitish"</string> @@ -588,8 +600,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Bildirishnomalar uchun kengaytirilgan boshqaruv yordamida ilova bildirishnomalarining muhimlik darajasini (0-5) sozlash mumkin. \n\n"<b>"5-daraja"</b>" \n- Bildirishnomani ro‘yxatning boshida ko‘rsatish \n- To‘liq ekranli bildirishnomalarni ko‘rsatish \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"4-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatish \n\n"<b>"3-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n\n"<b>"2-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n\n"<b>"1-daraja"</b>" \n- To‘liq ekranli bildirishnomalarni ko‘rsatmaslik \n- Qalqib chiquvchi bildirishnomalarni ko‘rsatmaslik \n- Ovoz va tebranishdan foydalanmaslik \n- Ekran qulfi va holat qatorida ko‘rsatmaslik \n- Bildirishnomani ro‘yxatning oxirida ko‘rsatish \n\n"<b>"0-daraja"</b>" \n- Ilovadan keladigan barcha bildirishnomalarni bloklash"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Bildirishnomalar"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Bu bildirishnomalar endi chiqmaydi"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Odatda bunday bildirishnomalarni yopasiz. \nUlar ochiq tursinmi?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Mazkur bildirishnomalar chiqaversinmi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Chiqmasin"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Ha"</string> diff --git a/packages/SystemUI/res/values-vi/config.xml b/packages/SystemUI/res/values-vi/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-vi/config.xml +++ b/packages/SystemUI/res/values-vi/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/config.xml b/packages/SystemUI/res/values-zh-rCN/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-zh-rCN/config.xml +++ b/packages/SystemUI/res/values-zh-rCN/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/config.xml b/packages/SystemUI/res/values-zh-rHK/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-zh-rHK/config.xml +++ b/packages/SystemUI/res/values-zh-rHK/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/config.xml b/packages/SystemUI/res/values-zh-rTW/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-zh-rTW/config.xml +++ b/packages/SystemUI/res/values-zh-rTW/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index e08bf691bb36..9c425b0b85e5 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"開啟攝影機"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"應用程式圖示"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"說明訊息區域"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較小螢幕的畫面放大在較大螢幕上顯示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"藍牙連線已建立。"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 已關閉"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"已開啟 Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有 Wi-Fi 網路"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"連線中..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"網路共用"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"無線基地台"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"開啟中..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d 個裝置</item> + <item quantity="one">%d 個裝置</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手電筒"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"行動數據"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用 <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限為 <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Work 設定檔"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"已關閉通知和應用程式"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"夜燈"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"於日落時開啟"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"於日出時關閉"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」在安全模式中為停用狀態。"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"拖曳到這裡即可使用分割畫面"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑動即可切換應用程式"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string> @@ -502,11 +500,25 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"立即停用"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"不用了,謝謝"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string> @@ -586,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"只要使用電源通知控制項,你就能為應用程式通知設定從 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="7506845022070889909">"通知"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"你不會再看到這些通知"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"你通常會關閉這些通知。\n要繼續顯示通知嗎?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"停止顯示通知"</string> <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string> diff --git a/packages/SystemUI/res/values-zu/config.xml b/packages/SystemUI/res/values-zu/config.xml index 477f2198e4a6..5309563e3986 100644 --- a/packages/SystemUI/res/values-zu/config.xml +++ b/packages/SystemUI/res/values-zu/config.xml @@ -22,6 +22,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="config_overviewServiceComponent" msgid="2288311504315574053">"com.android.launcher3/com.android.quickstep.TouchInteractionService"</string> <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index a99b8cce4640..d291a198f843 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -103,12 +103,9 @@ <string name="camera_label" msgid="7261107956054836961">"vula ikhamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Khetha isakhiwo somsebenzi omusha"</string> <string name="cancel" msgid="6442560571259935130">"Khansela"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Isithonjana sohlelo lokusebenza"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Indawo yosizo lomlayezo"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Inkinobho evumelekile yokusondeza"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Sondeza kancane esikrinini esikhudlwana"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ixhunyiwe"</string> @@ -311,6 +308,8 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"I-Wi-Fi icimile"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"I-Wi-Fi ivuliwe"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Awekho amanethiwekhi we-Wi-Fi atholakalayo"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Abalingisi"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Ukusakaza"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Idivayisi engenalo igama"</string> @@ -327,9 +326,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Iyaxhuma..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Ukusebenzisa njengemodemu"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"I-Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Iyavula..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d amadivayisi</item> + <item quantity="other">%d amadivayisi</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Izaziso"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"I-Flashlight"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Idatha yeselula"</string> @@ -339,10 +340,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> isetshenzisiwe"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> umkhawulo"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> isexwayiso"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Iphrofayela yomsebenzi"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Izaziso nezinhlelo zokusebenza kuvaliwe"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Ukukhanya kwasebusuku"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kuvulwe ekushoneni kwelanga"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuze kube sekuphumeni kwelanga"</string> @@ -360,8 +359,7 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"I-<xliff:g id="APP">%s</xliff:g> ikhutshaziwe kumodi yokuphepha."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Sula konke"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Hudulela lapha ukuze usebenzise ukuhlukanisa kwesikrini"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> + <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Hlukanisa okuvundlile"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Hlukanisa okumile"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Hlukanisa kwezifiso"</string> @@ -502,11 +500,24 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Vala manje"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Nweba"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Goqa"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Shintsha idivayisi yokukhipha"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Isikrini siphiniwe"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina."</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe Ukubuka konke ukuze ususe ukuphina."</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ngiyitholile"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Cha ngiyabonga"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fihla i-<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Izovela ngesikhathi esilandelayo uma uvule lesi silungiselelo."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fihla"</string> @@ -586,8 +597,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Ngezilawuli zesaziso zamandla, ungasetha ileveli ebalulekile kusuka ku-0 kuya ku-5 kusuka kuzaziso zohlelo lokusebenza. \n\n"<b>"Ileveli 5"</b>" \n- Ibonisa phezulu kuhlu lwesaziso \n- Vumela ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 4"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukuhlola njalo \n\n"<b>"Ileveli 3"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n\n"<b>"Ileveli 2"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo nokudlidliza \n\n"<b>"Ileveli 1"</b>" \n- Gwema ukuphazamiseka kwesikrini esigcwele \n- Ukungahloli \n- Ungenzi umsindo noma ukudlidliza \n- Fihla kusuka kusikrini sokukhiya nebha yesimo \n- Bonisa phansi kohlu lwesaziso \n\n"<b>"Ileveli 0"</b>" \n- Vimbela zonke izaziso kusuka kuhlelo lokusebenza"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Izaziso"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Ngeke usabona lezi zaziso"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <string name="inline_blocking_helper" msgid="3055064577771478591">"Uvamise ukucashisa lezi zaziso. \nQhubeka ulokhu uzibonisa?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Qhubeka nokubonisa lezi zaziso?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Misa izaziso"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Qhubeka nokubonisa"</string> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index ae910fe57089..f2e5d3b2cc3f 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -46,7 +46,7 @@ <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.phone.StatusBar</string> <!-- Component name of launcher service for overview to connect to --> - <string name="config_overviewServiceComponent" translateable="false">com.android.launcher3/com.android.quickstep.TouchInteractionService</string> + <string name="config_overviewServiceComponent" translatable="false">com.android.launcher3/com.android.quickstep.TouchInteractionService</string> <!-- Whether or not we show the number in the bar. --> <bool name="config_statusBarShowNumber">false</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 3db79d7556d5..e55c65a47f7b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -262,7 +262,11 @@ <!-- The width of the panel that holds the quick settings. --> <dimen name="qs_panel_width">@dimen/notification_panel_width</dimen> - <dimen name="volume_dialog_panel_width">120dp</dimen> + <!-- the amount the volume panel should be offset at the end from the view next to it (or + the scren edge, in portrait--> + <dimen name="volume_dialog_base_margin">12dp</dimen> + + <dimen name="volume_dialog_panel_width">100dp</dimen> <dimen name="output_chooser_panel_width">320dp</dimen> @@ -332,6 +336,8 @@ <dimen name="qs_footer_padding_start">16dp</dimen> <dimen name="qs_footer_padding_end">24dp</dimen> <dimen name="qs_footer_icon_size">16dp</dimen> + <!-- Difference between drag handle margin in QQS and expanded QS --> + <dimen name="qs_footer_drag_handle_offset">6dp</dimen> <dimen name="qs_notif_collapsed_space">64dp</dimen> @@ -902,4 +908,11 @@ <dimen name="config_batteryLevelTextSizeEnd" format="float">32.0</dimen> <!-- Wireless Charging battery level text animation duration --> <integer name="config_batteryLevelTextAnimationDuration">400</integer> + + <!-- Wired charging on AOD, text animation duration --> + <integer name="wired_charging_aod_text_animation_duration_down">500</integer> + <!-- Wired charging on AOD, text animation duration --> + <integer name="wired_charging_aod_text_animation_duration_up">300</integer> + <!-- Wired charging on AOD, text animation distance --> + <integer name="wired_charging_aod_text_animation_distance">-30</integer> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 5557f8eda005..fadcbcd4f4bc 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1281,12 +1281,23 @@ <string name="screen_pinning_title">Screen is pinned</string> <!-- Screen pinning dialog description. --> <string name="screen_pinning_description">This keeps it in view until you unpin. Touch & hold Back and Overview to unpin.</string> + <string name="screen_pinning_description_recents_invisible">This keeps it in view until you unpin. Touch & hold Back and Home to unpin.</string> <!-- Screen pinning dialog description. --> <string name="screen_pinning_description_accessible">This keeps it in view until you unpin. Touch & hold Overview to unpin.</string> + <string name="screen_pinning_description_recents_invisible_accessible">This keeps it in view until you unpin. Touch & hold Home to unpin.</string> + <!-- Notify use that they are in Lock-to-app --> + <string name="screen_pinning_toast">To unpin this screen, touch & hold Back and Overview + buttons</string> + <string name="screen_pinning_toast_recents_invisible">To unpin this screen, touch & hold Back + and Home buttons</string> <!-- Screen pinning positive response. --> <string name="screen_pinning_positive">Got it</string> <!-- Screen pinning negative response. --> <string name="screen_pinning_negative">No thanks</string> + <!-- Enter/Exiting screen pinning indication. --> + <string name="screen_pinning_start">Screen pinned</string> + <string name="screen_pinning_exit">Screen unpinned</string> + <!-- Hide quick settings tile confirmation title --> <string name="quick_settings_reset_confirmation_title">Hide <xliff:g id="tile_label" example="Hotspot">%1$s</xliff:g>?</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 2497d2080592..d2ed4d117cd8 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -410,16 +410,11 @@ <item name="android:textColor">?android:attr/textColorSecondary</item> </style> - <style name="TextAppearance.Volume.ZenSummary"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif-medium</item> + <style name="TextAppearance.Volume.Header.Secondary"> + <item name="android:textSize">12sp</item> + <item name="android:textColor">?android:attr/textColorTertiary</item> </style> - <style name="TextAppearance.Volume.ZenDetail"> - <item name="android:textSize">14sp</item> - <item name="android:fontFamily">sans-serif</item> - <item name="android:textColor">?android:attr/textColorSecondary</item> - </style> <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless"> <item name="android:background">@drawable/btn_borderless_rect</item> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index f9e1069cfe95..90e3b1e73454 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -16,6 +16,8 @@ package com.android.systemui.shared.system; +import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; +import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; @@ -31,6 +33,7 @@ import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IAssistDataReceiver; import android.app.WindowConfiguration.ActivityType; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -47,6 +50,7 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; +import android.provider.Settings; import android.util.IconDrawableFactory; import android.util.Log; import android.view.IRecentsAnimationController; @@ -436,4 +440,23 @@ public class ActivityManagerWrapper { Log.w(TAG, "Failed to cancel window transition for task=" + taskId, e); } } + + /** + * @return whether there is currently a locked task (ie. in screen pinning). + */ + public boolean isLockToAppActive() { + try { + return ActivityManager.getService().getLockTaskModeState() != LOCK_TASK_MODE_NONE; + } catch (RemoteException e) { + return false; + } + } + + /** + * @return whether screen pinning is enabled. + */ + public boolean isLockToAppEnabled() { + final ContentResolver cr = AppGlobals.getInitialApplication().getContentResolver(); + return Settings.System.getInt(cr, Settings.System.LOCK_TO_APP_ENABLED, 0) != 0; + } } diff --git a/packages/SystemUI/src/com/android/systemui/Interpolators.java b/packages/SystemUI/src/com/android/systemui/Interpolators.java index b8cfa3e48c20..aeef49689517 100644 --- a/packages/SystemUI/src/com/android/systemui/Interpolators.java +++ b/packages/SystemUI/src/com/android/systemui/Interpolators.java @@ -18,6 +18,7 @@ package com.android.systemui; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; +import android.view.animation.BounceInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; @@ -43,6 +44,7 @@ public class Interpolators { public static final Interpolator ICON_OVERSHOT = new PathInterpolator(0.4f, 0f, 0.2f, 1.4f); public static final Interpolator PANEL_CLOSE_ACCELERATED = new PathInterpolator(0.3f, 0, 0.5f, 1); + public static final Interpolator BOUNCE = new BounceInterpolator(); /** * Interpolator to be used when animating a move based on a click. Pair with enough duration. diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java index 8d8b726f8fa8..b7e1d67a5b3a 100644 --- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java @@ -199,7 +199,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis launcherServiceIntent.setComponent(mLauncherComponentName); boolean bound = mContext.bindServiceAsUser(launcherServiceIntent, mOverviewServiceConnection, Context.BIND_AUTO_CREATE, - UserHandle.getUserHandleForUid(mDeviceProvisionedController.getCurrentUser())); + UserHandle.of(mDeviceProvisionedController.getCurrentUser())); if (!bound) { // Retry after exponential backoff timeout final long timeoutMs = (long) Math.scalb(BACKOFF_MILLIS, mConnectionBackoffAttempts); diff --git a/packages/SystemUI/src/com/android/systemui/SysUIToast.java b/packages/SystemUI/src/com/android/systemui/SysUIToast.java index 89bc82f87930..43b918dbea73 100644 --- a/packages/SystemUI/src/com/android/systemui/SysUIToast.java +++ b/packages/SystemUI/src/com/android/systemui/SysUIToast.java @@ -15,13 +15,19 @@ */ package com.android.systemui; +import android.annotation.StringRes; import android.content.Context; import android.view.WindowManager; import android.widget.Toast; +import static android.widget.Toast.Duration; public class SysUIToast { - public static Toast makeText(Context context, CharSequence text, int duration) { + public static Toast makeText(Context context, @StringRes int resId, @Duration int duration) { + return makeText(context, context.getString(resId), duration); + } + + public static Toast makeText(Context context, CharSequence text, @Duration int duration) { Toast toast = Toast.makeText(context, text, duration); toast.getWindowParams().privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index e661fa7c2247..ea2a432ea6ca 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -142,8 +142,12 @@ public class PowerUI extends SystemUI { final int lowPowerModeTriggerLevel = Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, defWarnLevel); - // NOTE: Keep the logic in sync with BatteryService. - // TODO: Propagate this value from BatteryService to system UI, really. + // Note LOW_POWER_MODE_TRIGGER_LEVEL can take any value between 0 and 100, but + // for the UI purposes, let's cap it at 15% -- i.e. even if the trigger level is higher + // like 50%, let's not show the "low battery" notification until it hits + // config_lowBatteryWarningLevel, which is 15% by default. + // LOW_POWER_MODE_TRIGGER_LEVEL is still used in other places as-is. For example, if it's + // 50, then battery saver kicks in when the battery level hits 50%. int warnLevel = Math.min(defWarnLevel, lowPowerModeTriggerLevel); if (warnLevel == 0) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 001b40980065..222c6e8274f5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -20,11 +20,12 @@ import android.view.View.OnAttachStateChangeListener; import android.view.View.OnLayoutChangeListener; import com.android.systemui.Dependency; -import com.android.systemui.plugins.qs.*; +import com.android.systemui.plugins.qs.QS; +import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.PagedTileLayout.PageListener; -import com.android.systemui.qs.QSPanel.QSTileLayout; import com.android.systemui.qs.QSHost.Callback; +import com.android.systemui.qs.QSPanel.QSTileLayout; import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.qs.TouchAnimator.Listener; import com.android.systemui.tuner.TunerService; @@ -61,6 +62,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private TouchAnimator mTranslationXAnimator; private TouchAnimator mTranslationYAnimator; private TouchAnimator mNonfirstPageAnimator; + private TouchAnimator mNonfirstPageDelayedAnimator; private TouchAnimator mBrightnessAnimator; private boolean mOnKeyguard; @@ -83,10 +85,10 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha QSTileLayout tileLayout = mQsPanel.getTileLayout(); if (tileLayout instanceof PagedTileLayout) { mPagedLayout = ((PagedTileLayout) tileLayout); - mPagedLayout.setPageListener(this); } else { Log.w(TAG, "QS Not using page layout"); } + panel.setPageListener(this); } public void onRtlChanged() { @@ -271,6 +273,9 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha .setListener(mNonFirstPageListener) .setEndDelay(.5f) .build(); + mNonfirstPageDelayedAnimator = new TouchAnimator.Builder() + .setStartDelay(.14f) + .addFloat(tileLayout, "alpha", 0, 1).build(); } private boolean isIconInAnimatedRow(int count) { @@ -315,6 +320,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha } } else { mNonfirstPageAnimator.setPosition(position); + mNonfirstPageDelayedAnimator.setPosition(position); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java index 9c87e1b12091..fe3ffb926305 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java @@ -21,7 +21,6 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.PorterDuff.Mode; import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; @@ -47,7 +46,6 @@ import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.phone.ExpandableIndicator; import com.android.systemui.statusbar.phone.MultiUserSwitch; import com.android.systemui.statusbar.phone.SettingsButton; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -61,6 +59,7 @@ import com.android.systemui.tuner.TunerService; public class QSFooterImpl extends FrameLayout implements QSFooter, OnClickListener, OnUserInfoChangedListener, EmergencyListener, SignalCallback, CommandQueue.Callbacks { + private ActivityStarter mActivityStarter; private UserInfoController mUserInfoController; private SettingsButton mSettingsButton; @@ -79,21 +78,29 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, protected MultiUserSwitch mMultiUserSwitch; private ImageView mMultiUserAvatar; - protected TouchAnimator mSettingsAlpha; + protected TouchAnimator mFooterAnimator; private float mExpansionAmount; protected View mEdit; - private TouchAnimator mAnimator; + private TouchAnimator mSettingsCogAnimator; private View mActionsContainer; + private View mDragHandle; + private final int mDragHandleExpandOffset; + private View mBackground; public QSFooterImpl(Context context, AttributeSet attrs) { super(context, attrs); + + mDragHandleExpandOffset = getResources(). + getDimensionPixelSize(R.dimen.qs_footer_drag_handle_offset); + } @Override protected void onFinishInflate() { super.onFinishInflate(); + mBackground = findViewById(R.id.qs_footer_background); mDivider = findViewById(R.id.qs_footer_divider); mEdit = findViewById(android.R.id.edit); mEdit.setOnClickListener(view -> @@ -109,6 +116,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, mMultiUserSwitch = findViewById(R.id.multi_user_switch); mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); + mDragHandle = findViewById(R.id.qs_drag_handle_view); mActionsContainer = findViewById(R.id.qs_footer_actions_container); // RenderThread is doing more harm than good when touching the header (to expand quick @@ -130,7 +138,7 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, int remaining = (width - numTiles * size) / (numTiles - 1); int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); - mAnimator = new Builder() + mSettingsCogAnimator = new Builder() .addFloat(mSettingsContainer, "translationX", isLayoutRtl() ? (remaining - defSpace) : -(remaining - defSpace), 0) .addFloat(mSettingsButton, "rotation", -120, 0) @@ -152,19 +160,21 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, } private void updateResources() { - updateSettingsAnimator(); + updateFooterAnimator(); } - private void updateSettingsAnimator() { - mSettingsAlpha = createSettingsAlphaAnimator(); + private void updateFooterAnimator() { + mFooterAnimator = createFooterAnimator(); } @Nullable - private TouchAnimator createSettingsAlphaAnimator() { + private TouchAnimator createFooterAnimator() { return new TouchAnimator.Builder() + .addFloat(mBackground, "alpha", 0, 0.90f) .addFloat(mDivider, "alpha", 0, 1) .addFloat(mCarrierText, "alpha", 0, 1) .addFloat(mActionsContainer, "alpha", 0, 1) + .addFloat(mDragHandle, "translationY", 0, -mDragHandleExpandOffset) .build(); } @@ -183,10 +193,10 @@ public class QSFooterImpl extends FrameLayout implements QSFooter, @Override public void setExpansion(float headerExpansionFraction) { mExpansionAmount = headerExpansionFraction; - if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction); + if (mSettingsCogAnimator != null) mSettingsCogAnimator.setPosition(headerExpansionFraction); - if (mSettingsAlpha != null) { - mSettingsAlpha.setPosition(headerExpansionFraction); + if (mFooterAnimator != null) { + mFooterAnimator.setPosition(headerExpansionFraction); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 00b6c1ed2475..f7c388db0840 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -26,6 +26,7 @@ import android.metrics.LogMaker; import android.os.Handler; import android.os.Message; import android.service.quicksettings.Tile; +import android.support.v4.widget.Space; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -97,7 +98,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne R.layout.quick_settings_brightness_dialog, this, false); mTileLayout = new TileLayout(mContext); mTileLayout.setListening(mListening); - mScrollLayout = new QSScrollLayout(mContext, mBrightnessView, (View) mTileLayout); + Space space = new Space(mContext); + space.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, + mContext.getResources().getDimensionPixelSize(R.dimen.qs_footer_height))); + mScrollLayout = new QSScrollLayout(mContext, mBrightnessView, (View) mTileLayout, space); addView(mScrollLayout); addDivider(); @@ -281,6 +285,20 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne } } + public void setPageListener(final PagedTileLayout.PageListener pageListener) { + if (mTileLayout instanceof PagedTileLayout) { + ((PagedTileLayout) mTileLayout).setPageListener(pageListener); + } else { + mScrollLayout.setOnScrollChangeListener(new OnScrollChangeListener() { + @Override + public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, + int oldScrollY) { + pageListener.onPageChanged(scrollY == 0); + } + }); + } + } + public boolean isExpanded() { return mExpanded; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java b/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java index 9a747877d9be..9cda75c858e8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSScrollLayout.java @@ -15,7 +15,6 @@ package com.android.systemui.qs; import android.content.Context; -import android.graphics.Rect; import android.support.v4.widget.NestedScrollView; import android.view.MotionEvent; import android.view.View; @@ -23,6 +22,8 @@ import android.view.ViewConfiguration; import android.view.ViewParent; import android.widget.LinearLayout; +import com.android.systemui.R; + /** * Quick setting scroll view containing the brightness slider and the QS tiles. * @@ -32,12 +33,13 @@ import android.widget.LinearLayout; */ public class QSScrollLayout extends NestedScrollView { private final int mTouchSlop; + private final int mFooterHeight; private int mLastMotionY; - private Rect mHitRect = new Rect(); public QSScrollLayout(Context context, View... children) { super(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + mFooterHeight = getResources().getDimensionPixelSize(R.dimen.qs_footer_height); LinearLayout linearLayout = new LinearLayout(mContext); linearLayout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, @@ -50,9 +52,8 @@ public class QSScrollLayout extends NestedScrollView { } public boolean shouldIntercept(MotionEvent ev) { - getHitRect(mHitRect); - if (!mHitRect.contains((int) ev.getX(), (int) ev.getY())) { - // Do not intercept touches that are not within this view's bounds. + if (ev.getY() > (getBottom() - mFooterHeight)) { + // Do not intercept touches that are below the divider between QS and the footer. return false; } if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index aaf6ef52d761..6205e9afcb03 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -19,8 +19,6 @@ package com.android.systemui.qs.tiles; import static android.provider.Settings.Global.ZEN_MODE_ALARMS; import static android.provider.Settings.Global.ZEN_MODE_OFF; -import android.app.AlarmManager; -import android.app.AlarmManager.AlarmClockInfo; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -30,11 +28,9 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Global; -import android.service.notification.ScheduleCalendar; import android.service.notification.ZenModeConfig; import android.service.notification.ZenModeConfig.ZenRule; import android.service.quicksettings.Tile; @@ -56,7 +52,6 @@ import com.android.systemui.R; import com.android.systemui.SysUIToast; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; -import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.tileimpl.QSTileImpl; @@ -197,7 +192,8 @@ public class DndTile extends QSTileImpl<BooleanState> { state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; state.slash.isSlashed = !state.value; state.label = getTileLabel(); - state.secondaryLabel = getSecondaryLabel(zen != Global.ZEN_MODE_OFF); + state.secondaryLabel = ZenModeConfig.getDescription(mContext,zen != Global.ZEN_MODE_OFF, + mController.getConfig()); state.icon = ResourceIcon.get(R.drawable.ic_qs_dnd_on); checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_ADJUST_VOLUME); switch (zen) { @@ -226,102 +222,6 @@ public class DndTile extends QSTileImpl<BooleanState> { state.expandedAccessibilityClassName = Switch.class.getName(); } - /** - * Returns the secondary label to use for the given instance of do not disturb. - * - If turned on manually and end time is known, returns end time. - * - If turned on by an automatic rule, returns the automatic rule name. - * - If on due to an app, returns the app name. - * - If there's a combination of rules/apps that trigger, then shows the one that will - * last the longest if applicable. - * @return null if do not disturb is off. - */ - private String getSecondaryLabel(boolean zenOn) { - if (!zenOn) { - return null; - } - - ZenModeConfig config = mController.getConfig(); - String secondaryText = ""; - long latestEndTime = -1; - - // DND turned on by manual rule - if (config.manualRule != null) { - final Uri id = config.manualRule.conditionId; - if (config.manualRule.enabler != null) { - // app triggered manual rule - String appName = ZenModeConfig.getOwnerCaption(mContext, config.manualRule.enabler); - if (!appName.isEmpty()) { - secondaryText = appName; - } - } else { - if (id == null) { - // Do not disturb manually triggered to remain on forever until turned off - // No subtext - return null; - } else { - latestEndTime = ZenModeConfig.tryParseCountdownConditionId(id); - if (latestEndTime > 0) { - final CharSequence formattedTime = ZenModeConfig.getFormattedTime(mContext, - latestEndTime, ZenModeConfig.isToday(latestEndTime), - mContext.getUserId()); - secondaryText = mContext.getString(R.string.qs_dnd_until, formattedTime); - } - } - } - } - - // DND turned on by an automatic rule - for (ZenModeConfig.ZenRule automaticRule : config.automaticRules.values()) { - if (automaticRule.isAutomaticActive()) { - if (ZenModeConfig.isValidEventConditionId(automaticRule.conditionId) || - ZenModeConfig.isValidScheduleConditionId(automaticRule.conditionId)) { - // set text if automatic rule end time is the latest active rule end time - long endTime = parseAutomaticRuleEndTime(automaticRule.conditionId); - if (endTime > latestEndTime) { - latestEndTime = endTime; - secondaryText = automaticRule.name; - } - } else { - // set text if 3rd party rule - return automaticRule.name; - } - } - } - - return !secondaryText.equals("") ? secondaryText : null; - } - - private long parseAutomaticRuleEndTime(Uri id) { - if (ZenModeConfig.isValidEventConditionId(id)) { - // cannot look up end times for events - return Long.MAX_VALUE; - } - - if (ZenModeConfig.isValidScheduleConditionId(id)) { - ScheduleCalendar schedule = ZenModeConfig.toScheduleCalendar(id); - long endTimeMs = schedule.getNextChangeTime(System.currentTimeMillis()); - - // check if automatic rule will end on next alarm - if (schedule.exitAtAlarm()) { - long nextAlarm = getNextAlarm(mContext); - schedule.maybeSetNextAlarm(System.currentTimeMillis(), nextAlarm); - if (schedule.shouldExitForAlarm(endTimeMs)) { - return nextAlarm; - } - } - - return endTimeMs; - } - - return -1; - } - - private long getNextAlarm(Context context) { - final AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - final AlarmClockInfo info = alarms.getNextAlarmClock(mContext.getUserId()); - return info != null ? info.getTriggerTime() : 0; - } - @Override public int getMetricsCategory() { return MetricsEvent.QS_DND; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index 8bdbf28b5cf1..d7f2a2642180 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -102,7 +102,7 @@ public class LocationTile extends QSTileImpl<BooleanState> { state.value = locationEnabled; checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_SHARE_LOCATION); if (state.disabledByPolicy == false) { - checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_CONFIG_LOCATION_MODE); + checkIfRestrictionEnforcedByAdminOnly(state, UserManager.DISALLOW_CONFIG_LOCATION); } state.icon = mIcon; state.slash.isSlashed = !state.value; diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 1da4deb61176..409c753c147c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -415,7 +415,7 @@ public class Recents extends SystemUI final int activityType = runningTask != null ? runningTask.configuration.windowConfiguration.getActivityType() : ACTIVITY_TYPE_UNDEFINED; - boolean screenPinningActive = sSystemServicesProxy.isScreenPinningActive(); + boolean screenPinningActive = ActivityManagerWrapper.getInstance().isLockToAppActive(); boolean isRunningTaskInHomeOrRecentsStack = activityType == ACTIVITY_TYPE_HOME || activityType == ACTIVITY_TYPE_RECENTS; if (runningTask != null && !isRunningTaskInHomeOrRecentsStack && !screenPinningActive) { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index ee1b09109d38..3f6f30bba8c4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -386,8 +386,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void toggleRecents(int growTarget) { // Skip preloading if the task is locked - SystemServicesProxy ssp = Recents.getSystemServices(); - if (ssp.isScreenPinningActive()) { + if (ActivityManagerWrapper.getInstance().isLockToAppActive()) { return; } @@ -409,8 +408,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener MutableBoolean isHomeStackVisible = new MutableBoolean(true); long elapsedTime = SystemClock.elapsedRealtime() - mLastToggleTime; + SystemServicesProxy ssp = Recents.getSystemServices(); if (ssp.isRecentsActivityVisible(isHomeStackVisible)) { - RecentsDebugFlags debugFlags = Recents.getDebugFlags(); RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); if (!launchState.launchedWithAltTab) { @@ -466,8 +465,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void preloadRecents() { // Skip preloading if the task is locked - SystemServicesProxy ssp = Recents.getSystemServices(); - if (ssp.isScreenPinningActive()) { + if (ActivityManagerWrapper.getInstance().isLockToAppActive()) { return; } @@ -481,6 +479,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener // RecentsActivity) only if there is a task to animate to. Post this to ensure that we // don't block the touch feedback on the nav bar button which triggers this. mHandler.post(() -> { + SystemServicesProxy ssp = Recents.getSystemServices(); if (!ssp.isRecentsActivityVisible(null)) { ActivityManager.RunningTaskInfo runningTask = ActivityManagerWrapper.getInstance().getRunningTask(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java index 316ad1661898..57f7818eae58 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -23,15 +23,12 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Configuration; import android.graphics.PixelFormat; -import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.os.Binder; import android.os.RemoteException; import android.util.DisplayMetrics; import android.view.Gravity; -import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -43,6 +40,9 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.systemui.R; +import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.statusbar.phone.NavigationBarView; +import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.util.leak.RotationUtils; import java.util.ArrayList; @@ -233,11 +233,30 @@ public class ScreenPinningRequest implements View.OnClickListener { .setVisibility(View.INVISIBLE); } + StatusBar statusBar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); + NavigationBarView navigationBarView = statusBar.getNavigationBarView(); + final boolean recentsVisible = navigationBarView != null + && navigationBarView.isRecentsButtonVisible(); boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled(); + int descriptionStringResId; + if (recentsVisible) { + mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(VISIBLE); + mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(INVISIBLE); + mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(INVISIBLE); + descriptionStringResId = touchExplorationEnabled + ? R.string.screen_pinning_description_accessible + : R.string.screen_pinning_description; + } else { + mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(INVISIBLE); + mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(VISIBLE); + mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(VISIBLE); + descriptionStringResId = touchExplorationEnabled + ? R.string.screen_pinning_description_recents_invisible_accessible + : R.string.screen_pinning_description_recents_invisible; + } + ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) - .setText(touchExplorationEnabled - ? R.string.screen_pinning_description_accessible - : R.string.screen_pinning_description); + .setText(descriptionStringResId); final int backBgVisibility = touchExplorationEnabled ? View.INVISIBLE : View.VISIBLE; mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility); mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility); diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 613d9fbb985c..93fd34aa0519 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -379,29 +379,6 @@ public class SystemServicesProxy { } /** - * Returns a global setting. - */ - public int getGlobalSetting(Context context, String setting) { - ContentResolver cr = context.getContentResolver(); - return Settings.Global.getInt(cr, setting, 0); - } - - /** - * Returns a system setting. - */ - public int getSystemSetting(Context context, String setting) { - ContentResolver cr = context.getContentResolver(); - return Settings.System.getInt(cr, setting, 0); - } - - /** - * Returns a system property. - */ - public String getSystemProperty(String key) { - return SystemProperties.get(key); - } - - /** * Returns the smallest width/height. */ public int getDeviceSmallestWidth() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 5be2900831b3..3cc3273c0db4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -95,6 +95,7 @@ import com.android.systemui.recents.views.grid.GridTaskView; import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; import com.android.systemui.recents.views.grid.TaskViewFocusFrame; +import com.android.systemui.shared.system.ActivityManagerWrapper; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -2187,8 +2188,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal private void readSystemFlags() { SystemServicesProxy ssp = Recents.getSystemServices(); mTouchExplorationEnabled = ssp.isTouchExplorationEnabled(); - mScreenPinningEnabled = ssp.getSystemSetting(getContext(), - Settings.System.LOCK_TO_APP_ENABLED) != 0; + mScreenPinningEnabled = ActivityManagerWrapper.getInstance().isLockToAppEnabled(); } private void updateStackActionButtonVisibility() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 79e9f7b45d8d..11bdf6b3c72e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -24,6 +24,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.RemoteException; import android.support.annotation.VisibleForTesting; import android.util.Pair; @@ -90,6 +91,8 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_FINGERPRINT_ERROR = 42 << MSG_SHIFT; private static final int MSG_FINGERPRINT_HIDE = 43 << MSG_SHIFT; private static final int MSG_SHOW_CHARGING_ANIMATION = 44 << MSG_SHIFT; + private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT = 45 << MSG_SHIFT; + private static final int MSG_SHOW_PINNING_TOAST_ESCAPE = 46 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -148,6 +151,8 @@ public class CommandQueue extends IStatusBar.Stub { default void clickTile(ComponentName tile) { } default void handleSystemKey(int arg1) { } + default void showPinningEnterExitToast(boolean entering) { } + default void showPinningEscapeToast() { } default void handleShowGlobalActionsMenu() { } default void handleShowShutdownUi(boolean isReboot, String reason) { } @@ -453,6 +458,21 @@ public class CommandQueue extends IStatusBar.Stub { } @Override + public void showPinningEnterExitToast(boolean entering) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_SHOW_PINNING_TOAST_ENTER_EXIT, entering).sendToTarget(); + } + } + + @Override + public void showPinningEscapeToast() { + synchronized (mLock) { + mHandler.obtainMessage(MSG_SHOW_PINNING_TOAST_ESCAPE).sendToTarget(); + } + } + + + @Override public void showGlobalActionsMenu() { synchronized (mLock) { mHandler.removeMessages(MSG_SHOW_GLOBAL_ACTIONS); @@ -767,6 +787,16 @@ public class CommandQueue extends IStatusBar.Stub { mCallbacks.get(i).showChargingAnimation(msg.arg1); } break; + case MSG_SHOW_PINNING_TOAST_ENTER_EXIT: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).showPinningEnterExitToast((Boolean) msg.obj); + } + break; + case MSG_SHOW_PINNING_TOAST_ESCAPE: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).showPinningEscapeToast(); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 0a12be4eac7f..b7a15005b170 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -44,6 +46,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; import com.android.systemui.Dependency; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.phone.KeyguardIndicationTextView; import com.android.systemui.statusbar.phone.LockIcon; @@ -192,7 +195,7 @@ public class KeyguardIndicationController { if (!mHandler.hasMessages(MSG_HIDE_TRANSIENT)) { hideTransientIndication(); } - updateIndication(); + updateIndication(false); } else if (!visible) { // If we unlock and return to keyguard quickly, previous error should not be shown hideTransientIndication(); @@ -204,7 +207,7 @@ public class KeyguardIndicationController { */ public void setRestingIndication(String restingIndication) { mRestingIndication = restingIndication; - updateIndication(); + updateIndication(false); } /** @@ -265,7 +268,8 @@ public class KeyguardIndicationController { mWakeLock.setAcquired(true); hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS); } - updateIndication(); + + updateIndication(false); } /** @@ -275,11 +279,11 @@ public class KeyguardIndicationController { if (mTransientIndication != null) { mTransientIndication = null; mHandler.removeMessages(MSG_HIDE_TRANSIENT); - updateIndication(); + updateIndication(false); } } - protected final void updateIndication() { + protected final void updateIndication(boolean animate) { if (TextUtils.isEmpty(mTransientIndication)) { mWakeLock.setAcquired(false); } @@ -295,7 +299,35 @@ public class KeyguardIndicationController { mTextView.switchIndication(mTransientIndication); } else if (mPowerPluggedIn) { String indication = computePowerIndication(); - mTextView.switchIndication(indication); + if (animate) { + int yTranslation = mContext.getResources().getInteger( + R.integer.wired_charging_aod_text_animation_distance); + int animateUpDuration = mContext.getResources().getInteger( + R.integer.wired_charging_aod_text_animation_duration_up); + int animateDownDuration = mContext.getResources().getInteger( + R.integer.wired_charging_aod_text_animation_duration_down); + mTextView.animate() + .translationYBy(yTranslation) + .setInterpolator(Interpolators.LINEAR) + .setDuration(animateUpDuration) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mTextView.switchIndication(indication); + } + @Override + public void onAnimationEnd(Animator animation) { + mTextView.animate() + .setDuration(animateDownDuration) + .setInterpolator(Interpolators.BOUNCE) + .translationYBy(-1 * yTranslation) + .setListener(null); + } + }); + } else { + mTextView.switchIndication(indication); + } + } else { String percentage = NumberFormat.getPercentInstance() .format(mBatteryLevel / 100f); @@ -390,7 +422,7 @@ public class KeyguardIndicationController { public void onReceive(Context context, Intent intent) { mHandler.post(() -> { if (mVisible) { - updateIndication(); + updateIndication(false); } }); } @@ -412,7 +444,7 @@ public class KeyguardIndicationController { return; } mDozing = dozing; - updateIndication(); + updateIndication(false); updateDisclosure(); } @@ -445,7 +477,7 @@ public class KeyguardIndicationController { mChargingWattage = status.maxChargingWattage; mChargingSpeed = status.getChargingSpeed(mSlowThreshold, mFastThreshold); mBatteryLevel = status.level; - updateIndication(); + updateIndication(!wasPluggedIn && mPowerPluggedIn); if (mDozing) { if (!wasPluggedIn && mPowerPluggedIn) { showTransientIndication(computePowerIndication()); @@ -551,7 +583,7 @@ public class KeyguardIndicationController { @Override public void onUserUnlocked() { if (mVisible) { - updateIndication(); + updateIndication(false); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java index bcdc269f712d..47fa1d2167f0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationLockscreenUserManager.java @@ -272,12 +272,20 @@ public class NotificationLockscreenUserManager implements Dumpable { * package-specific override. */ public boolean shouldHideNotifications(String key) { + if (mEntryManager == null) { + Log.wtf(TAG, "mEntryManager was null!", new Throwable()); + return true; + } return isLockscreenPublicMode(mCurrentUserId) && mEntryManager.getNotificationData().getVisibilityOverride(key) == Notification.VISIBILITY_SECRET; } public boolean shouldShowOnKeyguard(StatusBarNotification sbn) { + if (mEntryManager == null) { + Log.wtf(TAG, "mEntryManager was null!", new Throwable()); + return false; + } return mShowLockscreenNotifications && !mEntryManager.getNotificationData().isAmbient(sbn.getKey()); } @@ -397,6 +405,10 @@ public class NotificationLockscreenUserManager implements Dumpable { } private boolean packageHasVisibilityOverride(String key) { + if (mEntryManager == null) { + Log.wtf(TAG, "mEntryManager was null!", new Throwable()); + return true; + } return mEntryManager.getNotificationData().getVisibilityOverride(key) == Notification.VISIBILITY_PRIVATE; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index 65c45a3120c1..1239a9ea0240 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -22,11 +22,13 @@ import static android.app.StatusBarManager.windowStateToString; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_WINDOW_STATE; import static com.android.systemui.statusbar.phone.StatusBar.dumpBarTransitions; +import static com.android.systemui.OverviewProxyService.OverviewProxyListener; import android.accessibilityservice.AccessibilityServiceInfo; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; +import android.annotation.IdRes; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -69,6 +71,7 @@ import android.view.WindowManagerGlobal; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener; +import android.widget.Button; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -153,6 +156,18 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private Animator mRotateShowAnimator; private Animator mRotateHideAnimator; + private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() { + @Override + public void onConnectionChanged(boolean isConnected) { + mNavigationBarView.onOverviewProxyConnectionChanged(isConnected); + updateScreenPinningGestures(); + } + + @Override + public void onRecentsAnimationStarted() { + mNavigationBarView.setRecentsAnimationStarted(true); + } + }; // ----- Fragment Lifecycle Callbacks ----- @@ -239,12 +254,14 @@ public class NavigationBarFragment extends Fragment implements Callbacks { filter.addAction(Intent.ACTION_SCREEN_ON); getContext().registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); notifyNavigationBarScreenOn(); + mOverviewProxyService.addCallback(mOverviewProxyListener); } @Override public void onDestroyView() { super.onDestroyView(); mNavigationBarView.getLightTransitionsController().destroy(getContext()); + mOverviewProxyService.removeCallback(mOverviewProxyListener); getContext().unregisterReceiver(mBroadcastReceiver); } @@ -514,6 +531,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { if (masked != mDisabledFlags1) { mDisabledFlags1 = masked; if (mNavigationBarView != null) mNavigationBarView.setDisabledFlags(state1); + updateScreenPinningGestures(); } } @@ -528,7 +546,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private boolean shouldDisableNavbarGestures() { return !mStatusBar.isDeviceProvisioned() || (mDisabledFlags1 & StatusBarManager.DISABLE_SEARCH) != 0 - || mOverviewProxyService.getProxy() != null; + || mNavigationBarView.getRecentsButton().getVisibility() != View.VISIBLE; } private void repositionNavigationBar() { @@ -540,6 +558,24 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ((View) mNavigationBarView.getParent()).getLayoutParams()); } + private void updateScreenPinningGestures() { + if (mNavigationBarView == null) { + return; + } + + // Change the cancel pin gesture to home and back if recents button is invisible + boolean recentsVisible = mNavigationBarView.isRecentsButtonVisible(); + ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); + ButtonDispatcher backButton = mNavigationBarView.getBackButton(); + if (recentsVisible) { + homeButton.setOnLongClickListener(this::onHomeLongClick); + backButton.setOnLongClickListener(this::onLongPressBackRecents); + } else { + homeButton.setOnLongClickListener(this::onLongPressBackHome); + backButton.setOnLongClickListener(this::onLongPressBackHome); + } + } + private void notifyNavigationBarScreenOn() { mNavigationBarView.notifyScreenOn(); } @@ -555,11 +591,9 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ButtonDispatcher backButton = mNavigationBarView.getBackButton(); backButton.setLongClickable(true); - backButton.setOnLongClickListener(this::onLongPressBackRecents); ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); homeButton.setOnTouchListener(this::onHomeTouch); - homeButton.setOnLongClickListener(this::onHomeLongClick); ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton(); accessibilityButton.setOnClickListener(this::onAccessibilityClick); @@ -569,6 +603,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ButtonDispatcher rotateSuggestionButton = mNavigationBarView.getRotateSuggestionButton(); rotateSuggestionButton.setOnClickListener(this::onRotateSuggestionClick); rotateSuggestionButton.setOnHoverListener(this::onRotateSuggestionHover); + updateScreenPinningGestures(); } private boolean onHomeTouch(View v, MotionEvent event) { @@ -649,20 +684,29 @@ public class NavigationBarFragment extends Fragment implements Callbacks { mCommandQueue.toggleRecentApps(); } + private boolean onLongPressBackHome(View v) { + return onLongPressNavigationButtons(v, R.id.back, R.id.home); + } + + private boolean onLongPressBackRecents(View v) { + return onLongPressNavigationButtons(v, R.id.back, R.id.recent_apps); + } + /** - * This handles long-press of both back and recents. They are - * handled together to capture them both being long-pressed + * This handles long-press of both back and recents/home. Back is the common button with + * combination of recents if it is visible or home if recents is invisible. + * They are handled together to capture them both being long-pressed * at the same time to exit screen pinning (lock task). * - * When accessibility mode is on, only a long-press from recents + * When accessibility mode is on, only a long-press from recents/home * is required to exit. * * In all other circumstances we try to pass through long-press events * for Back, so that apps can still use it. Which can be from two things. * 1) Not currently in screen pinning (lock task). - * 2) Back is long-pressed without recents. + * 2) Back is long-pressed without recents/home. */ - private boolean onLongPressBackRecents(View v) { + private boolean onLongPressNavigationButtons(View v, @IdRes int btnId1, @IdRes int btnId2) { try { boolean sendBackLongPress = false; IActivityManager activityManager = ActivityManagerNative.getDefault(); @@ -670,6 +714,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { boolean inLockTaskMode = activityManager.isInLockTaskMode(); if (inLockTaskMode && !touchExplorationEnabled) { long time = System.currentTimeMillis(); + // If we recently long-pressed the other button then they were // long-pressed 'together' if ((time - mLastLockToAppLongPress) < LOCK_TO_APP_GESTURE_TOLERENCE) { @@ -677,26 +722,32 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // When exiting refresh disabled flags. mNavigationBarView.setDisabledFlags(mDisabledFlags1, true); return true; - } else if ((v.getId() == R.id.back) - && !mNavigationBarView.getRecentsButton().getCurrentView().isPressed()) { - // If we aren't pressing recents right now then they presses - // won't be together, so send the standard long-press action. - sendBackLongPress = true; + } else if (v.getId() == btnId1) { + ButtonDispatcher button = btnId2 == R.id.recent_apps + ? mNavigationBarView.getRecentsButton() + : mNavigationBarView.getHomeButton(); + if (!button.getCurrentView().isPressed()) { + // If we aren't pressing recents/home right now then they presses + // won't be together, so send the standard long-press action. + sendBackLongPress = true; + } } mLastLockToAppLongPress = time; } else { // If this is back still need to handle sending the long-press event. - if (v.getId() == R.id.back) { + if (v.getId() == btnId1) { sendBackLongPress = true; } else if (touchExplorationEnabled && inLockTaskMode) { - // When in accessibility mode a long press that is recents (not back) + // When in accessibility mode a long press that is recents/home (not back) // should stop lock task. activityManager.stopSystemLockTaskMode(); // When exiting refresh disabled flags. mNavigationBarView.setDisabledFlags(mDisabledFlags1, true); return true; - } else if (v.getId() == R.id.recent_apps) { - return onLongPressRecents(); + } else if (v.getId() == btnId2) { + return btnId2 == R.id.recent_apps + ? onLongPressRecents() + : onHomeLongClick(mNavigationBarView.getHomeButton().getCurrentView()); } } if (sendBackLongPress) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index e04ba8341949..c37dd55cc6ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -207,23 +207,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } } - private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() { - @Override - public void onConnectionChanged(boolean isConnected) { - updateSlippery(); - setDisabledFlags(mDisabledFlags, true); - setUpSwipeUpOnboarding(isConnected); - } - - @Override - public void onRecentsAnimationStarted() { - mRecentsAnimationStarted = true; - if (mSwipeUpOnboarding != null) { - mSwipeUpOnboarding.onRecentsAnimationStarted(); - } - } - }; - public NavigationBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -280,6 +263,19 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav notifyVerticalChangedListener(mVertical); } + public void setRecentsAnimationStarted(boolean started) { + mRecentsAnimationStarted = started; + if (mSwipeUpOnboarding != null) { + mSwipeUpOnboarding.onRecentsAnimationStarted(); + } + } + + public void onConnectionChanged(boolean isConnected) { + updateSlippery(); + setDisabledFlags(mDisabledFlags, true); + setUpSwipeUpOnboarding(isConnected); + } + @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureHelper.onTouchEvent(event)) { @@ -353,6 +349,10 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav return mButtonDispatchers; } + public boolean isRecentsButtonVisible() { + return getRecentsButton().getVisibility() == View.VISIBLE; + } + private void updateCarModeIcons(Context ctx) { mBackCarModeIcon = getDrawable(ctx, R.drawable.ic_sysbar_back_carmode, R.drawable.ic_sysbar_back_carmode); @@ -613,6 +613,9 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav final ViewGroup navbarView = ((ViewGroup) getParent()); final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) navbarView .getLayoutParams(); + if (lp == null) { + return; + } if (slippery && (lp.flags & WindowManager.LayoutParams.FLAG_SLIPPERY) == 0) { lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY; changed = true; @@ -676,6 +679,12 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } } + public void onOverviewProxyConnectionChanged(boolean isConnected) { + setSlippery(!isConnected); + setDisabledFlags(mDisabledFlags, true); + setUpSwipeUpOnboarding(isConnected); + } + @Override protected void onDraw(Canvas canvas) { mGestureHelper.onDraw(canvas); @@ -873,7 +882,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav onPluginDisconnected(null); // Create default gesture helper Dependency.get(PluginManager.class).addPluginListener(this, NavGesture.class, false /* Only one */); - mOverviewProxyService.addCallback(mOverviewProxyListener); setUpSwipeUpOnboarding(mOverviewProxyService.getProxy() != null); } @@ -884,7 +892,6 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav if (mGestureHelper != null) { mGestureHelper.destroy(); } - mOverviewProxyService.removeCallback(mOverviewProxyListener); setUpSwipeUpOnboarding(false); } diff --git a/services/core/java/com/android/server/am/LockTaskNotify.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenPinningNotify.java index 1dcb0addc18b..0d07ad9cdf2e 100644 --- a/services/core/java/com/android/server/am/LockTaskNotify.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScreenPinningNotify.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * Copyright (C) 2018 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.am; +package com.android.systemui.statusbar.phone; import android.content.Context; import android.os.SystemClock; @@ -22,36 +22,37 @@ import android.util.Slog; import android.view.WindowManager; import android.widget.Toast; -import com.android.internal.R; +import com.android.systemui.R; +import com.android.systemui.SysUIToast; /** * Helper to manage showing/hiding a image to notify them that they are entering or exiting screen * pinning mode. All exposed methods should be called from a handler thread. */ -public class LockTaskNotify { - private static final String TAG = "LockTaskNotify"; +public class ScreenPinningNotify { + private static final String TAG = "ScreenPinningNotify"; private static final long SHOW_TOAST_MINIMUM_INTERVAL = 1000; private final Context mContext; private Toast mLastToast; private long mLastShowToastTime; - public LockTaskNotify(Context context) { + public ScreenPinningNotify(Context context) { mContext = context; } /** Show "Screen pinned" toast. */ void showPinningStartToast() { - makeAllUserToastAndShow(R.string.lock_to_app_start); + makeAllUserToastAndShow(R.string.screen_pinning_start); } /** Show "Screen unpinned" toast. */ void showPinningExitToast() { - makeAllUserToastAndShow(R.string.lock_to_app_exit); + makeAllUserToastAndShow(R.string.screen_pinning_exit); } /** Show a toast that describes the gesture the user should use to escape pinned mode. */ - void showEscapeToast() { + void showEscapeToast(boolean isRecentsButtonVisible) { long showToastTime = SystemClock.elapsedRealtime(); if ((showToastTime - mLastShowToastTime) < SHOW_TOAST_MINIMUM_INTERVAL) { Slog.i(TAG, "Ignore toast since it is requested in very short interval."); @@ -60,14 +61,14 @@ public class LockTaskNotify { if (mLastToast != null) { mLastToast.cancel(); } - mLastToast = makeAllUserToastAndShow(R.string.lock_to_app_toast); + mLastToast = makeAllUserToastAndShow(isRecentsButtonVisible + ? R.string.screen_pinning_toast + : R.string.screen_pinning_toast_recents_invisible); mLastShowToastTime = showToastTime; } private Toast makeAllUserToastAndShow(int resId) { - Toast toast = Toast.makeText(mContext, resId, Toast.LENGTH_LONG); - toast.getWindowParams().privateFlags |= - WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; + Toast toast = SysUIToast.makeText(mContext, resId, Toast.LENGTH_LONG); toast.show(); return toast; } 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 3b394ddd63cf..44e0c257ef24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -230,6 +230,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, final ScrimState oldState = mState; mState = state; + Trace.traceCounter(Trace.TRACE_TAG_APP, "scrim_state", mState.getIndex()); if (mCallback != null) { mCallback.onCancelled(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index fa2c1b3fa01c..314d6aa2bf57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -31,12 +31,12 @@ public enum ScrimState { /** * Initial state. */ - UNINITIALIZED, + UNINITIALIZED(-1), /** * On the lock screen. */ - KEYGUARD { + KEYGUARD(0) { @Override public void prepare(ScrimState previousState) { @@ -61,7 +61,7 @@ public enum ScrimState { /** * Showing password challenge. */ - BOUNCER { + BOUNCER(1) { @Override public void prepare(ScrimState previousState) { mCurrentBehindAlpha = ScrimController.SCRIM_BEHIND_ALPHA_UNLOCKING; @@ -72,7 +72,7 @@ public enum ScrimState { /** * Changing screen brightness from quick settings. */ - BRIGHTNESS_MIRROR { + BRIGHTNESS_MIRROR(2) { @Override public void prepare(ScrimState previousState) { mCurrentBehindAlpha = 0; @@ -83,7 +83,7 @@ public enum ScrimState { /** * Always on display or screen off. */ - AOD { + AOD(3) { @Override public void prepare(ScrimState previousState) { if (previousState == ScrimState.PULSING && !mCanControlScreenOff) { @@ -106,7 +106,7 @@ public enum ScrimState { /** * When phone wakes up because you received a notification. */ - PULSING { + PULSING(4) { @Override public void prepare(ScrimState previousState) { mCurrentInFrontAlpha = 0; @@ -124,7 +124,7 @@ public enum ScrimState { /** * Unlocked on top of an app (launcher or any other activity.) */ - UNLOCKED { + UNLOCKED(5) { @Override public void prepare(ScrimState previousState) { mCurrentBehindAlpha = 0; @@ -164,6 +164,11 @@ public enum ScrimState { boolean mCanControlScreenOff; boolean mWallpaperSupportsAmbientMode; KeyguardUpdateMonitor mKeyguardUpdateMonitor; + int mIndex; + + ScrimState(int index) { + mIndex = index; + } public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters) { mScrimInFront = scrimInFront; @@ -177,6 +182,10 @@ public enum ScrimState { public void prepare(ScrimState previousState) { } + public int getIndex() { + return mIndex; + } + public float getFrontAlpha() { return mCurrentInFrontAlpha; } 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 426268ba490c..1bf719ae68af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -404,6 +404,13 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationEntryManager mEntryManager; protected NotificationViewHierarchyManager mViewHierarchyManager; + /** + * Helper that is responsible for showing the right toast when a disallowed activity operation + * occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in + * fully locked mode we only show that unlocking is blocked. + */ + private ScreenPinningNotify mScreenPinningNotify; + // for disabling the status bar private int mDisabled1 = 0; private int mDisabled2 = 0; @@ -830,7 +837,7 @@ public class StatusBar extends SystemUI implements DemoMode, } catch (RemoteException ex) { // no window manager? good luck with that } - + mScreenPinningNotify = new ScreenPinningNotify(mContext); mStackScroller.setLongPressListener(mEntryManager.getNotificationLongClicker()); mStackScroller.setStatusBar(this); mStackScroller.setGroupManager(mGroupManager); @@ -2141,6 +2148,21 @@ public class StatusBar extends SystemUI implements DemoMode, } + @Override + public void showPinningEnterExitToast(boolean entering) { + if (entering) { + mScreenPinningNotify.showPinningStartToast(); + } else { + mScreenPinningNotify.showPinningExitToast(); + } + } + + @Override + public void showPinningEscapeToast() { + mScreenPinningNotify.showEscapeToast(getNavigationBarView() == null + || getNavigationBarView().isRecentsButtonVisible()); + } + boolean panelsEnabled() { return (mDisabled1 & StatusBarManager.DISABLE_EXPAND) == 0 && (mDisabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) == 0 diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 9aee00ec145e..3c29b7740102 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -362,12 +362,15 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa private boolean shouldShowUI(int flags) { updateStatusBar(); - return mStatusBar != null - && mStatusBar.getWakefulnessState() != WakefulnessLifecycle.WAKEFULNESS_ASLEEP - && mStatusBar.getWakefulnessState() != WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP + // if status bar isn't null, check if phone is in AOD, else check flags + // since we could be using a different status bar + return mStatusBar != null ? + mStatusBar.getWakefulnessState() != WakefulnessLifecycle.WAKEFULNESS_ASLEEP + && mStatusBar.getWakefulnessState() != + WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP && mStatusBar.isDeviceInteractive() - && (flags & AudioManager.FLAG_SHOW_UI) != 0 - && mShowVolumeDialog; + && (flags & AudioManager.FLAG_SHOW_UI) != 0 && mShowVolumeDialog + : mShowVolumeDialog && (flags & AudioManager.FLAG_SHOW_UI) != 0; } boolean onVolumeChangedW(int stream, int flags) { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 0c6e0f694b49..a131a618512f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -18,6 +18,7 @@ package com.android.systemui.volume; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC; +import static android.media.AudioManager.STREAM_ACCESSIBILITY; import static com.android.systemui.volume.Events.DISMISS_REASON_OUTPUT_CHOOSER; import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED; @@ -47,6 +48,7 @@ import android.os.SystemClock; import android.provider.Settings; import android.provider.Settings.Global; import android.support.v7.media.MediaRouter; +import android.text.InputFilter; import android.text.TextUtils; import android.util.Log; import android.util.Slog; @@ -219,7 +221,7 @@ public class VolumeDialogImpl implements VolumeDialog { R.drawable.ic_volume_bt_sco, R.drawable.ic_volume_bt_sco, false, false); addRow(AudioManager.STREAM_SYSTEM, R.drawable.ic_volume_system, R.drawable.ic_volume_system_mute, false, false); - addRow(AudioManager.STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility, + addRow(STREAM_ACCESSIBILITY, R.drawable.ic_volume_accessibility, R.drawable.ic_volume_accessibility, true, false); } } else { @@ -334,6 +336,9 @@ public class VolumeDialogImpl implements VolumeDialog { row.view.setTag(row); row.header = row.view.findViewById(R.id.volume_row_header); row.header.setId(20 * row.stream); + if (stream == STREAM_ACCESSIBILITY) { + row.header.setFilters(new InputFilter[] {new InputFilter.LengthFilter(13)}); + } row.slider = row.view.findViewById(R.id.volume_row_slider); row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); row.anim = null; @@ -643,7 +648,7 @@ public class VolumeDialogImpl implements VolumeDialog { if (ss.level == row.requestedLevel) { row.requestedLevel = -1; } - final boolean isA11yStream = row.stream == AudioManager.STREAM_ACCESSIBILITY; + final boolean isA11yStream = row.stream == STREAM_ACCESSIBILITY; final boolean isRingStream = row.stream == AudioManager.STREAM_RING; final boolean isSystemStream = row.stream == AudioManager.STREAM_SYSTEM; final boolean isAlarmStream = row.stream == AudioManager.STREAM_ALARM; @@ -949,7 +954,7 @@ public class VolumeDialogImpl implements VolumeDialog { public void onAccessibilityModeChanged(Boolean showA11yStream) { mShowA11yStream = showA11yStream == null ? false : showA11yStream; VolumeRow activeRow = getActiveRow(); - if (!mShowA11yStream && AudioManager.STREAM_ACCESSIBILITY == activeRow.stream) { + if (!mShowA11yStream && STREAM_ACCESSIBILITY == activeRow.stream) { dismissH(Events.DISMISS_STREAM_GONE); } else { updateRowsH(activeRow); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUiLayout.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUiLayout.java index f50a28766d70..3d4438148c39 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUiLayout.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUiLayout.java @@ -14,26 +14,22 @@ package com.android.systemui.volume; -import static com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE; import static com.android.systemui.util.leak.RotationUtils.ROTATION_NONE; -import static com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; +import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Slog; -import android.view.Gravity; +import android.view.DisplayCutout; import android.view.View; -import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.SeekBar; import com.android.systemui.R; import com.android.systemui.util.leak.RotationUtils; @@ -46,6 +42,9 @@ public class VolumeUiLayout extends FrameLayout { private AnimatorSet mAnimation; private boolean mHasOutsideTouch; private int mRotation = ROTATION_NONE; + @Nullable + private DisplayCutout mDisplayCutout; + public VolumeUiLayout(Context context, AttributeSet attrs) { super(context, attrs); } @@ -60,6 +59,7 @@ public class VolumeUiLayout extends FrameLayout { protected void onDetachedFromWindow() { super.onDetachedFromWindow(); getViewTreeObserver().removeOnComputeInternalInsetsListener(mInsetsListener); + mDisplayCutout = null; } @Override @@ -86,200 +86,64 @@ public class VolumeUiLayout extends FrameLayout { updateRotation(); } - private void updateRotation() { - int rotation = RotationUtils.getRotation(getContext()); - if (rotation != mRotation) { - rotate(mRotation, rotation); - mRotation = rotation; - } - } - - private void rotate(View view, int from, int to, boolean swapDimens) { - if (from != ROTATION_NONE && to != ROTATION_NONE) { - // Rather than handling this confusing case, just do 2 rotations. - rotate(view, from, ROTATION_NONE, swapDimens); - rotate(view, ROTATION_NONE, to, swapDimens); - return; - } - if (from == ROTATION_LANDSCAPE || to == ROTATION_SEASCAPE) { - rotateRight(view); - } else { - rotateLeft(view); - } - if (to != ROTATION_NONE) { - if (swapDimens && view instanceof LinearLayout) { - LinearLayout linearLayout = (LinearLayout) view; - linearLayout.setOrientation(LinearLayout.HORIZONTAL); - swapDimens(view); - } - } else { - if (swapDimens && view instanceof LinearLayout) { - LinearLayout linearLayout = (LinearLayout) view; - linearLayout.setOrientation(LinearLayout.VERTICAL); - swapDimens(view); + private void setDisplayCutout() { + if (mDisplayCutout == null && getRootWindowInsets() != null) { + DisplayCutout cutout = getRootWindowInsets().getDisplayCutout(); + if (cutout != null) { + mDisplayCutout = cutout; } } } - private void rotate(int from, int to) { - View footer = mChild.findViewById(R.id.footer); - rotate(footer, from, to, false); - rotate(this, from, to, true); - rotate(mChild, from, to, true); - ViewGroup rows = mChild.findViewById(R.id.volume_dialog_rows); - rotate(rows, from, to, true); - swapOrientation((LinearLayout) rows); - int rowCount = rows.getChildCount(); - for (int i = 0; i < rowCount; i++) { - View row = rows.getChildAt(i); - if (to == ROTATION_SEASCAPE) { - rotateSeekBars(row, to, 180); - } else if (to == ROTATION_LANDSCAPE) { - rotateSeekBars(row, to, 0); - } else { - rotateSeekBars(row, to, 270); - } - rotate(row, from, to, true); + private void updateRotation() { + setDisplayCutout(); + int rotation = RotationUtils.getRotation(getContext()); + if (rotation != mRotation) { + updateSafeInsets(rotation); + mRotation = rotation; } } - private void swapOrientation(LinearLayout layout) { - if(layout.getOrientation() == LinearLayout.HORIZONTAL) { - layout.setOrientation(LinearLayout.VERTICAL); - } else { - layout.setOrientation(LinearLayout.HORIZONTAL); - } - } + private void updateSafeInsets(int rotation) { + // Depending on our rotation, we may have to work around letterboxing from the right + // side from the navigation bar or a cutout. - private void swapDimens(View v) { - if (v == null) { - return; - } - ViewGroup.LayoutParams params = v.getLayoutParams(); - int h = params.width; - params.width = params.height; - params.height = h; - v.setLayoutParams(params); - } - - private void rotateSeekBars(View row, int to, int rotation) { - SeekBar seekbar = row.findViewById(R.id.volume_row_slider); - if (seekbar != null) { - seekbar.setRotation((float) rotation); - } + MarginLayoutParams lp = (MarginLayoutParams) mChild.getLayoutParams(); - View parent = row.findViewById(R.id.volume_row_slider_frame); - swapDimens(parent); - ViewGroup.LayoutParams params = seekbar.getLayoutParams(); - ViewGroup.LayoutParams parentParams = parent.getLayoutParams(); - if (to != ROTATION_NONE) { - params.height = parentParams.height; - params.width = parentParams.width; - } else { - params.height = parentParams.width; - params.width = parentParams.height; - } - seekbar.setLayoutParams(params); - } - - private int rotateGravityRight(int gravity) { - int retGravity = 0; - int layoutDirection = getLayoutDirection(); - final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); - final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; - - switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { - case Gravity.CENTER_HORIZONTAL: - retGravity |= Gravity.CENTER_VERTICAL; + int margin = (int) getResources().getDimension(R.dimen.volume_dialog_base_margin); + switch (rotation) { + /* + * Landscape: <-|. Have to deal with the nav bar + * Seascape: |->. Have to deal with the cutout + */ + case RotationUtils.ROTATION_LANDSCAPE: + margin += getNavBarHeight(); break; - case Gravity.RIGHT: - retGravity |= Gravity.BOTTOM; + case RotationUtils.ROTATION_SEASCAPE: + margin += getDisplayCutoutHeight(); break; - case Gravity.LEFT: default: - retGravity |= Gravity.TOP; break; } - switch (verticalGravity) { - case Gravity.CENTER_VERTICAL: - retGravity |= Gravity.CENTER_HORIZONTAL; - break; - case Gravity.BOTTOM: - retGravity |= Gravity.LEFT; - break; - case Gravity.TOP: - default: - retGravity |= Gravity.RIGHT; - break; - } - return retGravity; + lp.rightMargin = margin; + mChild.setLayoutParams(lp); } - private int rotateGravityLeft(int gravity) { - if (gravity == -1) { - gravity = Gravity.TOP | Gravity.START; - } - int retGravity = 0; - int layoutDirection = getLayoutDirection(); - final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); - final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; - - switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { - case Gravity.CENTER_HORIZONTAL: - retGravity |= Gravity.CENTER_VERTICAL; - break; - case Gravity.RIGHT: - retGravity |= Gravity.TOP; - break; - case Gravity.LEFT: - default: - retGravity |= Gravity.BOTTOM; - break; - } - - switch (verticalGravity) { - case Gravity.CENTER_VERTICAL: - retGravity |= Gravity.CENTER_HORIZONTAL; - break; - case Gravity.BOTTOM: - retGravity |= Gravity.RIGHT; - break; - case Gravity.TOP: - default: - retGravity |= Gravity.LEFT; - break; - } - return retGravity; + private int getNavBarHeight() { + return (int) getResources().getDimension(R.dimen.navigation_bar_size); } - private void rotateLeft(View v) { - if (v.getParent() instanceof FrameLayout) { - LayoutParams p = (LayoutParams) v.getLayoutParams(); - p.gravity = rotateGravityLeft(p.gravity); + //TODO: Find a better way + private int getDisplayCutoutHeight() { + if (mDisplayCutout == null || mDisplayCutout.isEmpty()) { + return 0; } - v.setPadding(v.getPaddingTop(), v.getPaddingRight(), v.getPaddingBottom(), - v.getPaddingLeft()); - MarginLayoutParams params = (MarginLayoutParams) v.getLayoutParams(); - params.setMargins(params.topMargin, params.rightMargin, params.bottomMargin, - params.leftMargin); - v.setLayoutParams(params); + Rect r = mDisplayCutout.getBoundingRect(); + return r.bottom - r.top; } - private void rotateRight(View v) { - if (v.getParent() instanceof FrameLayout) { - LayoutParams p = (LayoutParams) v.getLayoutParams(); - p.gravity = rotateGravityRight(p.gravity); - } - - v.setPadding(v.getPaddingBottom(), v.getPaddingLeft(), v.getPaddingTop(), - v.getPaddingRight()); - MarginLayoutParams params = (MarginLayoutParams) v.getLayoutParams(); - params.setMargins(params.bottomMargin, params.leftMargin, params.topMargin, - params.rightMargin); - v.setLayoutParams(params); - } private void animateChild(int oldHeight, int newHeight) { if (true) return; @@ -309,12 +173,6 @@ public class VolumeUiLayout extends FrameLayout { return super.getOutlineProvider(); } - @Override - public void setPressed(boolean pressed) - { - // Ignore presses because it activates the seekbar thumb unnecessarily. - } - public void setOutsideTouchListener(OnClickListener onClickListener) { mHasOutsideTouch = true; requestLayout(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java index 5f763a45f3eb..1204dda07a55 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NonPhoneDependencyTest.java @@ -86,13 +86,13 @@ public class NonPhoneDependencyTest extends SysuiTestCase { mHeadsUpManager); gutsManager.setUpWithPresenter(mPresenter, entryManager, mListContainer, mCheckSaveListener, mOnClickListener); - notificationListener.setUpWithPresenter(mPresenter, entryManager); notificationLogger.setUpWithEntryManager(entryManager, mListContainer); mediaManager.setUpWithPresenter(mPresenter, entryManager); remoteInputManager.setUpWithPresenter(mPresenter, entryManager, mRemoteInputManagerCallback, mDelegate); lockscreenUserManager.setUpWithPresenter(mPresenter, entryManager); viewHierarchyManager.setUpWithPresenter(mPresenter, entryManager, mListContainer); + notificationListener.setUpWithPresenter(mPresenter, entryManager); assertFalse(mDependency.hasInstantiatedDependency(StatusBarWindowManager.class)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java index 401fd6857e76..a4ed45997d2a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java @@ -76,6 +76,16 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { } @Test + public void testVolumeChangeW_nullStatusBar() { + VolumeDialogControllerImpl.C callback = mock(VolumeDialogControllerImpl.C.class); + TestableVolumeDialogControllerImpl nullStatusBarTestableDialog = new + TestableVolumeDialogControllerImpl(mContext, callback, null); + nullStatusBarTestableDialog.setEnableDialogs(true, true); + nullStatusBarTestableDialog.onVolumeChangedW(0, AudioManager.FLAG_SHOW_UI); + verify(callback, times(1)).onShowRequested(Events.SHOW_REASON_VOLUME_CHANGED); + } + + @Test public void testOnRemoteVolumeChanged_newStream_noNullPointer() { MediaSession.Token token = new MediaSession.Token(null); mVolumeController.mMediaSessionsCallbacksW.onRemoteVolumeChanged(token, 0); diff --git a/services/autofill/java/com/android/server/autofill/AutofillCompatAccessibilityService.java b/services/autofill/java/com/android/server/autofill/AutofillCompatAccessibilityService.java new file mode 100644 index 000000000000..075fd6b9b86b --- /dev/null +++ b/services/autofill/java/com/android/server/autofill/AutofillCompatAccessibilityService.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 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; + +import android.accessibilityservice.AccessibilityService; +import android.view.accessibility.AccessibilityEvent; + +/** + * Pseudo accessibility service reported to apps in autofill compatibility mode. + */ +public final class AutofillCompatAccessibilityService extends AccessibilityService { + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { + /* do nothing */ + } + + @Override + public void onInterrupt() { + /* do nothing */ + } +} diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index 2b73b33fffd3..72c3c94baa70 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -24,8 +24,10 @@ import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sPartitionMaxCount; import static com.android.server.autofill.Helper.sVerbose; +import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityThread; import android.content.BroadcastReceiver; @@ -508,6 +510,18 @@ public final class AutofillManagerService extends SystemService { if (sDebug) Slog.d(TAG, "onBackKeyPressed()"); mUi.hideAll(null); } + + @Override + public boolean isCompatibilityModeRequested(@NonNull String packageName, + long versionCode, @UserIdInt int userId) { + synchronized (mLock) { + final AutofillManagerServiceImpl service = getServiceForUserLocked(userId); + if (service != null) { + return service.isCompatibilityModeRequestedLocked(packageName, versionCode); + } + } + return false; + } } final class AutoFillManagerServiceStub extends IAutoFillManager.Stub { diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index eb031f325a7b..297dcf16c17f 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -40,6 +40,7 @@ import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.os.AsyncTask; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.Looper; @@ -82,6 +83,7 @@ import com.android.server.autofill.ui.AutoFillUI; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Random; /** @@ -273,8 +275,7 @@ final class AutofillManagerServiceImpl { } try { if (serviceInfo != null) { - mInfo = new AutofillServiceInfo(mContext.getPackageManager(), - serviceComponent, mUserId); + mInfo = new AutofillServiceInfo(mContext, serviceComponent, mUserId); if (sDebug) Slog.d(TAG, "Set component for user " + mUserId + " as " + mInfo); } else { mInfo = null; @@ -988,6 +989,21 @@ final class AutofillManagerServiceImpl { } } + boolean isCompatibilityModeRequestedLocked(@NonNull String packageName, + long versionCode) { + if (mInfo == null || !mInfo.isCompatibilityModeRequested(packageName, versionCode)) { + return false; + } + if (!Build.IS_ENG) { + // TODO: Build a map and watch for settings changes (this is called on app start) + final String whiteListedPackages = Settings.Global.getString( + mContext.getContentResolver(), + Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES); + return whiteListedPackages != null && whiteListedPackages.contains(packageName); + } + return true; + } + private void sendStateToClients(boolean resetClient) { final RemoteCallbackList<IAutoFillManagerClient> clients; final int userClientCount; 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 5f112c7fc773..8240e4b758da 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -513,6 +513,12 @@ final class FillUi { public void show(WindowManager.LayoutParams params) { if (sVerbose) Slog.v(TAG, "show(): showing=" + mShowing + ", params="+ params); try { + // Okay here is a bit of voodoo - we want to show the window as system + // controlled one so it covers app windows - adjust the params accordingly. + params.type = WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; + params.token = null; + params.packageName = "android"; + params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; if (!mShowing) { params.accessibilityTitle = mContentView.getContext() .getString(R.string.autofill_picker_accessibility_title); @@ -565,7 +571,6 @@ final class FillUi { } return false; } - } public void dump(PrintWriter pw, String prefix) { diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 30dfee86403f..f49cd6745e79 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -1840,14 +1840,6 @@ class AlarmManagerService extends SystemService { if (!blocked) { pw.println(" none"); } - pw.print(" mUseAllowWhileIdleShortTime: ["); - for (int i = 0; i < mUseAllowWhileIdleShortTime.size(); i++) { - if (mUseAllowWhileIdleShortTime.valueAt(i)) { - UserHandle.formatUid(pw, mUseAllowWhileIdleShortTime.keyAt(i)); - pw.print(" "); - } - } - pw.println("]"); pw.println(" mLastAlarmDeliveredForPackage:"); for (int i = 0; i < mLastAlarmDeliveredForPackage.size(); i++) { @@ -1913,14 +1905,32 @@ class AlarmManagerService extends SystemService { if (mLastAllowWhileIdleDispatch.size() > 0) { pw.println(" Last allow while idle dispatch times:"); for (int i=0; i<mLastAllowWhileIdleDispatch.size(); i++) { - pw.print(" UID "); - UserHandle.formatUid(pw, mLastAllowWhileIdleDispatch.keyAt(i)); + pw.print(" UID "); + final int uid = mLastAllowWhileIdleDispatch.keyAt(i); + UserHandle.formatUid(pw, uid); pw.print(": "); - TimeUtils.formatDuration(mLastAllowWhileIdleDispatch.valueAt(i), - nowELAPSED, pw); + final long lastTime = mLastAllowWhileIdleDispatch.valueAt(i); + TimeUtils.formatDuration(lastTime, nowELAPSED, pw); + + final long minInterval = getWhileIdleMinIntervalLocked(uid); + pw.print(" Next allowed:"); + TimeUtils.formatDuration(lastTime + minInterval, nowELAPSED, pw); + pw.print(" ("); + TimeUtils.formatDuration(minInterval, 0, pw); + pw.print(")"); + pw.println(); } } + + pw.print(" mUseAllowWhileIdleShortTime: ["); + for (int i = 0; i < mUseAllowWhileIdleShortTime.size(); i++) { + if (mUseAllowWhileIdleShortTime.valueAt(i)) { + UserHandle.formatUid(pw, mUseAllowWhileIdleShortTime.keyAt(i)); + pw.print(" "); + } + } + pw.println("]"); pw.println(); if (mLog.dump(pw, " Recent problems", " ")) { @@ -2181,13 +2191,23 @@ class AlarmManagerService extends SystemService { for (int i = 0; i < mLastAllowWhileIdleDispatch.size(); ++i) { final long token = proto.start( AlarmManagerServiceProto.LAST_ALLOW_WHILE_IDLE_DISPATCH_TIMES); - proto.write(AlarmManagerServiceProto.LastAllowWhileIdleDispatch.UID, - mLastAllowWhileIdleDispatch.keyAt(i)); - proto.write(AlarmManagerServiceProto.LastAllowWhileIdleDispatch.TIME_MS, - mLastAllowWhileIdleDispatch.valueAt(i)); + final int uid = mLastAllowWhileIdleDispatch.keyAt(i); + final long lastTime = mLastAllowWhileIdleDispatch.valueAt(i); + + proto.write(AlarmManagerServiceProto.LastAllowWhileIdleDispatch.UID, uid); + proto.write(AlarmManagerServiceProto.LastAllowWhileIdleDispatch.TIME_MS, lastTime); + proto.write(AlarmManagerServiceProto.LastAllowWhileIdleDispatch.NEXT_ALLOWED_MS, + lastTime + getWhileIdleMinIntervalLocked(uid)); proto.end(token); } + for (int i = 0; i < mUseAllowWhileIdleShortTime.size(); i++) { + if (mUseAllowWhileIdleShortTime.valueAt(i)) { + proto.write(AlarmManagerServiceProto.USE_ALLOW_WHILE_IDLE_SHORT_TIME, + mUseAllowWhileIdleShortTime.keyAt(i)); + } + } + mLog.writeToProto(proto, AlarmManagerServiceProto.RECENT_PROBLEMS); final FilterStats[] topFilters = new FilterStats[10]; @@ -2866,6 +2886,23 @@ class AlarmManagerService extends SystemService { private native int setKernelTime(long nativeData, long millis); private native int setKernelTimezone(long nativeData, int minuteswest); + private long getWhileIdleMinIntervalLocked(int uid) { + final boolean dozing = mPendingIdleUntil != null; + final boolean ebs = mForceAppStandbyTracker.isForceAllAppsStandbyEnabled(); + if (!dozing && !ebs) { + return mConstants.ALLOW_WHILE_IDLE_SHORT_TIME; + } + if (dozing) { + return mConstants.ALLOW_WHILE_IDLE_LONG_TIME; + } + if (mUseAllowWhileIdleShortTime.get(uid)) { + // if the last allow-while-idle went off while uid was fg, or the uid + // recently came into fg, don't block the alarm for long. + return mConstants.ALLOW_WHILE_IDLE_SHORT_TIME; + } + return mConstants.ALLOW_WHILE_IDLE_LONG_TIME; + } + boolean triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED, final long nowRTC) { boolean hasWakeup = false; @@ -2891,20 +2928,7 @@ class AlarmManagerService extends SystemService { // If this is an ALLOW_WHILE_IDLE alarm, we constrain how frequently the app can // schedule such alarms. final long lastTime = mLastAllowWhileIdleDispatch.get(alarm.creatorUid, 0); - final boolean dozing = mPendingIdleUntil != null; - final boolean ebs = mForceAppStandbyTracker.isForceAllAppsStandbyEnabled(); - final long minTime; - if (!dozing && !ebs) { - minTime = lastTime + mConstants.ALLOW_WHILE_IDLE_SHORT_TIME; - } else if (dozing) { - minTime = lastTime + mConstants.ALLOW_WHILE_IDLE_LONG_TIME; - } else if (mUseAllowWhileIdleShortTime.get(alarm.creatorUid)) { - // if the last allow-while-idle went off while uid was fg, or the uid - // recently came into fg, don't block the alarm for long. - minTime = lastTime + mConstants.ALLOW_WHILE_IDLE_SHORT_TIME; - } else { - minTime = lastTime + mConstants.ALLOW_WHILE_IDLE_LONG_TIME; - } + final long minTime = lastTime + getWhileIdleMinIntervalLocked(alarm.creatorUid); if (nowELAPSED < minTime) { // Whoops, it hasn't been long enough since the last ALLOW_WHILE_IDLE // alarm went off for this app. Reschedule the alarm to be in the @@ -3641,6 +3665,7 @@ class AlarmManagerService extends SystemService { } else if (Intent.ACTION_UID_REMOVED.equals(action)) { if (uid >= 0) { mLastAllowWhileIdleDispatch.delete(uid); + mUseAllowWhileIdleShortTime.delete(uid); } } else { if (Intent.ACTION_PACKAGE_REMOVED.equals(action) @@ -3693,7 +3718,6 @@ class AlarmManagerService extends SystemService { @Override public void onUidGone(int uid, boolean disabled) { synchronized (mLock) { - mUseAllowWhileIdleShortTime.delete(uid); if (disabled) { removeForStoppedLocked(uid); } @@ -3701,9 +3725,6 @@ class AlarmManagerService extends SystemService { } @Override public void onUidActive(int uid) { - synchronized (mLock) { - mUseAllowWhileIdleShortTime.put(uid, true); - } } @Override public void onUidIdle(int uid, boolean disabled) { @@ -3766,6 +3787,18 @@ class AlarmManagerService extends SystemService { sendPendingBackgroundAlarmsLocked(uid, packageName); } } + + @Override + public void onUidForeground(int uid, boolean foreground) { + synchronized (mLock) { + if (foreground) { + mUseAllowWhileIdleShortTime.put(uid, true); + + // Note we don't have to drain the pending while-idle alarms here, because + // this event should coincide with unblockAlarmsForUid(). + } + } + } }; private final BroadcastStats getStatsLocked(PendingIntent pi) { @@ -4026,7 +4059,7 @@ class AlarmManagerService extends SystemService { if (allowWhileIdle) { // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. mLastAllowWhileIdleDispatch.put(alarm.creatorUid, nowELAPSED); - if (mForceAppStandbyTracker.isInForeground(alarm.creatorUid)) { + if (mForceAppStandbyTracker.isUidInForeground(alarm.creatorUid)) { mUseAllowWhileIdleShortTime.put(alarm.creatorUid, true); } else { mUseAllowWhileIdleShortTime.put(alarm.creatorUid, false); diff --git a/services/core/java/com/android/server/ForceAppStandbyTracker.java b/services/core/java/com/android/server/ForceAppStandbyTracker.java index 7604044583db..339101fa79bb 100644 --- a/services/core/java/com/android/server/ForceAppStandbyTracker.java +++ b/services/core/java/com/android/server/ForceAppStandbyTracker.java @@ -54,6 +54,7 @@ import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; +import com.android.server.DeviceIdleController.LocalService; import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage; import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages; @@ -64,18 +65,15 @@ import java.util.List; /** * Class to keep track of the information related to "force app standby", which includes: * - OP_RUN_ANY_IN_BACKGROUND for each package - * - UID foreground state + * - UID foreground/active state * - User+system power save whitelist * - Temporary power save whitelist * - Global "force all apps standby" mode enforced by battery saver. * - * TODO: In general, we can reduce the number of callbacks by checking all signals before sending - * each callback. For example, even when an UID comes into the foreground, if it wasn't - * originally restricted, then there's no need to send an event. - * Doing this would be error-prone, so we punt it for now, but we should revisit it later. + * TODO: Make it a LocalService. * * Test: - * atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java + atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java */ public class ForceAppStandbyTracker { private static final String TAG = "ForceAppStandbyTracker"; @@ -108,6 +106,11 @@ public class ForceAppStandbyTracker { @GuardedBy("mLock") final ArraySet<Pair<Integer, String>> mRunAnyRestrictedPackages = new ArraySet<>(); + /** UIDs that are active. */ + @GuardedBy("mLock") + final SparseBooleanArray mActiveUids = new SparseBooleanArray(); + + /** UIDs that are in the foreground. */ @GuardedBy("mLock") final SparseBooleanArray mForegroundUids = new SparseBooleanArray(); @@ -160,18 +163,20 @@ public class ForceAppStandbyTracker { boolean mForcedAppStandbyEnabled; interface Stats { - int UID_STATE_CHANGED = 0; - int RUN_ANY_CHANGED = 1; - int ALL_UNWHITELISTED = 2; - int ALL_WHITELIST_CHANGED = 3; - int TEMP_WHITELIST_CHANGED = 4; - int EXEMPT_CHANGED = 5; - int FORCE_ALL_CHANGED = 6; - int FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 7; + int UID_FG_STATE_CHANGED = 0; + int UID_ACTIVE_STATE_CHANGED = 1; + int RUN_ANY_CHANGED = 2; + int ALL_UNWHITELISTED = 3; + int ALL_WHITELIST_CHANGED = 4; + int TEMP_WHITELIST_CHANGED = 5; + int EXEMPT_CHANGED = 6; + int FORCE_ALL_CHANGED = 7; + int FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8; } private final StatLogger mStatLogger = new StatLogger(new String[] { - "UID_STATE_CHANGED", + "UID_FG_STATE_CHANGED", + "UID_ACTIVE_STATE_CHANGED", "RUN_ANY_CHANGED", "ALL_UNWHITELISTED", "ALL_WHITELIST_CHANGED", @@ -260,9 +265,16 @@ public class ForceAppStandbyTracker { * This is called when the foreground state changed for a UID. */ private void onUidForegroundStateChanged(ForceAppStandbyTracker sender, int uid) { + onUidForeground(uid, sender.isUidInForeground(uid)); + } + + /** + * This is called when the active/idle state changed for a UID. + */ + private void onUidActiveStateChanged(ForceAppStandbyTracker sender, int uid) { updateJobsForUid(uid); - if (sender.isInForeground(uid)) { + if (sender.isUidActive(uid)) { unblockAlarmsForUid(uid); } } @@ -355,6 +367,14 @@ public class ForceAppStandbyTracker { */ public void unblockAlarmsForUidPackage(int uid, String packageName) { } + + /** + * Called when a UID comes into the foreground or the background. + * + * @see #isUidInForeground(int) + */ + public void onUidForeground(int uid, boolean foreground) { + } } @VisibleForTesting @@ -404,8 +424,10 @@ public class ForceAppStandbyTracker { try { mIActivityManager.registerUidObserver(new UidObserver(), - ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_IDLE - | ActivityManager.UID_OBSERVER_ACTIVE, + ActivityManager.UID_OBSERVER_GONE + | ActivityManager.UID_OBSERVER_IDLE + | ActivityManager.UID_OBSERVER_ACTIVE + | ActivityManager.UID_OBSERVER_PROCSTATE, ActivityManager.PROCESS_STATE_UNKNOWN, null); mAppOpsService.startWatchingMode(TARGET_OP, null, new AppOpsWatcher()); @@ -563,65 +585,77 @@ public class ForceAppStandbyTracker { return true; } - /** - * Puts a UID to {@link #mForegroundUids}. - */ - void uidToForeground(int uid) { - synchronized (mLock) { - if (UserHandle.isCore(uid)) { - return; - } - // TODO This can be optimized by calling indexOfKey and sharing the index for get and - // put. - if (mForegroundUids.get(uid)) { - return; - } - mForegroundUids.put(uid, true); - mHandler.notifyUidForegroundStateChanged(uid); + private static boolean addUidToArray(SparseBooleanArray array, int uid) { + if (UserHandle.isCore(uid)) { + return false; + } + if (array.get(uid)) { + return false; } + array.put(uid, true); + return true; } - /** - * Sets false for a UID {@link #mForegroundUids}, or remove it when {@code remove} is true. - */ - void uidToBackground(int uid, boolean remove) { - synchronized (mLock) { - if (UserHandle.isCore(uid)) { - return; - } - // TODO This can be optimized by calling indexOfKey and sharing the index for get and - // put. - if (!mForegroundUids.get(uid)) { - return; - } - if (remove) { - mForegroundUids.delete(uid); - } else { - mForegroundUids.put(uid, false); - } - mHandler.notifyUidForegroundStateChanged(uid); + private static boolean removeUidFromArray(SparseBooleanArray array, int uid, boolean remove) { + if (UserHandle.isCore(uid)) { + return false; } + if (!array.get(uid)) { + return false; + } + if (remove) { + array.delete(uid); + } else { + array.put(uid, false); + } + return true; } private final class UidObserver extends IUidObserver.Stub { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { + synchronized (mLock) { + if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { + if (removeUidFromArray(mForegroundUids, uid, false)) { + mHandler.notifyUidForegroundStateChanged(uid); + } + } else { + if (addUidToArray(mForegroundUids, uid)) { + mHandler.notifyUidForegroundStateChanged(uid); + } + } + } } @Override public void onUidGone(int uid, boolean disabled) { - uidToBackground(uid, /*remove=*/ true); + removeUid(uid, true); } @Override public void onUidActive(int uid) { - uidToForeground(uid); + synchronized (mLock) { + if (addUidToArray(mActiveUids, uid)) { + mHandler.notifyUidActiveStateChanged(uid); + } + } } @Override public void onUidIdle(int uid, boolean disabled) { // Just to avoid excessive memcpy, don't remove from the array in this case. - uidToBackground(uid, /*remove=*/ false); + removeUid(uid, false); + } + + private void removeUid(int uid, boolean remove) { + synchronized (mLock) { + if (removeUidFromArray(mActiveUids, uid, remove)) { + mHandler.notifyUidActiveStateChanged(uid); + } + if (removeUidFromArray(mForegroundUids, uid, remove)) { + mHandler.notifyUidForegroundStateChanged(uid); + } + } } @Override @@ -695,22 +729,27 @@ public class ForceAppStandbyTracker { } private class MyHandler extends Handler { - private static final int MSG_UID_STATE_CHANGED = 1; - private static final int MSG_RUN_ANY_CHANGED = 2; - private static final int MSG_ALL_UNWHITELISTED = 3; - private static final int MSG_ALL_WHITELIST_CHANGED = 4; - private static final int MSG_TEMP_WHITELIST_CHANGED = 5; - private static final int MSG_FORCE_ALL_CHANGED = 6; - private static final int MSG_USER_REMOVED = 7; - private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 8; - private static final int MSG_EXEMPT_CHANGED = 9; + private static final int MSG_UID_ACTIVE_STATE_CHANGED = 0; + private static final int MSG_UID_FG_STATE_CHANGED = 1; + private static final int MSG_RUN_ANY_CHANGED = 3; + private static final int MSG_ALL_UNWHITELISTED = 4; + private static final int MSG_ALL_WHITELIST_CHANGED = 5; + private static final int MSG_TEMP_WHITELIST_CHANGED = 6; + private static final int MSG_FORCE_ALL_CHANGED = 7; + private static final int MSG_USER_REMOVED = 8; + private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 9; + private static final int MSG_EXEMPT_CHANGED = 10; public MyHandler(Looper looper) { super(looper); } + public void notifyUidActiveStateChanged(int uid) { + obtainMessage(MSG_UID_ACTIVE_STATE_CHANGED, uid, 0).sendToTarget(); + } + public void notifyUidForegroundStateChanged(int uid) { - obtainMessage(MSG_UID_STATE_CHANGED, uid, 0).sendToTarget(); + obtainMessage(MSG_UID_FG_STATE_CHANGED, uid, 0).sendToTarget(); } public void notifyRunAnyAppOpsChanged(int uid, @NonNull String packageName) { @@ -718,26 +757,32 @@ public class ForceAppStandbyTracker { } public void notifyAllUnwhitelisted() { + removeMessages(MSG_ALL_UNWHITELISTED); obtainMessage(MSG_ALL_UNWHITELISTED).sendToTarget(); } public void notifyAllWhitelistChanged() { + removeMessages(MSG_ALL_WHITELIST_CHANGED); obtainMessage(MSG_ALL_WHITELIST_CHANGED).sendToTarget(); } public void notifyTempWhitelistChanged() { + removeMessages(MSG_TEMP_WHITELIST_CHANGED); obtainMessage(MSG_TEMP_WHITELIST_CHANGED).sendToTarget(); } public void notifyForceAllAppsStandbyChanged() { + removeMessages(MSG_FORCE_ALL_CHANGED); obtainMessage(MSG_FORCE_ALL_CHANGED).sendToTarget(); } public void notifyForcedAppStandbyFeatureFlagChanged() { + removeMessages(MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED); obtainMessage(MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED).sendToTarget(); } public void notifyExemptChanged() { + removeMessages(MSG_EXEMPT_CHANGED); obtainMessage(MSG_EXEMPT_CHANGED).sendToTarget(); } @@ -763,11 +808,18 @@ public class ForceAppStandbyTracker { long start = mStatLogger.getTime(); switch (msg.what) { - case MSG_UID_STATE_CHANGED: + case MSG_UID_ACTIVE_STATE_CHANGED: + for (Listener l : cloneListeners()) { + l.onUidActiveStateChanged(sender, msg.arg1); + } + mStatLogger.logDurationStat(Stats.UID_ACTIVE_STATE_CHANGED, start); + return; + + case MSG_UID_FG_STATE_CHANGED: for (Listener l : cloneListeners()) { l.onUidForegroundStateChanged(sender, msg.arg1); } - mStatLogger.logDurationStat(Stats.UID_STATE_CHANGED, start); + mStatLogger.logDurationStat(Stats.UID_FG_STATE_CHANGED, start); return; case MSG_RUN_ANY_CHANGED: @@ -846,15 +898,20 @@ public class ForceAppStandbyTracker { mRunAnyRestrictedPackages.removeAt(i); } } - for (int i = mForegroundUids.size() - 1; i >= 0; i--) { - final int uid = mForegroundUids.keyAt(i); - final int userId = UserHandle.getUserId(uid); + cleanUpArrayForUser(mActiveUids, removedUserId); + cleanUpArrayForUser(mForegroundUids, removedUserId); + mExemptedPackages.remove(removedUserId); + } + } - if (userId == removedUserId) { - mForegroundUids.removeAt(i); - } + private void cleanUpArrayForUser(SparseBooleanArray array, int removedUserId) { + for (int i = array.size() - 1; i >= 0; i--) { + final int uid = array.keyAt(i); + final int userId = UserHandle.getUserId(uid); + + if (userId == removedUserId) { + array.removeAt(i); } - mExemptedPackages.remove(removedUserId); } } @@ -954,7 +1011,7 @@ public class ForceAppStandbyTracker { */ private boolean isRestricted(int uid, @NonNull String packageName, boolean useTempWhitelistToo, boolean exemptOnBatterySaver) { - if (isInForeground(uid)) { + if (isUidActive(uid)) { return false; } synchronized (mLock) { @@ -982,13 +1039,29 @@ public class ForceAppStandbyTracker { } /** + * @return whether a UID is in active or not. + * + * Note this information is based on the UID proc state callback, meaning it's updated + * asynchronously and may subtly be stale. If the fresh data is needed, use + * {@link ActivityManagerInternal#getUidProcessState} instead. + */ + public boolean isUidActive(int uid) { + if (UserHandle.isCore(uid)) { + return true; + } + synchronized (mLock) { + return mActiveUids.get(uid); + } + } + + /** * @return whether a UID is in the foreground or not. * * Note this information is based on the UID proc state callback, meaning it's updated * asynchronously and may subtly be stale. If the fresh data is needed, use * {@link ActivityManagerInternal#getUidProcessState} instead. */ - public boolean isInForeground(int uid) { + public boolean isUidInForeground(int uid) { if (UserHandle.isCore(uid)) { return true; } @@ -1062,17 +1135,12 @@ public class ForceAppStandbyTracker { pw.println(mIsPluggedIn); pw.print(indent); - pw.print("Foreground uids: ["); + pw.print("Active uids: "); + dumpUids(pw, mActiveUids); - String sep = ""; - for (int i = 0; i < mForegroundUids.size(); i++) { - if (mForegroundUids.valueAt(i)) { - pw.print(sep); - pw.print(UserHandle.formatUid(mForegroundUids.keyAt(i))); - sep = " "; - } - } - pw.println("]"); + pw.print(indent); + pw.print("Foreground uids: "); + dumpUids(pw, mForegroundUids); pw.print(indent); pw.print("Whitelist appids: "); @@ -1114,6 +1182,20 @@ public class ForceAppStandbyTracker { } } + private void dumpUids(PrintWriter pw, SparseBooleanArray array) { + pw.print("["); + + String sep = ""; + for (int i = 0; i < array.size(); i++) { + if (array.valueAt(i)) { + pw.print(sep); + pw.print(UserHandle.formatUid(array.keyAt(i))); + sep = " "; + } + } + pw.println("]"); + } + public void dumpProto(ProtoOutputStream proto, long fieldId) { synchronized (mLock) { final long token = proto.start(fieldId); @@ -1125,6 +1207,13 @@ public class ForceAppStandbyTracker { mForceAllAppStandbyForSmallBattery); proto.write(ForceAppStandbyTrackerProto.IS_PLUGGED_IN, mIsPluggedIn); + for (int i = 0; i < mActiveUids.size(); i++) { + if (mActiveUids.valueAt(i)) { + proto.write(ForceAppStandbyTrackerProto.ACTIVE_UIDS, + mActiveUids.keyAt(i)); + } + } + for (int i = 0; i < mForegroundUids.size(); i++) { if (mForegroundUids.valueAt(i)) { proto.write(ForceAppStandbyTrackerProto.FOREGROUND_UIDS, diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index fc91d0d7abf1..2f425859fec4 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -59,6 +59,7 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; +import android.annotation.TestApi; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; @@ -468,7 +469,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub int mCurFocusedWindowSoftInputMode; /** - * The client by which {@link #mCurFocusedWindow} was reported. Used only for debugging. + * The client by which {@link #mCurFocusedWindow} was reported. */ ClientState mCurFocusedWindowClient; @@ -2989,8 +2990,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub final int uid = Binder.getCallingUid(); if (UserHandle.getAppId(uid) == Process.SYSTEM_UID) { return true; - } else if (mCurClient != null && client != null - && mCurClient.client.asBinder() == client.asBinder()) { + } else if (mCurFocusedWindowClient != null && client != null + && mCurFocusedWindowClient.client.asBinder() == client.asBinder()) { return true; } else if (mCurIntent != null && InputMethodUtils.checkIfPackageBelongsToUid( mAppOpsManager, @@ -3026,6 +3027,15 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } + public boolean isInputMethodPickerShownForTest() { + synchronized(mMethodMap) { + if (mSwitchingDialog == null) { + return false; + } + return mSwitchingDialog.isShowing(); + } + } + @Override public void setInputMethod(IBinder token, String id) { if (!calledFromValidUser()) { diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index a2c0506e34bc..3ca3a96fcd25 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -1,16 +1,13 @@ # Connectivity / Networking per-file ConnectivityService.java=ek@google.com -per-file ConnectivityService.java=hugobenichi@google.com per-file ConnectivityService.java=jchalard@google.com per-file ConnectivityService.java=lorenzo@google.com per-file ConnectivityService.java=satk@google.com per-file NetworkManagementService.java=ek@google.com -per-file NetworkManagementService.java=hugobenichi@google.com per-file NetworkManagementService.java=jchalard@google.com per-file NetworkManagementService.java=lorenzo@google.com per-file NetworkManagementService.java=satk@google.com per-file NsdService.java=ek@google.com -per-file NsdService.java=hugobenichi@google.com per-file NsdService.java=jchalard@google.com per-file NsdService.java=lorenzo@google.com per-file NsdService.java=satk@google.com diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 6747be340d46..6743484b91c4 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -35,6 +35,7 @@ import android.os.UserHandle; import android.telephony.CellInfo; import android.telephony.CellLocation; import android.telephony.DisconnectCause; +import android.telephony.LocationAccessPolicy; import android.telephony.PhoneStateListener; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; @@ -93,7 +94,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { IPhoneStateListener callback; IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback; - int callerUserId; + int callerUid; + int callerPid; int events; @@ -117,7 +119,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " callback=" + callback + " onSubscriptionsChangedListenererCallback=" + onSubscriptionsChangedListenerCallback - + " callerUserId=" + callerUserId + " subId=" + subId + " phoneId=" + phoneId + + " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId + " events=" + Integer.toHexString(events) + " canReadPhoneState=" + canReadPhoneState + "}"; } @@ -356,6 +358,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { public void addOnSubscriptionsChangedListener(String callingPackage, IOnSubscriptionsChangedListener callback) { int callerUserId = UserHandle.getCallingUserId(); + mContext.getSystemService(AppOpsManager.class) + .checkPackage(Binder.getCallingUid(), callingPackage); if (VDBG) { log("listen oscl: E pkg=" + callingPackage + " myUserId=" + UserHandle.myUserId() + " callerUserId=" + callerUserId + " callback=" + callback @@ -399,7 +403,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { r.onSubscriptionsChangedListenerCallback = callback; r.callingPackage = callingPackage; - r.callerUserId = callerUserId; + r.callerUid = Binder.getCallingUid(); + r.callerPid = Binder.getCallingPid(); r.events = 0; r.canReadPhoneState = true; // permission has been enforced above if (DBG) { @@ -470,6 +475,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private void listen(String callingPackage, IPhoneStateListener callback, int events, boolean notifyNow, int subId) { int callerUserId = UserHandle.getCallingUserId(); + mContext.getSystemService(AppOpsManager.class) + .checkPackage(Binder.getCallingUid(), callingPackage); if (VDBG) { log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events) + " notifyNow=" + notifyNow + " subId=" + subId + " myUserId=" @@ -514,7 +521,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { r.callback = callback; r.callingPackage = callingPackage; - r.callerUserId = callerUserId; + r.callerUid = Binder.getCallingUid(); + r.callerPid = Binder.getCallingPid(); boolean isPhoneStateEvent = (events & (CHECK_PHONE_STATE_PERMISSION_MASK | ENFORCE_PHONE_STATE_PERMISSION_MASK)) != 0; r.canReadPhoneState = isPhoneStateEvent && canReadPhoneState(callingPackage); @@ -572,8 +580,10 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("listen: mCellLocation = " + mCellLocation[phoneId]); - r.callback.onCellLocationChanged( - new Bundle(mCellLocation[phoneId])); + if (checkLocationAccess(r)) { + r.callback.onCellLocationChanged( + new Bundle(mCellLocation[phoneId])); + } } catch (RemoteException ex) { remove(r.binder); } @@ -619,7 +629,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = " + mCellInfo.get(phoneId)); - r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + if (checkLocationAccess(r)) { + r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + } } catch (RemoteException ex) { remove(r.binder); } @@ -979,7 +991,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellInfo.set(phoneId, cellInfo); for (Record r : mRecords) { if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) && - idMatch(r.subId, subId, phoneId)) { + idMatch(r.subId, subId, phoneId) && + checkLocationAccess(r)) { try { if (DBG_LOC) { log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r); @@ -1262,7 +1275,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCellLocation[phoneId] = cellLocation; for (Record r : mRecords) { if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) && - idMatch(r.subId, subId, phoneId)) { + idMatch(r.subId, subId, phoneId) && + checkLocationAccess(r)) { try { if (DBG_LOC) { log("notifyCellLocation: cellLocation=" + cellLocation @@ -1706,10 +1720,11 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { boolean valid = false; try { foregroundUser = ActivityManager.getCurrentUser(); - valid = r.callerUserId == foregroundUser && r.matchPhoneStateListenerEvent(events); + valid = UserHandle.getUserId(r.callerUid) == foregroundUser + && r.matchPhoneStateListenerEvent(events); if (DBG | DBG_LOC) { log("validateEventsAndUserLocked: valid=" + valid - + " r.callerUserId=" + r.callerUserId + " foregroundUser=" + foregroundUser + + " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser + " r.events=" + r.events + " events=" + events); } } finally { @@ -1741,6 +1756,16 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + private boolean checkLocationAccess(Record r) { + long token = Binder.clearCallingIdentity(); + try { + return LocationAccessPolicy.canAccessCellLocation(mContext, + r.callingPackage, r.callerUid, r.callerPid); + } finally { + Binder.restoreCallingIdentity(token); + } + } + private void checkPossibleMissNotify(Record r, int phoneId) { int events = r.events; @@ -1788,7 +1813,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { log("checkPossibleMissNotify: onCellInfoChanged[" + phoneId + "] = " + mCellInfo.get(phoneId)); } - r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + if (checkLocationAccess(r)) { + r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); + } } catch (RemoteException ex) { mRemoveList.add(r.binder); } @@ -1836,7 +1863,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { try { if (DBG_LOC) log("checkPossibleMissNotify: onCellLocationChanged mCellLocation = " + mCellLocation[phoneId]); - r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId])); + if (checkLocationAccess(r)) { + r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId])); + } } catch (RemoteException ex) { mRemoveList.add(r.binder); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f37039372d54..99f36d0a8b1b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -385,6 +385,7 @@ import android.view.RemoteAnimationDefinition; import android.view.View; import android.view.WindowManager; +import android.view.autofill.AutofillManagerInternal; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -777,8 +778,11 @@ public class ActivityManagerService extends IActivityManager.Stub long mWaitForNetworkTimeoutMs; /** - * Helper class which parses out priority arguments and dumps sections according to their - * priority. If priority arguments are omitted, function calls the legacy dump command. + * Helper class which strips out priority and proto arguments then calls the dump function with + * the appropriate arguments. If priority arguments are omitted, function calls the legacy + * dump command. + * If priority arguments are omitted all sections are dumped, otherwise sections are dumped + * according to their priority. */ private final PriorityDump.PriorityDumper mPriorityDumper = new PriorityDump.PriorityDumper() { @Override @@ -790,23 +794,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void dumpNormal(FileDescriptor fd, PrintWriter pw, String[] args, boolean asProto) { - if (asProto) { - doDump(fd, pw, new String[0], asProto); - } else { - doDump(fd, pw, new String[]{"settings"}, asProto); - doDump(fd, pw, new String[]{"intents"}, asProto); - doDump(fd, pw, new String[]{"broadcasts"}, asProto); - doDump(fd, pw, new String[]{"providers"}, asProto); - doDump(fd, pw, new String[]{"permissions"}, asProto); - doDump(fd, pw, new String[]{"services"}, asProto); - doDump(fd, pw, new String[]{"recents"}, asProto); - doDump(fd, pw, new String[]{"lastanr"}, asProto); - doDump(fd, pw, new String[]{"starter"}, asProto); - if (mAssociations.size() > 0) { - doDump(fd, pw, new String[]{"associations"}, asProto); - } - doDump(fd, pw, new String[]{"processes"}, asProto); - } + doDump(fd, pw, new String[]{"-a", "--normal-priority"}, asProto); } @Override @@ -1285,6 +1273,40 @@ public class ActivityManagerService extends IActivityManager.Stub } } + DevelopmentSettingsObserver mDevelopmentSettingsObserver; + + private final class DevelopmentSettingsObserver extends ContentObserver { + private final Uri mUri = Settings.Global + .getUriFor(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED); + + private final ComponentName mBugreportStorageProvider = new ComponentName( + "com.android.shell", "com.android.shell.BugreportStorageProvider"); + + public DevelopmentSettingsObserver() { + super(mHandler); + mContext.getContentResolver().registerContentObserver(mUri, false, this, + UserHandle.USER_ALL); + // Always kick once to ensure that we match current state + onChange(); + } + + @Override + public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) { + if (mUri.equals(uri)) { + onChange(); + } + } + + public void onChange() { + final boolean enabled = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, Build.IS_ENG ? 1 : 0) != 0; + mContext.getPackageManager().setComponentEnabledSetting(mBugreportStorageProvider, + enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, + 0); + } + } + /** * Thread-local storage used to carry caller permissions over through * indirect content-provider access. @@ -7478,6 +7500,18 @@ public class ActivityManagerService extends IActivityManager.Stub thread.attachAgent(preBindAgent); } + + // Figure out whether the app needs to run in autofill compat mode. + boolean isAutofillCompatEnabled = false; + if (UserHandle.getAppId(app.info.uid) >= Process.FIRST_APPLICATION_UID) { + final AutofillManagerInternal afm = LocalServices.getService( + AutofillManagerInternal.class); + if (afm != null) { + isAutofillCompatEnabled = afm.isCompatibilityModeRequested( + app.info.packageName, app.info.versionCode, app.userId); + } + } + checkTime(startTime, "attachApplicationLocked: immediately before bindApplication"); mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(app); if (app.isolatedEntryPoint != null) { @@ -7495,7 +7529,7 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(getGlobalConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial); + buildSerial, isAutofillCompatEnabled); } else { thread.bindApplication(processName, appInfo, providers, null, profilerInfo, null, null, null, testMode, @@ -7504,7 +7538,7 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(getGlobalConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial); + buildSerial, isAutofillCompatEnabled); } checkTime(startTime, "attachApplicationLocked: immediately after bindApplication"); @@ -12425,6 +12459,7 @@ public class ActivityManagerService extends IActivityManager.Stub mConstants.start(mContext.getContentResolver()); mCoreSettingsObserver = new CoreSettingsObserver(this); mFontScaleSettingObserver = new FontScaleSettingObserver(); + mDevelopmentSettingsObserver = new DevelopmentSettingsObserver(); GlobalSettingsToPropertiesMapper.start(mContext.getContentResolver()); // Now that the settings provider is published we can consider sending @@ -13639,6 +13674,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Timed out. return; } + if ((sendReceiver=pae.receiver) != null) { // Caller wants result sent back to them. sendBundle = new Bundle(); @@ -15454,6 +15490,7 @@ public class ActivityManagerService extends IActivityManager.Stub boolean dumpClient = false; boolean dumpCheckin = false; boolean dumpCheckinFormat = false; + boolean dumpNormalPriority = false; boolean dumpVisibleStacksOnly = false; boolean dumpFocusedStackOnly = false; String dumpPackage = null; @@ -15486,6 +15523,8 @@ public class ActivityManagerService extends IActivityManager.Stub dumpCheckin = dumpCheckinFormat = true; } else if ("-C".equals(opt)) { dumpCheckinFormat = true; + } else if ("--normal-priority".equals(opt)) { + dumpNormalPriority = true; } else if ("-h".equals(opt)) { ActivityManagerShellCommand.dumpHelp(pw, true); return; @@ -15887,11 +15926,15 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println("-------------------------------------------------------------------------------"); } dumpActivityContainersLocked(pw); - pw.println(); - if (dumpAll) { - pw.println("-------------------------------------------------------------------------------"); + // Activities section is dumped as part of the Critical priority dump. Exclude the + // section if priority is Normal. + if (!dumpNormalPriority){ + pw.println(); + if (dumpAll) { + pw.println("-------------------------------------------------------------------------------"); + } + dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); } - dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); if (mAssociations.size() > 0) { pw.println(); if (dumpAll) { diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index f0c90e0f1fab..24a77c7693d0 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -115,6 +115,7 @@ final class ActivityManagerShellCommand extends ShellCommand { private int mActivityType; private int mTaskId; private boolean mIsTaskOverlay; + private boolean mIsLockTask; final boolean mDumping; @@ -278,6 +279,7 @@ final class ActivityManagerShellCommand extends ShellCommand { mActivityType = ACTIVITY_TYPE_UNDEFINED; mTaskId = INVALID_TASK_ID; mIsTaskOverlay = false; + mIsLockTask = false; return Intent.parseCommandArgs(this, new Intent.CommandOptionHandler() { @Override @@ -334,6 +336,8 @@ final class ActivityManagerShellCommand extends ShellCommand { mTaskId = Integer.parseInt(getNextArgRequired()); } else if (opt.equals("--task-overlay")) { mIsTaskOverlay = true; + } else if (opt.equals("--lock-task")) { + mIsLockTask = true; } else { return false; } @@ -429,13 +433,22 @@ final class ActivityManagerShellCommand extends ShellCommand { options.setLaunchActivityType(mActivityType); } if (mTaskId != INVALID_TASK_ID) { - options = ActivityOptions.makeBasic(); + if (options == null) { + options = ActivityOptions.makeBasic(); + } options.setLaunchTaskId(mTaskId); if (mIsTaskOverlay) { options.setTaskOverlay(true, true /* canResume */); } } + android.util.Log.d("bfranz", "I was here: " + mIsLockTask); + if (mIsLockTask) { + if (options == null) { + options = ActivityOptions.makeBasic(); + } + options.setLockTaskMode(true); + } if (mWaitOption) { result = mInterface.startActivityAndWait(null, null, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index bf3882587693..77f6d44e6670 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.START_ANY_ACTIVITY; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; +import static android.app.ActivityManager.START_DELIVERED_TO_TOP; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SECONDARY_DISPLAY; @@ -1133,19 +1134,31 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } } - void reportTaskToFrontNoLaunch(ActivityRecord r) { + void reportWaitingActivityLaunchedIfNeeded(ActivityRecord r, int result) { + if (mWaitingActivityLaunched.isEmpty()) { + return; + } + + if (result != START_DELIVERED_TO_TOP && result != START_TASK_TO_FRONT) { + return; + } + boolean changed = false; + for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { WaitResult w = mWaitingActivityLaunched.remove(i); if (w.who == null) { changed = true; - // Set result to START_TASK_TO_FRONT so that startActivityMayWait() knows that - // the starting activity ends up moving another activity to front, and it should - // wait for this new activity to become visible instead. - // Do not modify other fields. - w.result = START_TASK_TO_FRONT; + w.result = result; + + // Unlike START_TASK_TO_FRONT, When an intent is delivered to top, there + // will be no followup launch signals. Assign the result and launched component. + if (result == START_DELIVERED_TO_TOP) { + w.who = r.realActivity; + } } } + if (changed) { mService.notifyAll(); } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index eab88aa45e44..b061ba4106d4 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -879,11 +879,11 @@ class ActivityStarter { } // We're waiting for an activity launch to finish, but that activity simply - // brought another activity to front. Let startActivityMayWait() know about - // this, so it waits for the new activity to become visible instead. - if (result == START_TASK_TO_FRONT && !mSupervisor.mWaitingActivityLaunched.isEmpty()) { - mSupervisor.reportTaskToFrontNoLaunch(mStartActivity); - } + // brought another activity to front. We must also handle the case where the task is already + // in the front as a result of the trampoline activity being in the same task (it will be + // considered focused as the trampoline will be finished). Let startActivityMayWait() know + // about this, so it waits for the new activity to become visible instead. + mSupervisor.reportWaitingActivityLaunchedIfNeeded(r, result); ActivityStack startedActivityStack = null; final ActivityStack currentStack = r.getStack(); @@ -1076,39 +1076,51 @@ class ActivityStarter { if (outResult != null) { outResult.result = res; - if (res == ActivityManager.START_SUCCESS) { - mSupervisor.mWaitingActivityLaunched.add(outResult); - do { - try { - mService.wait(); - } catch (InterruptedException e) { - } - } while (outResult.result != START_TASK_TO_FRONT - && !outResult.timeout && outResult.who == null); - if (outResult.result == START_TASK_TO_FRONT) { - res = START_TASK_TO_FRONT; - } - } - if (res == START_TASK_TO_FRONT) { - final ActivityRecord r = outRecord[0]; - // ActivityRecord may represent a different activity, but it should not be in - // the resumed state. - if (r.nowVisible && r.state == RESUMED) { - outResult.timeout = false; - outResult.who = r.realActivity; - outResult.totalTime = 0; - outResult.thisTime = 0; - } else { - outResult.thisTime = SystemClock.uptimeMillis(); - mSupervisor.waitActivityVisible(r.realActivity, outResult); - // Note: the timeout variable is not currently not ever set. + final ActivityRecord r = outRecord[0]; + + switch(res) { + case START_SUCCESS: { + mSupervisor.mWaitingActivityLaunched.add(outResult); do { try { mService.wait(); } catch (InterruptedException e) { } - } while (!outResult.timeout && outResult.who == null); + } while (outResult.result != START_TASK_TO_FRONT + && !outResult.timeout && outResult.who == null); + if (outResult.result == START_TASK_TO_FRONT) { + res = START_TASK_TO_FRONT; + } + break; + } + case START_DELIVERED_TO_TOP: { + outResult.timeout = false; + outResult.who = r.realActivity; + outResult.totalTime = 0; + outResult.thisTime = 0; + break; + } + case START_TASK_TO_FRONT: { + // ActivityRecord may represent a different activity, but it should not be + // in the resumed state. + if (r.nowVisible && r.state == RESUMED) { + outResult.timeout = false; + outResult.who = r.realActivity; + outResult.totalTime = 0; + outResult.thisTime = 0; + } else { + outResult.thisTime = SystemClock.uptimeMillis(); + mSupervisor.waitActivityVisible(r.realActivity, outResult); + // Note: the timeout variable is not currently not ever set. + do { + try { + mService.wait(); + } catch (InterruptedException e) { + } + } while (!outResult.timeout && outResult.who == null); + } + break; } } } diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java index d6c6f96285a6..9c2ee873fa6d 100644 --- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java @@ -41,6 +41,7 @@ class GlobalSettingsToPropertiesMapper { // {Settings.Global.SETTING_NAME, "system_property_name"}, {Settings.Global.SYS_VDSO, "sys.vdso"}, {Settings.Global.FPS_DEVISOR, ThreadedRenderer.DEBUG_FPS_DIVISOR}, + {Settings.Global.UID_CPUPOWER, "uid.cpupower"}, }; diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index 21f9135bd03d..e5762d294922 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -38,6 +38,7 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; @@ -142,14 +143,6 @@ public class LockTaskController { TelecomManager mTelecomManager; /** - * Helper that is responsible for showing the right toast when a disallowed activity operation - * occurred. In pinned mode, we show instructions on how to break out of this mode, whilst in - * fully locked mode we only show that unlocking is blocked. - */ - @VisibleForTesting - LockTaskNotify mLockTaskNotify; - - /** * The chain of tasks in LockTask mode, in the order of when they first entered LockTask mode. * * The first task in the list, which started the current LockTask session, is called the root @@ -475,7 +468,7 @@ public class LockTaskController { getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId); } if (mLockTaskModeState == LOCK_TASK_MODE_PINNED) { - getLockTaskNotify().showPinningExitToast(); + getStatusBarService().showPinningEnterExitToast(false /* entering */); } } catch (RemoteException ex) { throw new RuntimeException(ex); @@ -490,7 +483,11 @@ public class LockTaskController { */ void showLockTaskToast() { if (mLockTaskModeState == LOCK_TASK_MODE_PINNED) { - mHandler.post(() -> getLockTaskNotify().showEscapeToast()); + try { + getStatusBarService().showPinningEscapeToast(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to send pinning escape toast", e); + } } } @@ -582,7 +579,7 @@ public class LockTaskController { // When lock task starts, we disable the status bars. try { if (lockTaskModeState == LOCK_TASK_MODE_PINNED) { - getLockTaskNotify().showPinningStartToast(); + getStatusBarService().showPinningEnterExitToast(true /* entering */); } mLockTaskModeState = lockTaskModeState; setStatusBarState(lockTaskModeState, userId); @@ -835,15 +832,6 @@ public class LockTaskController { return mTelecomManager; } - // Should only be called on the handler thread - @NonNull - private LockTaskNotify getLockTaskNotify() { - if (mLockTaskNotify == null) { - mLockTaskNotify = new LockTaskNotify(mContext); - } - return mLockTaskNotify; - } - public void dump(PrintWriter pw, String prefix) { pw.println(prefix + "LockTaskController"); prefix = prefix + " "; diff --git a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java index 3bb3d1fdd032..5af19eca5034 100644 --- a/services/core/java/com/android/server/broadcastradio/hal2/Convert.java +++ b/services/core/java/com/android/server/broadcastradio/hal2/Convert.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.hardware.broadcastradio.V2_0.AmFmBandRange; import android.hardware.broadcastradio.V2_0.AmFmRegionConfig; import android.hardware.broadcastradio.V2_0.Announcement; +import android.hardware.broadcastradio.V2_0.DabTableEntry; import android.hardware.broadcastradio.V2_0.IdentifierType; import android.hardware.broadcastradio.V2_0.ProgramFilter; import android.hardware.broadcastradio.V2_0.ProgramIdentifier; @@ -196,9 +197,15 @@ class Convert { return bands.toArray(new RadioManager.BandDescriptor[bands.size()]); } + private static @Nullable Map<String, Integer> dabConfigFromHal( + @Nullable List<DabTableEntry> config) { + if (config == null) return null; + return config.stream().collect(Collectors.toMap(e -> e.label, e -> e.frequency)); + } + static @NonNull RadioManager.ModuleProperties propertiesFromHal(int id, @NonNull String serviceName, @NonNull Properties prop, - @Nullable AmFmRegionConfig amfmConfig) { + @Nullable AmFmRegionConfig amfmConfig, @Nullable List<DabTableEntry> dabConfig) { Objects.requireNonNull(serviceName); Objects.requireNonNull(prop); @@ -228,6 +235,7 @@ class Convert { true, // isBgScanSupported is deprecated supportedProgramTypes, supportedIdentifierTypes, + dabConfigFromHal(dabConfig), vendorInfoFromHal(prop.vendorInfo) ); } diff --git a/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java index 50f032d659b7..daec97a0a166 100644 --- a/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java +++ b/services/core/java/com/android/server/broadcastradio/hal2/RadioModule.java @@ -24,6 +24,7 @@ import android.hardware.radio.ITuner; import android.hardware.radio.RadioManager; import android.hardware.broadcastradio.V2_0.AmFmRegionConfig; import android.hardware.broadcastradio.V2_0.Announcement; +import android.hardware.broadcastradio.V2_0.DabTableEntry; import android.hardware.broadcastradio.V2_0.IAnnouncementListener; import android.hardware.broadcastradio.V2_0.IBroadcastRadio; import android.hardware.broadcastradio.V2_0.ICloseHandle; @@ -58,12 +59,17 @@ class RadioModule { if (service == null) return null; Mutable<AmFmRegionConfig> amfmConfig = new Mutable<>(); - service.getAmFmRegionConfig(false, (int result, AmFmRegionConfig config) -> { + service.getAmFmRegionConfig(false, (result, config) -> { if (result == Result.OK) amfmConfig.value = config; }); - RadioManager.ModuleProperties prop = - Convert.propertiesFromHal(idx, fqName, service.getProperties(), amfmConfig.value); + Mutable<List<DabTableEntry>> dabConfig = new Mutable<>(); + service.getDabRegionConfig((result, config) -> { + if (result == Result.OK) dabConfig.value = config; + }); + + RadioManager.ModuleProperties prop = Convert.propertiesFromHal(idx, fqName, + service.getProperties(), amfmConfig.value, dabConfig.value); return new RadioModule(service, prop); } catch (RemoteException ex) { diff --git a/services/core/java/com/android/server/connectivity/OWNERS b/services/core/java/com/android/server/connectivity/OWNERS index 6f77e04da3c0..ce50558bf4f6 100644 --- a/services/core/java/com/android/server/connectivity/OWNERS +++ b/services/core/java/com/android/server/connectivity/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com lorenzo@google.com satk@google.com diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 6280edb87a02..1ee0548a5bf7 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -48,8 +48,8 @@ import android.os.Bundle; import android.os.FactoryTest; import android.os.IBinder; import android.os.Parcel; +import android.os.Process; import android.os.RemoteException; -import android.os.SystemProperties; import android.os.UserHandle; import android.text.TextUtils; import android.util.ArrayMap; @@ -446,7 +446,7 @@ public final class ContentService extends IContentService.Stub { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.scheduleLocalSync(null /* all accounts */, callingUserHandle, uid, - uri.getAuthority()); + uri.getAuthority(), /*isAppStandbyExempted=*/ isUidInForeground(uid)); } } @@ -502,6 +502,9 @@ public final class ContentService extends IContentService.Stub { int userId = UserHandle.getCallingUserId(); int uId = Binder.getCallingUid(); + validateExtras(uId, extras); + final boolean isForegroundSyncRequest = isForegroundSyncRequest(uId, extras); + // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. long identityToken = clearCallingIdentity(); @@ -509,7 +512,8 @@ public final class ContentService extends IContentService.Stub { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.scheduleSync(account, userId, uId, authority, extras, - SyncStorageEngine.AuthorityInfo.UNDEFINED); + SyncStorageEngine.AuthorityInfo.UNDEFINED, + /*isAppStandbyExempted=*/ isForegroundSyncRequest); } } finally { restoreCallingIdentity(identityToken); @@ -548,6 +552,12 @@ public final class ContentService extends IContentService.Stub { public void syncAsUser(SyncRequest request, int userId) { enforceCrossUserPermission(userId, "no permission to request sync as user: " + userId); int callerUid = Binder.getCallingUid(); + + final Bundle extras = request.getBundle(); + + validateExtras(callerUid, extras); + final boolean isForegroundSyncRequest = isForegroundSyncRequest(callerUid, extras); + // This makes it so that future permission checks will be in the context of this // process rather than the caller's process. We will restore this before returning. long identityToken = clearCallingIdentity(); @@ -556,8 +566,6 @@ public final class ContentService extends IContentService.Stub { if (syncManager == null) { return; } - - Bundle extras = request.getBundle(); long flextime = request.getSyncFlexTime(); long runAtTime = request.getSyncRunTime(); if (request.isPeriodic()) { @@ -575,7 +583,8 @@ public final class ContentService extends IContentService.Stub { } else { syncManager.scheduleSync( request.getAccount(), userId, callerUid, request.getProvider(), extras, - SyncStorageEngine.AuthorityInfo.UNDEFINED); + SyncStorageEngine.AuthorityInfo.UNDEFINED, + /*isAppStandbyExempted=*/ isForegroundSyncRequest); } } finally { restoreCallingIdentity(identityToken); @@ -649,10 +658,13 @@ public final class ContentService extends IContentService.Stub { "no permission to write the sync settings"); } + Bundle extras = new Bundle(request.getBundle()); + validateExtras(callingUid, extras); + long identityToken = clearCallingIdentity(); try { SyncStorageEngine.EndPoint info; - Bundle extras = new Bundle(request.getBundle()); + Account account = request.getAccount(); String provider = request.getProvider(); info = new SyncStorageEngine.EndPoint(account, provider, userId); @@ -787,6 +799,8 @@ public final class ContentService extends IContentService.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); + validateExtras(Binder.getCallingUid(), extras); + int userId = UserHandle.getCallingUserId(); pollFrequency = clampPeriod(pollFrequency); @@ -815,6 +829,8 @@ public final class ContentService extends IContentService.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); + validateExtras(Binder.getCallingUid(), extras); + final int callingUid = Binder.getCallingUid(); int userId = UserHandle.getCallingUserId(); @@ -1239,6 +1255,56 @@ public final class ContentService extends IContentService.Stub { return SyncStorageEngine.AuthorityInfo.UNDEFINED; } + private void validateExtras(int callingUid, Bundle extras) { + if (extras.containsKey(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC) + || extras.containsKey(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC) + ) { + switch (callingUid) { + case Process.ROOT_UID: + case Process.SHELL_UID: + case Process.SYSTEM_UID: + break; // Okay + default: + throw new SecurityException("Invalid extras specified."); + } + } + } + + private boolean isForegroundSyncRequest(int callingUid, Bundle extras) { + final boolean isForegroundRequest; + if (extras.getBoolean(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC)) { + isForegroundRequest = true; + } else if (extras.getBoolean(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC)) { + isForegroundRequest = false; + } else { + isForegroundRequest = isUidInForeground(callingUid); + } + extras.remove(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC); + extras.remove(ContentResolver.SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC); + + return isForegroundRequest; + } + + private boolean isUidInForeground(int uid) { + // If the caller is ADB, we assume it's a background request by default, because + // that's also the default of requests from the requestsync command. + // The requestsync command will always set either SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC or + // SYNC_VIRTUAL_EXTRAS_FORCE_BG_SYNC (for non-periodic sync requests), + // so it shouldn't matter in practice. + switch (uid) { + case Process.SHELL_UID: + case Process.ROOT_UID: + return false; + } + final ActivityManagerInternal ami = + LocalServices.getService(ActivityManagerInternal.class); + if (ami != null) { + return ami.getUidProcessState(uid) + <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; + } + return false; + } + /** * Hide this class since it is not part of api, * but current unittest framework requires it to be public diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 422d0cbe5594..de17ec782be4 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -576,9 +576,10 @@ public class SyncManager { mSyncStorageEngine = SyncStorageEngine.getSingleton(); mSyncStorageEngine.setOnSyncRequestListener(new OnSyncRequestListener() { @Override - public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras) { + public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras, + boolean isAppStandbyExempted) { scheduleSync(info.account, info.userId, reason, info.provider, extras, - AuthorityInfo.UNDEFINED); + AuthorityInfo.UNDEFINED, isAppStandbyExempted); } }); @@ -608,7 +609,8 @@ public class SyncManager { if (!removed) { scheduleSync(null, UserHandle.USER_ALL, SyncOperation.REASON_SERVICE_CHANGED, - type.authority, null, AuthorityInfo.UNDEFINED); + type.authority, null, AuthorityInfo.UNDEFINED, + /*isAppStandbyExempted=*/ false); } } }, mSyncHandler); @@ -656,7 +658,8 @@ public class SyncManager { if (mAccountManagerInternal.hasAccountAccess(account, uid)) { scheduleSync(account, UserHandle.getUserId(uid), SyncOperation.REASON_ACCOUNTS_UPDATED, - null, null, AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS); + null, null, AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS, + /*isAppStandbyExempted=*/ false); } }); @@ -881,17 +884,19 @@ public class SyncManager { * Use {@link AuthorityInfo#UNDEFINED} to sync all authorities. */ public void scheduleSync(Account requestedAccount, int userId, int reason, - String requestedAuthority, Bundle extras, int targetSyncState) { + String requestedAuthority, Bundle extras, int targetSyncState, + boolean isAppStandbyExempted) { scheduleSync(requestedAccount, userId, reason, requestedAuthority, extras, targetSyncState, - 0 /* min delay */, true /* checkIfAccountReady */); + 0 /* min delay */, true /* checkIfAccountReady */, isAppStandbyExempted); } /** * @param minDelayMillis The sync can't land before this delay expires. */ private void scheduleSync(Account requestedAccount, int userId, int reason, - String requestedAuthority, Bundle extras, int targetSyncState, - final long minDelayMillis, boolean checkIfAccountReady) { + String requestedAuthority, Bundle extras, int targetSyncState, + final long minDelayMillis, boolean checkIfAccountReady, + boolean isAppStandbyExempted) { final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE); if (extras == null) { extras = new Bundle(); @@ -1009,7 +1014,8 @@ public class SyncManager { && result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) { scheduleSync(account.account, userId, reason, authority, finalExtras, targetSyncState, minDelayMillis, - true /* checkIfAccountReady */); + true /* checkIfAccountReady */, + isAppStandbyExempted); } } )); @@ -1060,7 +1066,7 @@ public class SyncManager { sendOnUnsyncableAccount(mContext, syncAdapterInfo, account.userId, () -> scheduleSync(account.account, account.userId, reason, authority, finalExtras, targetSyncState, minDelayMillis, - false)); + false, isAppStandbyExempted)); } else { // Initialisation sync. Bundle newExtras = new Bundle(); @@ -1078,7 +1084,8 @@ public class SyncManager { postScheduleSyncMessage( new SyncOperation(account.account, account.userId, owningUid, owningPackage, reason, source, - authority, newExtras, allowParallelSyncs), + authority, newExtras, allowParallelSyncs, + isAppStandbyExempted), minDelayMillis ); } @@ -1095,7 +1102,7 @@ public class SyncManager { postScheduleSyncMessage( new SyncOperation(account.account, account.userId, owningUid, owningPackage, reason, source, - authority, extras, allowParallelSyncs), + authority, extras, allowParallelSyncs, isAppStandbyExempted), minDelayMillis ); } @@ -1208,11 +1215,13 @@ public class SyncManager { * Schedule sync based on local changes to a provider. We wait for at least LOCAL_SYNC_DELAY * ms to batch syncs. */ - public void scheduleLocalSync(Account account, int userId, int reason, String authority) { + public void scheduleLocalSync(Account account, int userId, int reason, String authority, + boolean isAppStandbyExempted) { final Bundle extras = new Bundle(); extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); scheduleSync(account, userId, reason, authority, extras, - AuthorityInfo.UNDEFINED, LOCAL_SYNC_DELAY, true /* checkIfAccountReady */); + AuthorityInfo.UNDEFINED, LOCAL_SYNC_DELAY, true /* checkIfAccountReady */, + isAppStandbyExempted); } public SyncAdapterType[] getSyncAdapterTypes(int userId) { @@ -1480,7 +1489,11 @@ public class SyncManager { } // Check if duplicate syncs are pending. If found, keep one with least expected run time. + + // If any of the duplicate ones has exemption, then we inherit it. if (!syncOperation.isPeriodic) { + boolean inheritAppStandbyExemption = false; + // Check currently running syncs for (ActiveSyncContext asc: mActiveSyncContexts) { if (asc.mSyncOperation.key.equals(syncOperation.key)) { @@ -1496,14 +1509,14 @@ public class SyncManager { long now = SystemClock.elapsedRealtime(); syncOperation.expectedRuntime = now + minDelay; List<SyncOperation> pending = getAllPendingSyncs(); - SyncOperation opWithLeastExpectedRuntime = syncOperation; + SyncOperation syncToRun = syncOperation; for (SyncOperation op : pending) { if (op.isPeriodic) { continue; } if (op.key.equals(syncOperation.key)) { - if (opWithLeastExpectedRuntime.expectedRuntime > op.expectedRuntime) { - opWithLeastExpectedRuntime = op; + if (syncToRun.expectedRuntime > op.expectedRuntime) { + syncToRun = op; } duplicatesCount++; } @@ -1511,26 +1524,54 @@ public class SyncManager { if (duplicatesCount > 1) { Slog.e(TAG, "FATAL ERROR! File a bug if you see this."); } + + if (syncOperation != syncToRun) { + // If there's a duplicate with an earlier run time that's not exempted, + // and if the current operation is exempted with no minDelay, + // cancel the duplicate one and keep the current one. + // + // This means the duplicate one has a negative expected run time, but it hasn't + // been executed possibly because of app-standby. + + if (syncOperation.isAppStandbyExempted + && (minDelay == 0) + && !syncToRun.isAppStandbyExempted) { + syncToRun = syncOperation; + } + } + + // Cancel all other duplicate syncs. for (SyncOperation op : pending) { if (op.isPeriodic) { continue; } if (op.key.equals(syncOperation.key)) { - if (op != opWithLeastExpectedRuntime) { + if (op != syncToRun) { if (isLoggable) { Slog.v(TAG, "Cancelling duplicate sync " + op); } + if (op.isAppStandbyExempted) { + inheritAppStandbyExemption = true; + } cancelJob(op, "scheduleSyncOperationH-duplicate"); } } } - if (opWithLeastExpectedRuntime != syncOperation) { + if (syncToRun != syncOperation) { // Don't schedule because a duplicate sync with earlier expected runtime exists. if (isLoggable) { Slog.v(TAG, "Not scheduling because a duplicate exists."); } + + // TODO Should we give the winning one SYNC_EXTRAS_APP_STANDBY_EXEMPTED + // if the current one has it? return; } + + // If any of the duplicates had exemption, we exempt the current one. + if (inheritAppStandbyExemption) { + syncOperation.isAppStandbyExempted = true; + } } // Syncs that are re-scheduled shouldn't get a new job id. @@ -1547,12 +1588,18 @@ public class SyncManager { final int networkType = syncOperation.isNotAllowedOnMetered() ? JobInfo.NETWORK_TYPE_UNMETERED : JobInfo.NETWORK_TYPE_ANY; + // Note this logic means when an exempted sync fails, + // the back-off one will inherit it too, and will be exempted from app-standby. + final int jobFlags = syncOperation.isAppStandbyExempted + ? JobInfo.FLAG_EXEMPT_FROM_APP_STANDBY : 0; + JobInfo.Builder b = new JobInfo.Builder(syncOperation.jobId, new ComponentName(mContext, SyncJobService.class)) .setExtras(syncOperation.toJobInfoExtras()) .setRequiredNetworkType(networkType) .setPersisted(true) - .setPriority(priority); + .setPriority(priority) + .setFlags(jobFlags); if (syncOperation.isPeriodic) { b.setPeriodic(syncOperation.periodMillis, syncOperation.flexMillis); @@ -1683,12 +1730,12 @@ public class SyncManager { EndPoint target = new EndPoint(null, null, userId); updateRunningAccounts(target); - // Schedule sync for any accounts under started user. + // Schedule sync for any accounts under started user, but only the NOT_INITIALIZED adapters. final Account[] accounts = AccountManagerService.getSingleton().getAccounts(userId, mContext.getOpPackageName()); for (Account account : accounts) { scheduleSync(account, userId, SyncOperation.REASON_USER_START, null, null, - AuthorityInfo.NOT_INITIALIZED); + AuthorityInfo.NOT_INITIALIZED, /*isAppStandbyExempted=*/ false); } } @@ -3144,7 +3191,8 @@ public class SyncManager { if (syncTargets != null) { scheduleSync(syncTargets.account, syncTargets.userId, SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider, - null, AuthorityInfo.NOT_INITIALIZED); + null, AuthorityInfo.NOT_INITIALIZED, + /*isAppStandbyExempted=*/ false); } } @@ -3211,7 +3259,7 @@ public class SyncManager { syncAdapterInfo.componentName.getPackageName(), SyncOperation.REASON_PERIODIC, SyncStorageEngine.SOURCE_PERIODIC, extras, syncAdapterInfo.type.allowParallelSyncs(), true, SyncOperation.NO_JOB_ID, - pollFrequencyMillis, flexMillis); + pollFrequencyMillis, flexMillis, /*isAppStandbyExempted=*/ false); final int syncOpState = computeSyncOpState(op); switch (syncOpState) { @@ -3590,7 +3638,8 @@ public class SyncManager { syncOperation.owningUid, syncOperation.owningPackage, syncOperation.reason, syncOperation.syncSource, info.provider, new Bundle(), - syncOperation.allowParallelSyncs)); + syncOperation.allowParallelSyncs, + syncOperation.isAppStandbyExempted)); } } @@ -3808,6 +3857,10 @@ public class SyncManager { if (key.equals(ContentResolver.SYNC_EXTRAS_INITIALIZE)) { return true; } +// if (key.equals(ContentResolver.SYNC_EXTRAS_APP_STANDBY_EXEMPTED)) { +// return true; +// } + // No need to check virtual flags such as SYNC_VIRTUAL_EXTRAS_FORCE_FG_SYNC. return false; } diff --git a/services/core/java/com/android/server/content/SyncOperation.java b/services/core/java/com/android/server/content/SyncOperation.java index 7d2cc0035847..f6b481920faf 100644 --- a/services/core/java/com/android/server/content/SyncOperation.java +++ b/services/core/java/com/android/server/content/SyncOperation.java @@ -98,29 +98,33 @@ public class SyncOperation { /** jobId of the JobScheduler job corresponding to this sync */ public int jobId; + /** Whether this operation should be exempted from the app-standby throttling. */ + public boolean isAppStandbyExempted; + public SyncOperation(Account account, int userId, int owningUid, String owningPackage, int reason, int source, String provider, Bundle extras, - boolean allowParallelSyncs) { + boolean allowParallelSyncs, boolean isAppStandbyExempted) { this(new SyncStorageEngine.EndPoint(account, provider, userId), owningUid, owningPackage, - reason, source, extras, allowParallelSyncs); + reason, source, extras, allowParallelSyncs, isAppStandbyExempted); } private SyncOperation(SyncStorageEngine.EndPoint info, int owningUid, String owningPackage, - int reason, int source, Bundle extras, boolean allowParallelSyncs) { + int reason, int source, Bundle extras, boolean allowParallelSyncs, + boolean isAppStandbyExempted) { this(info, owningUid, owningPackage, reason, source, extras, allowParallelSyncs, false, - NO_JOB_ID, 0, 0); + NO_JOB_ID, 0, 0, isAppStandbyExempted); } public SyncOperation(SyncOperation op, long periodMillis, long flexMillis) { this(op.target, op.owningUid, op.owningPackage, op.reason, op.syncSource, new Bundle(op.extras), op.allowParallelSyncs, op.isPeriodic, op.sourcePeriodicId, - periodMillis, flexMillis); + periodMillis, flexMillis, /*isAppStandbyExempted=*/ false); } public SyncOperation(SyncStorageEngine.EndPoint info, int owningUid, String owningPackage, int reason, int source, Bundle extras, boolean allowParallelSyncs, boolean isPeriodic, int sourcePeriodicId, long periodMillis, - long flexMillis) { + long flexMillis, boolean isAppStandbyExempted) { this.target = info; this.owningUid = owningUid; this.owningPackage = owningPackage; @@ -134,6 +138,7 @@ public class SyncOperation { this.flexMillis = flexMillis; this.jobId = NO_JOB_ID; this.key = toKey(); + this.isAppStandbyExempted = isAppStandbyExempted; } /* Get a one off sync operation instance from a periodic sync. */ @@ -143,7 +148,7 @@ public class SyncOperation { } SyncOperation op = new SyncOperation(target, owningUid, owningPackage, reason, syncSource, new Bundle(extras), allowParallelSyncs, false, jobId /* sourcePeriodicId */, - periodMillis, flexMillis); + periodMillis, flexMillis, /*isAppStandbyExempted=*/ false); return op; } @@ -161,6 +166,7 @@ public class SyncOperation { periodMillis = other.periodMillis; flexMillis = other.flexMillis; this.key = other.key; + isAppStandbyExempted = other.isAppStandbyExempted; } /** @@ -229,6 +235,7 @@ public class SyncOperation { jobInfoExtras.putLong("flexMillis", flexMillis); jobInfoExtras.putLong("expectedRuntime", expectedRuntime); jobInfoExtras.putInt("retries", retries); + jobInfoExtras.putBoolean("isAppStandbyExempted", isAppStandbyExempted); return jobInfoExtras; } @@ -249,6 +256,7 @@ public class SyncOperation { Bundle extras; boolean allowParallelSyncs, isPeriodic; long periodMillis, flexMillis; + boolean isAppStandbyExempted; if (!jobExtras.getBoolean("SyncManagerJob", false)) { return null; @@ -267,6 +275,7 @@ public class SyncOperation { initiatedBy = jobExtras.getInt("sourcePeriodicId", NO_JOB_ID); periodMillis = jobExtras.getLong("periodMillis"); flexMillis = jobExtras.getLong("flexMillis"); + isAppStandbyExempted = jobExtras.getBoolean("isAppStandbyExempted", false); extras = new Bundle(); PersistableBundle syncExtras = jobExtras.getPersistableBundle("syncExtras"); @@ -288,7 +297,8 @@ public class SyncOperation { SyncStorageEngine.EndPoint target = new SyncStorageEngine.EndPoint(account, provider, userId); SyncOperation op = new SyncOperation(target, owningUid, owningPackage, reason, source, - extras, allowParallelSyncs, isPeriodic, initiatedBy, periodMillis, flexMillis); + extras, allowParallelSyncs, isPeriodic, initiatedBy, periodMillis, flexMillis, + isAppStandbyExempted); op.jobId = jobExtras.getInt("jobId"); op.expectedRuntime = jobExtras.getLong("expectedRuntime"); op.retries = jobExtras.getInt("retries"); @@ -375,6 +385,9 @@ public class SyncOperation { if (extras.getBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false)) { sb.append(" EXPEDITED"); } + if (isAppStandbyExempted) { + sb.append(" STANDBY-EXEMPTED"); + } sb.append(" Reason="); sb.append(reasonToString(pm, reason)); if (isPeriodic) { diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java index 5a37ee235219..8b67b7a27e7e 100644 --- a/services/core/java/com/android/server/content/SyncStorageEngine.java +++ b/services/core/java/com/android/server/content/SyncStorageEngine.java @@ -340,7 +340,8 @@ public class SyncStorageEngine { interface OnSyncRequestListener { /** Called when a sync is needed on an account(s) due to some change in state. */ - public void onSyncRequest(EndPoint info, int reason, Bundle extras); + public void onSyncRequest(EndPoint info, int reason, Bundle extras, + boolean exemptFromAppStandby); } interface PeriodicSyncAddedListener { @@ -675,7 +676,8 @@ public class SyncStorageEngine { if (sync) { requestSync(account, userId, SyncOperation.REASON_SYNC_AUTO, providerName, - new Bundle()); + new Bundle(), + /* exemptFromAppStandby=*/ false); } reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); queueBackup(); @@ -736,7 +738,8 @@ public class SyncStorageEngine { writeAccountInfoLocked(); } if (syncable == AuthorityInfo.SYNCABLE) { - requestSync(aInfo, SyncOperation.REASON_IS_SYNCABLE, new Bundle()); + requestSync(aInfo, SyncOperation.REASON_IS_SYNCABLE, new Bundle(), + /*exemptFromAppStandby=*/ false); // Or the caller FG state? } reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); } @@ -908,7 +911,8 @@ public class SyncStorageEngine { } if (flag) { requestSync(null, userId, SyncOperation.REASON_MASTER_SYNC_AUTO, null, - new Bundle()); + new Bundle(), + /*exemptFromAppStandby=*/ false); // Or the caller FG state? } reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); mContext.sendBroadcast(ContentResolver.ACTION_SYNC_CONN_STATUS_CHANGED); @@ -2138,10 +2142,12 @@ public class SyncStorageEngine { } } - private void requestSync(AuthorityInfo authorityInfo, int reason, Bundle extras) { + private void requestSync(AuthorityInfo authorityInfo, int reason, Bundle extras, + boolean exemptFromAppStandby) { if (android.os.Process.myUid() == android.os.Process.SYSTEM_UID && mSyncRequestListener != null) { - mSyncRequestListener.onSyncRequest(authorityInfo.target, reason, extras); + mSyncRequestListener.onSyncRequest(authorityInfo.target, reason, extras, + exemptFromAppStandby); } else { SyncRequest.Builder req = new SyncRequest.Builder() @@ -2153,7 +2159,7 @@ public class SyncStorageEngine { } private void requestSync(Account account, int userId, int reason, String authority, - Bundle extras) { + Bundle extras, boolean exemptFromAppStandby) { // If this is happening in the system process, then call the syncrequest listener // to make a request back to the SyncManager directly. // If this is probably a test instance, then call back through the ContentResolver @@ -2162,8 +2168,7 @@ public class SyncStorageEngine { && mSyncRequestListener != null) { mSyncRequestListener.onSyncRequest( new EndPoint(account, authority, userId), - reason, - extras); + reason, extras, exemptFromAppStandby); } else { ContentResolver.requestSync(account, authority, extras); } diff --git a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java index 2e4567ac1dff..5eb77000a4f1 100644 --- a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java +++ b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java @@ -92,7 +92,7 @@ public final class BackgroundJobsController extends StateController { jobStatus.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, uid); - pw.print(mForceAppStandbyTracker.isInForeground(uid) ? " foreground" : " background"); + pw.print(mForceAppStandbyTracker.isUidActive(uid) ? " active" : " idle"); if (mForceAppStandbyTracker.isUidPowerSaveWhitelisted(uid) || mForceAppStandbyTracker.isUidTempPowerSaveWhitelisted(uid)) { pw.print(", whitelisted"); @@ -136,7 +136,7 @@ public final class BackgroundJobsController extends StateController { proto.write(TrackedJob.SOURCE_PACKAGE_NAME, sourcePkg); proto.write(TrackedJob.IS_IN_FOREGROUND, - mForceAppStandbyTracker.isInForeground(sourceUid)); + mForceAppStandbyTracker.isUidActive(sourceUid)); proto.write(TrackedJob.IS_WHITELISTED, mForceAppStandbyTracker.isUidPowerSaveWhitelisted(sourceUid) || mForceAppStandbyTracker.isUidTempPowerSaveWhitelisted(sourceUid)); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 28fa86b3a893..e71572483cca 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -383,8 +383,8 @@ public class LockSettingsService extends ILockSettings.Stub { return KeyStore.getInstance(); } - public RecoverableKeyStoreManager getRecoverableKeyStoreManager() { - return RecoverableKeyStoreManager.getInstance(mContext); + public RecoverableKeyStoreManager getRecoverableKeyStoreManager(KeyStore keyStore) { + return RecoverableKeyStoreManager.getInstance(mContext, keyStore); } public IStorageManager getStorageManager() { @@ -413,7 +413,7 @@ public class LockSettingsService extends ILockSettings.Stub { mInjector = injector; mContext = injector.getContext(); mKeyStore = injector.getKeyStore(); - mRecoverableKeyStoreManager = injector.getRecoverableKeyStoreManager(); + mRecoverableKeyStoreManager = injector.getRecoverableKeyStoreManager(mKeyStore); mHandler = injector.getHandler(); mStrongAuth = injector.getStrongAuth(); mActivityManager = injector.getActivityManager(); @@ -1887,7 +1887,7 @@ public class LockSettingsService extends ILockSettings.Stub { mSpManager.removeUser(userId); mStorage.removeUser(userId); mStrongAuth.removeUser(userId); - cleanSpCache(); + tryRemoveUserFromSpCacheLater(userId); final KeyStore ks = KeyStore.getInstance(); ks.onUserRemoved(userId); @@ -2064,6 +2064,16 @@ public class LockSettingsService extends ILockSettings.Stub { return mRecoverableKeyStoreManager.generateAndStoreKey(alias); } + @Override + public String generateKey(@NonNull String alias, byte[] account) throws RemoteException { + return mRecoverableKeyStoreManager.generateKey(alias, account); + } + + @Override + public String getKey(@NonNull String alias) throws RemoteException { + return mRecoverableKeyStoreManager.getKey(alias); + } + private static final String[] VALID_SETTINGS = new String[] { LockPatternUtils.LOCKOUT_PERMANENT_KEY, LockPatternUtils.LOCKOUT_ATTEMPT_DEADLINE, @@ -2141,6 +2151,13 @@ public class LockSettingsService extends ILockSettings.Stub { private SparseArray<AuthenticationToken> mSpCache = new SparseArray(); private void onAuthTokenKnownForUser(@UserIdInt int userId, AuthenticationToken auth) { + // Preemptively cache the SP and then try to remove it in a handler. + Slog.i(TAG, "Caching SP for user " + userId); + synchronized (mSpManager) { + mSpCache.put(userId, auth); + } + tryRemoveUserFromSpCacheLater(userId); + // Pass the primary user's auth secret to the HAL if (mAuthSecretService != null && mUserManager.getUserInfo(userId).isPrimary()) { try { @@ -2154,33 +2171,25 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.w(TAG, "Failed to pass primary user secret to AuthSecret HAL", e); } } - - // Update the SP cache, removing the entry when allowed - synchronized (mSpManager) { - if (shouldCacheSpForUser(userId)) { - Slog.i(TAG, "Caching SP for user " + userId); - mSpCache.put(userId, auth); - } else { - Slog.i(TAG, "Not caching SP for user " + userId); - mSpCache.delete(userId); - } - } } - /** Clean up the SP cache by removing unneeded entries. */ - private void cleanSpCache() { - synchronized (mSpManager) { - // Preserve indicies after removal by iterating backwards - for (int i = mSpCache.size() - 1; i >= 0; --i) { - final int userId = mSpCache.keyAt(i); - if (!shouldCacheSpForUser(userId)) { - Slog.i(TAG, "Uncaching SP for user " + userId); - mSpCache.removeAt(i); + private void tryRemoveUserFromSpCacheLater(@UserIdInt int userId) { + mHandler.post(() -> { + if (!shouldCacheSpForUser(userId)) { + // The transition from 'should not cache' to 'should cache' can only happen if + // certain admin apps are installed after provisioning e.g. via adb. This is not + // a common case and we do not seamlessly support; it may result in the SP not + // being cached when it is needed. The cache can be re-populated by verifying + // the credential again. + Slog.i(TAG, "Removing SP from cache for user " + userId); + synchronized (mSpManager) { + mSpCache.remove(userId); } } - } + }); } + /** Do not hold any of the locks from this service when calling. */ private boolean shouldCacheSpForUser(@UserIdInt int userId) { // Before the user setup has completed, an admin could be installed that requires the SP to // be cached (see below). @@ -2731,7 +2740,7 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override - public void onChange(boolean selfChange, Uri uri) { + public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) { if (mDeviceProvisionedUri.equals(uri)) { updateRegistration(); @@ -2741,7 +2750,7 @@ public class LockSettingsService extends ILockSettings.Stub { clearFrpCredentialIfOwnerNotSecure(); } } else if (mUserSetupCompleteUri.equals(uri)) { - cleanSpCache(); + tryRemoveUserFromSpCacheLater(userId); } } diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl.java index 59132da7d4c7..285e722886c2 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeyStoreProxyImpl.java @@ -16,10 +16,13 @@ package com.android.server.locksettings.recoverablekeystore; +import java.io.IOException; +import java.security.cert.CertificateException; import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; +import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; /** @@ -27,6 +30,7 @@ import java.security.UnrecoverableKeyException; */ public class KeyStoreProxyImpl implements KeyStoreProxy { + private static final String ANDROID_KEY_STORE_PROVIDER = "AndroidKeyStore"; private final KeyStore mKeyStore; /** @@ -57,4 +61,21 @@ public class KeyStoreProxyImpl implements KeyStoreProxy { public void deleteEntry(String alias) throws KeyStoreException { mKeyStore.deleteEntry(alias); } + + /** + * Returns AndroidKeyStore-provided {@link KeyStore}, having already invoked + * {@link KeyStore#load(KeyStore.LoadStoreParameter)}. + * + * @throws KeyStoreException if there was a problem getting or initializing the key store. + */ + public static KeyStore getAndLoadAndroidKeyStore() throws KeyStoreException { + KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE_PROVIDER); + try { + keyStore.load(/*param=*/ null); + } catch (CertificateException | IOException | NoSuchAlgorithmException e) { + // Should never happen. + throw new KeyStoreException("Unable to load keystore.", e); + } + return keyStore; + } } diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java index ec72b221931f..fda6cdf33e0c 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java @@ -37,21 +37,23 @@ import android.security.keystore.recovery.KeyChainProtectionParams; import android.security.keystore.recovery.KeyChainSnapshot; import android.security.keystore.recovery.RecoveryController; import android.security.keystore.recovery.WrappedApplicationKey; +import android.security.KeyStore; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.HexDump; +import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage; import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb; import com.android.server.locksettings.recoverablekeystore.storage.RecoverySessionStorage; import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage; import java.security.InvalidKeyException; -import java.security.KeyStoreException; import java.security.KeyFactory; +import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.PublicKey; -import java.security.UnrecoverableKeyException; import java.security.spec.InvalidKeySpecException; +import java.security.UnrecoverableKeyException; import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; import java.util.HashMap; @@ -82,18 +84,23 @@ public class RecoverableKeyStoreManager { private final RecoverableKeyGenerator mRecoverableKeyGenerator; private final RecoverySnapshotStorage mSnapshotStorage; private final PlatformKeyManager mPlatformKeyManager; + private final KeyStore mKeyStore; + private final ApplicationKeyStorage mApplicationKeyStorage; /** * Returns a new or existing instance. * * @hide */ - public static synchronized RecoverableKeyStoreManager getInstance(Context context) { + public static synchronized RecoverableKeyStoreManager + getInstance(Context context, KeyStore keystore) { if (mInstance == null) { RecoverableKeyStoreDb db = RecoverableKeyStoreDb.newInstance(context); PlatformKeyManager platformKeyManager; + ApplicationKeyStorage applicationKeyStorage; try { platformKeyManager = PlatformKeyManager.getInstance(context, db); + applicationKeyStorage = ApplicationKeyStorage.getInstance(keystore); } catch (NoSuchAlgorithmException e) { // Impossible: all algorithms must be supported by AOSP throw new RuntimeException(e); @@ -103,12 +110,14 @@ public class RecoverableKeyStoreManager { mInstance = new RecoverableKeyStoreManager( context.getApplicationContext(), + keystore, db, new RecoverySessionStorage(), Executors.newSingleThreadExecutor(), new RecoverySnapshotStorage(), new RecoverySnapshotListenersStorage(), - platformKeyManager); + platformKeyManager, + applicationKeyStorage); } return mInstance; } @@ -116,19 +125,23 @@ public class RecoverableKeyStoreManager { @VisibleForTesting RecoverableKeyStoreManager( Context context, + KeyStore keystore, RecoverableKeyStoreDb recoverableKeyStoreDb, RecoverySessionStorage recoverySessionStorage, ExecutorService executorService, RecoverySnapshotStorage snapshotStorage, RecoverySnapshotListenersStorage listenersStorage, - PlatformKeyManager platformKeyManager) { + PlatformKeyManager platformKeyManager, + ApplicationKeyStorage applicationKeyStorage) { mContext = context; + mKeyStore = keystore; mDatabase = recoverableKeyStoreDb; mRecoverySessionStorage = recoverySessionStorage; mExecutorService = executorService; mListenersStorage = listenersStorage; mSnapshotStorage = snapshotStorage; mPlatformKeyManager = platformKeyManager; + mApplicationKeyStorage = applicationKeyStorage; try { mRecoverableKeyGenerator = RecoverableKeyGenerator.newInstance(mDatabase); @@ -406,6 +419,7 @@ public class RecoverableKeyStoreManager { } /** + * Deprecated * Generates a key named {@code alias} in the recoverable store for the calling uid. Then * returns the raw key material. * @@ -450,9 +464,55 @@ public class RecoverableKeyStoreManager { boolean wasRemoved = mDatabase.removeKey(uid, alias); if (wasRemoved) { mDatabase.setShouldCreateSnapshot(userId, uid, true); + mApplicationKeyStorage.deleteEntry(userId, uid, alias); } } + /** + * Generates a key named {@code alias} in caller's namespace. + * The key is stored in system service keystore namespace. + * + * @return grant alias, which caller can use to access the key. + */ + public String generateKey(@NonNull String alias, byte[] account) throws RemoteException { + int uid = Binder.getCallingUid(); + int userId = UserHandle.getCallingUserId(); + + PlatformEncryptionKey encryptionKey; + try { + encryptionKey = mPlatformKeyManager.getEncryptKey(userId); + } catch (NoSuchAlgorithmException e) { + // Impossible: all algorithms must be supported by AOSP + throw new RuntimeException(e); + } catch (KeyStoreException | UnrecoverableKeyException e) { + throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage()); + } catch (InsecureUserException e) { + throw new ServiceSpecificException(ERROR_INSECURE_USER, e.getMessage()); + } + + try { + byte[] secretKey = + mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias); + mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey); + String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias); + return grantAlias; + } catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) { + throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage()); + } + } + + /** + * Gets a key named {@code alias} in caller's namespace. + * + * @return grant alias, which caller can use to access the key. + */ + public String getKey(@NonNull String alias) throws RemoteException { + int uid = Binder.getCallingUid(); + int userId = UserHandle.getCallingUserId(); + String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias); + return grantAlias; + } + private byte[] decryptRecoveryKey( RecoverySessionStorage.Entry sessionEntry, byte[] encryptedClaimResponse) throws RemoteException, ServiceSpecificException { diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java new file mode 100644 index 000000000000..600a534facf9 --- /dev/null +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/ApplicationKeyStorage.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2017 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.locksettings.recoverablekeystore.storage; + +import static android.security.keystore.RecoveryController.ERROR_SERVICE_INTERNAL_ERROR; + +import android.annotation.Nullable; +import android.os.ServiceSpecificException; +import android.security.Credentials; +import android.security.keystore.KeyGenParameterSpec; +import android.security.keystore.KeyProperties; +import android.security.keystore.KeyProtection; +import android.security.keystore.recovery.KeyChainSnapshot; +import android.security.KeyStore; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.locksettings.recoverablekeystore.KeyStoreProxy; +import com.android.server.locksettings.recoverablekeystore.KeyStoreProxyImpl; + +import java.security.KeyStore.SecretKeyEntry; +import java.security.KeyStoreException; +import javax.crypto.spec.SecretKeySpec; + +/** + * Storage for Application keys in LockSettings service KeyStore namespace. + * + * <p> Uses KeyStore's grant mechanism to make keys usable by application process without + * revealing key material + */ +public class ApplicationKeyStorage { + private static final String APPLICATION_KEY_ALIAS_PREFIX = + "com.android.server.locksettings.recoverablekeystore/application/"; + + KeyStoreProxy mKeyStore; + KeyStore mKeystoreService; + + public static ApplicationKeyStorage getInstance(KeyStore keystoreService) + throws KeyStoreException { + return new ApplicationKeyStorage( + new KeyStoreProxyImpl(KeyStoreProxyImpl.getAndLoadAndroidKeyStore()), + keystoreService); + } + + @VisibleForTesting + ApplicationKeyStorage(KeyStoreProxy keyStore, KeyStore keystoreService) { + mKeyStore = keyStore; + mKeystoreService = keystoreService; + } + + /** + * Returns grant alias, valid in Applications namespace. + */ + public @Nullable String getGrantAlias(int userId, int uid, String alias) { + // Aliases used by {@link KeyStore} are different than used by public API. + // {@code USER_PRIVATE_KEY} prefix is used secret keys. + String keystoreAlias = Credentials.USER_PRIVATE_KEY + getInternalAlias(userId, uid, alias); + return mKeystoreService.grant(keystoreAlias, uid); + } + + public void setSymmetricKeyEntry(int userId, int uid, String alias, byte[] secretKey) + throws KeyStoreException { + try { + mKeyStore.setEntry( + getInternalAlias(userId, uid, alias), + new SecretKeyEntry( + new SecretKeySpec(secretKey, KeyProperties.KEY_ALGORITHM_AES)), + new KeyProtection.Builder( + KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_GCM) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .build()); + } catch (KeyStoreException e) { + throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage()); + } + } + + public void deleteEntry(int userId, int uid, String alias) { + try { + mKeyStore.deleteEntry(getInternalAlias(userId, uid, alias)); + } catch (KeyStoreException e) { + throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage()); + } + } + + /** + * Returns the alias in locksettins service's KeyStore namespace used for given application key. + * + * <p>These IDs look as follows: + * {@code com.security.recoverablekeystore/application/<userId>/<uid>/<alias>} + * + * @param userId The ID of the user + * @param uid The uid + * @param alias - alias in application's namespace + * @return The alias. + */ + private String getInternalAlias(int userId, int uid, String alias) { + return APPLICATION_KEY_ALIAS_PREFIX + userId + "/" + uid + "/" + alias; + } +} diff --git a/services/core/java/com/android/server/net/IpConfigStore.java b/services/core/java/com/android/server/net/IpConfigStore.java index 4d56468f2fe6..e3e02e32ad50 100644 --- a/services/core/java/com/android/server/net/IpConfigStore.java +++ b/services/core/java/com/android/server/net/IpConfigStore.java @@ -24,11 +24,11 @@ import android.net.NetworkUtils; import android.net.ProxyInfo; import android.net.RouteInfo; import android.net.StaticIpConfiguration; +import android.util.ArrayMap; import android.util.Log; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.net.DelayedDiskWrite; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -38,8 +38,8 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.InetAddress; import java.net.Inet4Address; +import java.net.InetAddress; public class IpConfigStore { private static final String TAG = "IpConfigStore"; @@ -60,7 +60,7 @@ public class IpConfigStore { protected static final String EXCLUSION_LIST_KEY = "exclusionList"; protected static final String EOS = "eos"; - protected static final int IPCONFIG_FILE_VERSION = 2; + protected static final int IPCONFIG_FILE_VERSION = 3; public IpConfigStore(DelayedDiskWrite writer) { mWriter = writer; @@ -70,9 +70,14 @@ public class IpConfigStore { this(new DelayedDiskWrite()); } + private static boolean writeConfig(DataOutputStream out, String configKey, + IpConfiguration config) throws IOException { + return writeConfig(out, configKey, config, IPCONFIG_FILE_VERSION); + } + @VisibleForTesting - public static boolean writeConfig(DataOutputStream out, int configKey, - IpConfiguration config) throws IOException { + public static boolean writeConfig(DataOutputStream out, String configKey, + IpConfiguration config, int version) throws IOException { boolean written = false; try { @@ -153,7 +158,11 @@ public class IpConfigStore { if (written) { out.writeUTF(ID_KEY); - out.writeInt(configKey); + if (version < 3) { + out.writeInt(Integer.valueOf(configKey)); + } else { + out.writeUTF(configKey); + } } } catch (NullPointerException e) { loge("Failure in writing " + config + e); @@ -163,18 +172,47 @@ public class IpConfigStore { return written; } - public void writeIpAndProxyConfigurations(String filePath, + /** + * @Deprecated use {@link #writeIpConfigurations(String, ArrayMap)} instead. + * New method uses string as network identifier which could be interface name or MAC address or + * other token. + */ + @Deprecated + public void writeIpAndProxyConfigurationsToFile(String filePath, final SparseArray<IpConfiguration> networks) { - mWriter.write(filePath, new DelayedDiskWrite.Writer() { - public void onWriteCalled(DataOutputStream out) throws IOException{ - out.writeInt(IPCONFIG_FILE_VERSION); - for(int i = 0; i < networks.size(); i++) { - writeConfig(out, networks.keyAt(i), networks.valueAt(i)); - } + mWriter.write(filePath, out -> { + out.writeInt(IPCONFIG_FILE_VERSION); + for(int i = 0; i < networks.size(); i++) { + writeConfig(out, String.valueOf(networks.keyAt(i)), networks.valueAt(i)); } }); } + public void writeIpConfigurations(String filePath, + ArrayMap<String, IpConfiguration> networks) { + mWriter.write(filePath, out -> { + out.writeInt(IPCONFIG_FILE_VERSION); + for(int i = 0; i < networks.size(); i++) { + writeConfig(out, networks.keyAt(i), networks.valueAt(i)); + } + }); + } + + public static ArrayMap<String, IpConfiguration> readIpConfigurations(String filePath) { + BufferedInputStream bufferedInputStream; + try { + bufferedInputStream = new BufferedInputStream(new FileInputStream(filePath)); + } catch (FileNotFoundException e) { + // Return an empty array here because callers expect an empty array when the file is + // not present. + loge("Error opening configuration file: " + e); + return new ArrayMap<>(0); + } + return readIpConfigurations(bufferedInputStream); + } + + /** @Deprecated use {@link #readIpConfigurations(String)} */ + @Deprecated public static SparseArray<IpConfiguration> readIpAndProxyConfigurations(String filePath) { BufferedInputStream bufferedInputStream; try { @@ -188,21 +226,40 @@ public class IpConfigStore { return readIpAndProxyConfigurations(bufferedInputStream); } + /** @Deprecated use {@link #readIpConfigurations(InputStream)} */ + @Deprecated public static SparseArray<IpConfiguration> readIpAndProxyConfigurations( InputStream inputStream) { - SparseArray<IpConfiguration> networks = new SparseArray<IpConfiguration>(); + ArrayMap<String, IpConfiguration> networks = readIpConfigurations(inputStream); + if (networks == null) { + return null; + } + + SparseArray<IpConfiguration> networksById = new SparseArray<>(); + for (int i = 0; i < networks.size(); i++) { + int id = Integer.valueOf(networks.keyAt(i)); + networksById.put(id, networks.valueAt(i)); + } + + return networksById; + } + + /** Returns a map of network identity token and {@link IpConfiguration}. */ + public static ArrayMap<String, IpConfiguration> readIpConfigurations( + InputStream inputStream) { + ArrayMap<String, IpConfiguration> networks = new ArrayMap<>(); DataInputStream in = null; try { in = new DataInputStream(inputStream); int version = in.readInt(); - if (version != 2 && version != 1) { + if (version != 3 && version != 2 && version != 1) { loge("Bad version on IP configuration file, ignore read"); return null; } while (true) { - int id = -1; + String uniqueToken = null; // Default is DHCP with no proxy IpAssignment ipAssignment = IpAssignment.DHCP; ProxySettings proxySettings = ProxySettings.NONE; @@ -217,7 +274,12 @@ public class IpConfigStore { key = in.readUTF(); try { if (key.equals(ID_KEY)) { - id = in.readInt(); + if (version < 3) { + int id = in.readInt(); + uniqueToken = String.valueOf(id); + } else { + uniqueToken = in.readUTF(); + } } else if (key.equals(IP_ASSIGNMENT_KEY)) { ipAssignment = IpAssignment.valueOf(in.readUTF()); } else if (key.equals(LINK_ADDRESS_KEY)) { @@ -280,9 +342,9 @@ public class IpConfigStore { } } while (true); - if (id != -1) { + if (uniqueToken != null) { IpConfiguration config = new IpConfiguration(); - networks.put(id, config); + networks.put(uniqueToken, config); switch (ipAssignment) { case STATIC: diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index f09de5222715..a6f049e1d8d0 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -106,9 +106,9 @@ import android.app.ActivityManagerInternal; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.IActivityManager; -import android.app.INotificationManager; import android.app.IUidObserver; import android.app.Notification; +import android.app.NotificationManager; import android.app.PendingIntent; import android.app.usage.UsageStatsManagerInternal; import android.content.BroadcastReceiver; @@ -175,6 +175,7 @@ import android.telephony.SubscriptionManager; import android.telephony.SubscriptionPlan; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.text.format.DateUtils; import android.text.format.Formatter; import android.util.ArrayMap; import android.util.ArraySet; @@ -208,10 +209,8 @@ import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.ServiceThread; import com.android.server.SystemConfig; -import com.android.server.SystemService; import libcore.io.IoUtils; -import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; @@ -332,6 +331,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { "com.android.server.net.action.ALLOW_BACKGROUND"; private static final String ACTION_SNOOZE_WARNING = "com.android.server.net.action.SNOOZE_WARNING"; + private static final String ACTION_SNOOZE_RAPID = + "com.android.server.net.action.SNOOZE_RAPID"; private static final long TIME_CACHE_MAX_AGE = DAY_IN_MILLIS; @@ -365,7 +366,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final CarrierConfigManager mCarrierConfigManager; private IConnectivityManager mConnManager; - private INotificationManager mNotifManager; private PowerManagerInternal mPowerManagerInternal; private IDeviceIdleController mDeviceIdleController; @GuardedBy("mUidRulesFirstLock") @@ -564,10 +564,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mConnManager = checkNotNull(connManager, "missing IConnectivityManager"); } - public void bindNotificationManager(INotificationManager notifManager) { - mNotifManager = checkNotNull(notifManager, "missing INotificationManager"); - } - void updatePowerSaveWhitelistUL() { try { int[] whitelist = mDeviceIdleController.getAppIdWhitelistExceptIdle(); @@ -772,10 +768,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final IntentFilter allowFilter = new IntentFilter(ACTION_ALLOW_BACKGROUND); mContext.registerReceiver(mAllowReceiver, allowFilter, MANAGE_NETWORK_POLICY, mHandler); - // listen for snooze warning from notifications - final IntentFilter snoozeWarningFilter = new IntentFilter(ACTION_SNOOZE_WARNING); - mContext.registerReceiver(mSnoozeWarningReceiver, snoozeWarningFilter, - MANAGE_NETWORK_POLICY, mHandler); + // Listen for snooze from notifications + mContext.registerReceiver(mSnoozeReceiver, + new IntentFilter(ACTION_SNOOZE_WARNING), MANAGE_NETWORK_POLICY, mHandler); + mContext.registerReceiver(mSnoozeReceiver, + new IntentFilter(ACTION_SNOOZE_RAPID), MANAGE_NETWORK_POLICY, mHandler); // listen for configured wifi networks to be loaded final IntentFilter wifiFilter = @@ -960,14 +957,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * Receiver that watches for {@link Notification} control of * {@link NetworkPolicy#lastWarningSnooze}. */ - final private BroadcastReceiver mSnoozeWarningReceiver = new BroadcastReceiver() { + final private BroadcastReceiver mSnoozeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // on background handler thread, and verified MANAGE_NETWORK_POLICY // permission above. final NetworkTemplate template = intent.getParcelableExtra(EXTRA_NETWORK_TEMPLATE); - performSnooze(template, TYPE_WARNING); + if (ACTION_SNOOZE_WARNING.equals(intent.getAction())) { + performSnooze(template, TYPE_WARNING); + } else if (ACTION_SNOOZE_RAPID.equals(intent.getAction())) { + performSnooze(template, TYPE_RAPID); + } } }; @@ -1025,13 +1026,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } }; - @VisibleForTesting - public void updateNotifications() { - synchronized (mNetworkPoliciesSecondLock) { - updateNotificationsNL(); - } - } - /** * Check {@link NetworkPolicy} against current {@link INetworkStatsService} * to show visible notifications as needed. @@ -1047,6 +1041,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // cycle boundary to recompute notifications. // examine stats for each active policy + final long now = currentTimeMillis(); for (int i = mNetworkPolicy.size()-1; i >= 0; i--) { final NetworkPolicy policy = mNetworkPolicy.valueAt(i); // ignore policies that aren't relevant to user @@ -1055,12 +1050,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager .cycleIterator(policy).next(); - final long start = cycle.first.toInstant().toEpochMilli(); - final long end = cycle.second.toInstant().toEpochMilli(); - final long totalBytes = getTotalBytes(policy.template, start, end); + final long cycleStart = cycle.first.toInstant().toEpochMilli(); + final long cycleEnd = cycle.second.toInstant().toEpochMilli(); + final long totalBytes = getTotalBytes(policy.template, cycleStart, cycleEnd); + // Notify when data usage is over warning/limit if (policy.isOverLimit(totalBytes)) { - if (policy.lastLimitSnooze >= start) { + final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart; + if (snoozedThisCycle) { enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes); } else { enqueueNotification(policy, TYPE_LIMIT, totalBytes); @@ -1070,45 +1067,30 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { notifyUnderLimitNL(policy.template); - if (policy.isOverWarning(totalBytes) && policy.lastWarningSnooze < start) { + final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart; + if (policy.isOverWarning(totalBytes) && !snoozedThisCycle) { enqueueNotification(policy, TYPE_WARNING, totalBytes); } } - } - // Alert the user about heavy recent data usage that might result in - // going over their carrier limit. - for (int i = 0; i < mNetIdToSubId.size(); i++) { - final int subId = mNetIdToSubId.valueAt(i); - final SubscriptionPlan plan = getPrimarySubscriptionPlanLocked(subId); - if (plan == null) continue; - - final long limitBytes = plan.getDataLimitBytes(); - if (limitBytes == SubscriptionPlan.BYTES_UNKNOWN) { - // Ignore missing limits - } else if (limitBytes == SubscriptionPlan.BYTES_UNLIMITED) { - // Unlimited data; no rapid usage alerting - } else { - // Warn if average usage over last 4 days is on track to blow - // pretty far past the plan limits. + // Warn if average usage over last 4 days is on track to blow pretty + // far past the plan limits. + if (policy.limitBytes != LIMIT_DISABLED) { final long recentDuration = TimeUnit.DAYS.toMillis(4); - final long end = RecurrenceRule.sClock.millis(); - final long start = end - recentDuration; + final long recentBytes = getTotalBytes(policy.template, now - recentDuration, now); - final NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll( - mContext.getSystemService(TelephonyManager.class).getSubscriberId(subId)); - final long recentBytes = getTotalBytes(template, start, end); + final long cycleDuration = cycleEnd - cycleStart; + final long projectedBytes = (recentBytes * cycleDuration) / recentDuration; + final long alertBytes = (policy.limitBytes * 3) / 2; - final Pair<ZonedDateTime, ZonedDateTime> cycle = plan.cycleIterator().next(); - final long cycleDuration = cycle.second.toInstant().toEpochMilli() - - cycle.first.toInstant().toEpochMilli(); + if (LOGD) { + Slog.d(TAG, "Rapid usage considering recent " + recentBytes + " projected " + + projectedBytes + " alert " + alertBytes); + } - final long projectedBytes = (recentBytes * cycleDuration) / recentDuration; - final long alertBytes = (limitBytes * 3) / 2; - if (projectedBytes > alertBytes) { - final NetworkPolicy policy = new NetworkPolicy(template, plan.getCycleRule(), - NetworkPolicy.WARNING_DISABLED, NetworkPolicy.LIMIT_DISABLED, - NetworkPolicy.SNOOZE_NEVER, NetworkPolicy.SNOOZE_NEVER, true, true); + final boolean snoozedRecently = policy.lastRapidSnooze >= now + - DateUtils.DAY_IN_MILLIS; + if (projectedBytes > alertBytes && !snoozedRecently) { enqueueNotification(policy, TYPE_RAPID, 0); } } @@ -1131,8 +1113,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { */ private boolean isTemplateRelevant(NetworkTemplate template) { if (template.isMatchRuleMobile()) { - final TelephonyManager tele = TelephonyManager.from(mContext); - final SubscriptionManager sub = SubscriptionManager.from(mContext); + final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); + final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class); // Mobile template is relevant when any active subscriber matches final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList()); @@ -1173,7 +1155,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes) { final NotificationId notificationId = new NotificationId(policy, type); final Notification.Builder builder = - new Notification.Builder(mContext, SystemNotificationChannels.NETWORK_STATUS); + new Notification.Builder(mContext, SystemNotificationChannels.NETWORK_ALERTS); builder.setOnlyAlertOnce(true); builder.setWhen(0L); builder.setColor(mContext.getColor( @@ -1190,8 +1172,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { builder.setTicker(title); builder.setContentTitle(title); builder.setContentText(body); - builder.setDefaults(Notification.DEFAULT_ALL); - builder.setChannelId(SystemNotificationChannels.NETWORK_ALERTS); final Intent snoozeIntent = buildSnoozeWarningIntent(policy.template); builder.setDeleteIntent(PendingIntent.getBroadcast( @@ -1267,6 +1247,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { builder.setTicker(title); builder.setContentTitle(title); builder.setContentText(body); + builder.setChannelId(SystemNotificationChannels.NETWORK_STATUS); final Intent intent = buildViewDataUsageIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( @@ -1277,45 +1258,34 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final CharSequence title = res.getText(R.string.data_usage_rapid_title); body = res.getText(R.string.data_usage_rapid_body); - builder.setOngoing(true); builder.setSmallIcon(R.drawable.stat_notify_error); builder.setTicker(title); builder.setContentTitle(title); builder.setContentText(body); - final Intent intent = buildViewDataUsageIntent(res, policy.template); + final Intent snoozeIntent = buildSnoozeRapidIntent(policy.template); + builder.setDeleteIntent(PendingIntent.getBroadcast( + mContext, 0, snoozeIntent, PendingIntent.FLAG_UPDATE_CURRENT)); + + final Intent viewIntent = buildViewDataUsageIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( - mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); + mContext, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT)); break; } } - // TODO: move to NotificationManager once we can mock it - try { - final String packageName = mContext.getPackageName(); - if (!TextUtils.isEmpty(body)) { - builder.setStyle(new Notification.BigTextStyle() - .bigText(body)); - } - mNotifManager.enqueueNotificationWithTag( - packageName, packageName, notificationId.getTag(), notificationId.getId(), - builder.build(), UserHandle.USER_ALL); - mActiveNotifs.add(notificationId); - } catch (RemoteException e) { - // ignored; service lives in system_server + if (!TextUtils.isEmpty(body)) { + builder.setStyle(new Notification.BigTextStyle().bigText(body)); } + + mContext.getSystemService(NotificationManager.class).notifyAsUser(notificationId.getTag(), + notificationId.getId(), builder.build(), UserHandle.ALL); + mActiveNotifs.add(notificationId); } private void cancelNotification(NotificationId notificationId) { - // TODO: move to NotificationManager once we can mock it - try { - final String packageName = mContext.getPackageName(); - mNotifManager.cancelNotificationWithTag( - packageName, notificationId.getTag(), notificationId.getId(), - UserHandle.USER_ALL); - } catch (RemoteException e) { - // ignored; service lives in system_server - } + mContext.getSystemService(NotificationManager.class).cancel(notificationId.getTag(), + notificationId.getId()); } /** @@ -1342,8 +1312,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { }; @VisibleForTesting - public void updateNetworks() { + public void updateNetworks() throws InterruptedException { mConnReceiver.onReceive(null, null); + final CountDownLatch latch = new CountDownLatch(1); + mHandler.post(() -> { + latch.countDown(); + }); + latch.await(5, TimeUnit.SECONDS); } /** @@ -1357,7 +1332,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (LOGV) Slog.v(TAG, "maybeUpdateMobilePolicyCycleAL()"); boolean policyUpdated = false; - final String subscriberId = TelephonyManager.from(mContext).getSubscriberId(subId); + final String subscriberId = mContext.getSystemService(TelephonyManager.class) + .getSubscriberId(subId); // find and update the mobile NetworkPolicy for this subscriber id final NetworkIdentity probeIdent = new NetworkIdentity(TYPE_MOBILE, @@ -1482,7 +1458,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return; } final int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, -1); - final TelephonyManager tele = TelephonyManager.from(mContext); + final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); final String subscriberId = tele.getSubscriberId(subId); maybeRefreshTrustedTime(); @@ -1561,8 +1537,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (template.getMatchRule() == MATCH_MOBILE_ALL) { // If mobile data usage hits the limit or if the user resumes the data, we need to // notify telephony. - final SubscriptionManager sm = SubscriptionManager.from(mContext); - final TelephonyManager tm = TelephonyManager.from(mContext); + final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); + final TelephonyManager tm = mContext.getSystemService(TelephonyManager.class); final int[] subIds = ArrayUtils.defeatNullable(sm.getActiveSubscriptionIdList()); for (int subId : subIds) { @@ -1746,7 +1722,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final long totalBytes = getTotalBytes( NetworkTemplate.buildTemplateMobileAll(state.subscriberId), start, end); final long remainingBytes = limitBytes - totalBytes; - final long remainingDays = Math.min(1, (end - RecurrenceRule.sClock.millis()) + final long remainingDays = Math.min(1, (end - currentTimeMillis()) / TimeUnit.DAYS.toMillis(1)); if (remainingBytes > 0) { quotaBytes = (remainingBytes / remainingDays) / 10; @@ -1770,8 +1746,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (LOGV) Slog.v(TAG, "ensureActiveMobilePolicyAL()"); if (mSuppressDefaultPolicy) return; - final TelephonyManager tele = TelephonyManager.from(mContext); - final SubscriptionManager sub = SubscriptionManager.from(mContext); + final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); + final SubscriptionManager sub = mContext.getSystemService(SubscriptionManager.class); final int[] subIds = ArrayUtils.defeatNullable(sub.getActiveSubscriptionIdList()); for (int subId : subIds) { @@ -2516,7 +2492,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } private void normalizePoliciesNL(NetworkPolicy[] policies) { - final TelephonyManager tele = TelephonyManager.from(mContext); + final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); final String[] merged = tele.getMergedSubscriberIds(); mNetworkPolicy.clear(); @@ -2564,6 +2540,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { case TYPE_LIMIT: policy.lastLimitSnooze = currentTime; break; + case TYPE_RAPID: + policy.lastRapidSnooze = currentTime; + break; default: throw new IllegalArgumentException("unexpected type"); } @@ -4425,6 +4404,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static Intent buildSnoozeWarningIntent(NetworkTemplate template) { final Intent intent = new Intent(ACTION_SNOOZE_WARNING); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + intent.putExtra(EXTRA_NETWORK_TEMPLATE, template); + return intent; + } + + private static Intent buildSnoozeRapidIntent(NetworkTemplate template) { + final Intent intent = new Intent(ACTION_SNOOZE_RAPID); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); intent.putExtra(EXTRA_NETWORK_TEMPLATE, template); return intent; } diff --git a/services/core/java/com/android/server/net/OWNERS b/services/core/java/com/android/server/net/OWNERS index 5d4287b9a812..64dc98ed82f0 100644 --- a/services/core/java/com/android/server/net/OWNERS +++ b/services/core/java/com/android/server/net/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com jsharkey@android.com lorenzo@google.com diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java index 5f4e47147109..e5fc6e544f6b 100644 --- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java +++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java @@ -63,7 +63,7 @@ public class NetworkWatchlistService extends INetworkWatchlistManager.Stub { @Override public void onStart() { if (Settings.Global.getInt(getContext().getContentResolver(), - Settings.Global.NETWORK_WATCHLIST_ENABLED, 0) == 0) { + Settings.Global.NETWORK_WATCHLIST_ENABLED, 1) == 0) { // Watchlist service is disabled Slog.i(TAG, "Network Watchlist service is disabled"); return; @@ -76,7 +76,7 @@ public class NetworkWatchlistService extends INetworkWatchlistManager.Stub { public void onBootPhase(int phase) { if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { if (Settings.Global.getInt(getContext().getContentResolver(), - Settings.Global.NETWORK_WATCHLIST_ENABLED, 0) == 0) { + Settings.Global.NETWORK_WATCHLIST_ENABLED, 1) == 0) { // Watchlist service is disabled Slog.i(TAG, "Network Watchlist service is disabled"); return; diff --git a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java index 5d7ff5a751aa..2a8f4d5cdf9b 100644 --- a/services/core/java/com/android/server/net/watchlist/ReportEncoder.java +++ b/services/core/java/com/android/server/net/watchlist/ReportEncoder.java @@ -19,38 +19,31 @@ package com.android.server.net.watchlist; import android.annotation.Nullable; import android.util.Log; +import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.HexDump; +import com.android.service.NetworkWatchlistReportProto; +import com.android.service.NetworkWatchlistAppResultProto; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; /** - * Helper class to encode and generate serialized DP encoded watchlist report. - * - * <p>Serialized report data structure: - * [4 bytes magic number][4_bytes_report_version_code][32_bytes_watchlist_hash] - * [app_1_digest_byte_array][app_1_encoded_visited_cnc_byte] - * [app_2_digest_byte_array][app_2_encoded_visited_cnc_byte] - * ... - * - * Total size: 4 + 4 + 32 + (32+1)*N, where N = number of digests + * Helper class to encode and generate serialized DP encoded watchlist proto report. */ class ReportEncoder { private static final String TAG = "ReportEncoder"; - // Report header magic number - private static final byte[] MAGIC_NUMBER = {(byte) 0x8D, (byte) 0x37, (byte) 0x0A, (byte) 0xAC}; // Report version number, as file format / parameters can be changed in later version, we need // to have versioning on watchlist report format - private static final byte[] REPORT_VERSION = {(byte) 0x00, (byte) 0x01}; + private static final int REPORT_VERSION = 1; private static final int WATCHLIST_HASH_SIZE = 32; - private static final int APP_DIGEST_SIZE = 32; /** * Apply DP on watchlist results, and generate a serialized watchlist report ready to store @@ -64,11 +57,10 @@ class ReportEncoder { } /** - * Convert DP encoded watchlist report into byte[] format. - * TODO: Serialize it using protobuf + * Convert DP encoded watchlist report into proto format. * * @param encodedReportMap DP encoded watchlist report. - * @return Watchlist report in byte[] format, which will be shared in Dropbox. Null if + * @return Watchlist report in proto format, which will be shared in Dropbox. Null if * watchlist report cannot be generated. */ @Nullable @@ -85,42 +77,25 @@ class ReportEncoder { Log.e(TAG, "Unexpected hash length"); return null; } - final int reportMapSize = encodedReportMap.size(); - final byte[] outputReport = - new byte[MAGIC_NUMBER.length + REPORT_VERSION.length + WATCHLIST_HASH_SIZE - + reportMapSize * (APP_DIGEST_SIZE + /* Result */ 1)]; - final List<String> sortedKeys = new ArrayList(encodedReportMap.keySet()); - Collections.sort(sortedKeys); - - int offset = 0; - - // Set magic number to report - System.arraycopy(MAGIC_NUMBER, 0, outputReport, offset, MAGIC_NUMBER.length); - offset += MAGIC_NUMBER.length; + final ByteArrayOutputStream reportOutputStream = new ByteArrayOutputStream(); + final ProtoOutputStream proto = new ProtoOutputStream(reportOutputStream); // Set report version to report - System.arraycopy(REPORT_VERSION, 0, outputReport, offset, REPORT_VERSION.length); - offset += REPORT_VERSION.length; - - // Set watchlist hash to report - System.arraycopy(watchlistHash, 0, outputReport, offset, watchlistHash.length); - offset += watchlistHash.length; + proto.write(NetworkWatchlistReportProto.REPORT_VERSION, REPORT_VERSION); + proto.write(NetworkWatchlistReportProto.WATCHLIST_CONFIG_HASH, + HexDump.toHexString(watchlistHash)); // Set app digest, encoded_isPha pair to report - for (int i = 0; i < reportMapSize; i++) { - String key = sortedKeys.get(i); + for (Map.Entry<String, Boolean> entry : encodedReportMap.entrySet()) { + String key = entry.getKey(); byte[] digest = HexDump.hexStringToByteArray(key); - boolean isPha = encodedReportMap.get(key); - System.arraycopy(digest, 0, outputReport, offset, APP_DIGEST_SIZE); - offset += digest.length; - outputReport[offset] = (byte) (isPha ? 1 : 0); - offset += 1; - } - if (outputReport.length != offset) { - Log.e(TAG, "Watchlist report size does not match! Offset: " + offset + ", report size: " - + outputReport.length); - + boolean encodedResult = entry.getValue(); + long token = proto.start(NetworkWatchlistReportProto.APP_RESULT); + proto.write(NetworkWatchlistAppResultProto.APP_DIGEST, key); + proto.write(NetworkWatchlistAppResultProto.ENCODED_RESULT, encodedResult); + proto.end(token); } - return outputReport; + proto.flush(); + return reportOutputStream.toByteArray(); } } diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index 502760a2cfc4..fd435f952c10 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -771,7 +771,7 @@ abstract public class ManagedServices { * Called whenever packages change, the user switches, or the secure setting * is altered. (For example in response to USER_SWITCHED in our broadcast receiver) */ - private void rebindServices(boolean forceRebind) { + protected void rebindServices(boolean forceRebind) { if (DEBUG) Slog.d(TAG, "rebindServices"); final int[] userIds = mUserProfiles.getCurrentProfileIds(); final int nUserIds = userIds.length; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 727e7ee2ac18..e7eed03a5bde 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1593,7 +1593,7 @@ public class NotificationManagerService extends SystemService { && update.getImportance() == IMPORTANCE_NONE)) { getContext().sendBroadcastAsUser( new Intent(ACTION_NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED) - .putExtra(NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID, + .putExtra(NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID, update.getId()) .putExtra(NotificationManager.EXTRA_BLOCKED_STATE, update.getImportance() == IMPORTANCE_NONE) @@ -1631,7 +1631,7 @@ public class NotificationManagerService extends SystemService { if (preUpdate.isBlocked() != update.isBlocked()) { getContext().sendBroadcastAsUser( new Intent(ACTION_NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED) - .putExtra(NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID, + .putExtra(NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID, update.getId()) .putExtra(NotificationManager.EXTRA_BLOCKED_STATE, update.isBlocked()) @@ -2891,6 +2891,7 @@ public class NotificationManagerService extends SystemService { // Backup/restore interface @Override public byte[] getBackupPayload(int user) { + checkCallerIsSystem(); if (DBG) Slog.d(TAG, "getBackupPayload u=" + user); //TODO: http://b/22388012 if (user != UserHandle.USER_SYSTEM) { @@ -2911,6 +2912,7 @@ public class NotificationManagerService extends SystemService { @Override public void applyRestore(byte[] payload, int user) { + checkCallerIsSystem(); if (DBG) Slog.d(TAG, "applyRestore u=" + user + " payload=" + (payload != null ? new String(payload, StandardCharsets.UTF_8) : null)); if (payload == null) { @@ -5687,6 +5689,12 @@ public class NotificationManagerService extends SystemService { mListeners.unregisterService(removed.service, removed.userid); } + @Override + public void onUserUnlocked(int user) { + if (DEBUG) Slog.d(TAG, "onUserUnlocked u=" + user); + rebindServices(true); + } + public void onNotificationEnqueued(final NotificationRecord r) { final StatusBarNotification sbn = r.sbn; TrimCache trimCache = new TrimCache(sbn); diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index c3f20af77b10..b79caca317a4 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -290,13 +290,14 @@ public class Installer extends SystemService { int dexoptNeeded, @Nullable String outputPath, int dexFlags, String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries, @Nullable String seInfo, boolean downgrade, int targetSdkVersion, - @Nullable String profileName) throws InstallerException { + @Nullable String profileName, @Nullable String dexMetadataPath) + throws InstallerException { assertValidInstructionSet(instructionSet); if (!checkBeforeRemote()) return; try { mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade, - targetSdkVersion, profileName); + targetSdkVersion, profileName, dexMetadataPath); } catch (Exception e) { throw InstallerException.from(e); } diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index 10e05cf34955..fc73142c4858 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -261,12 +261,12 @@ public class OtaDexoptService extends IOtaDexopt.Stub { String instructionSet, int dexoptNeeded, @Nullable String outputPath, int dexFlags, String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries, @Nullable String seInfo, boolean downgrade, - int targetSdkVersion, @Nullable String profileName) - throws InstallerException { + int targetSdkVersion, @Nullable String profileName, + @Nullable String dexMetadataPath) throws InstallerException { final StringBuilder builder = new StringBuilder(); - // The version. Right now it's 5. - builder.append("5 "); + // The version. Right now it's 6. + builder.append("6 "); builder.append("dexopt"); @@ -284,6 +284,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { encodeParameter(builder, downgrade); encodeParameter(builder, targetSdkVersion); encodeParameter(builder, profileName); + encodeParameter(builder, dexMetadataPath); commands.add(builder.toString()); } diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index cde8cb740590..2c68e67a3bd5 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageParser; import android.content.pm.dex.ArtManager; +import android.content.pm.dex.DexMetadataHelper; import android.os.FileUtils; import android.os.PowerManager; import android.os.SystemClock; @@ -209,6 +210,13 @@ public class PackageDexOptimizer { String profileName = ArtManager.getProfileName(i == 0 ? null : pkg.splitNames[i - 1]); + String dexMetadataPath = null; + if (options.isDexoptInstallWithDexMetadata()) { + File dexMetadataFile = DexMetadataHelper.findDexMetadataForFile(new File(path)); + dexMetadataPath = dexMetadataFile == null + ? null : dexMetadataFile.getAbsolutePath(); + } + final boolean isUsedByOtherApps = options.isDexoptAsSharedLibrary() || packageUseInfo.isUsedByOtherApps(path); final String compilerFilter = getRealCompilerFilter(pkg.applicationInfo, @@ -223,7 +231,7 @@ public class PackageDexOptimizer { for (String dexCodeIsa : dexCodeInstructionSets) { int newResult = dexOptPath(pkg, path, dexCodeIsa, compilerFilter, profileUpdated, classLoaderContexts[i], dexoptFlags, sharedGid, - packageStats, options.isDowngrade(), profileName); + packageStats, options.isDowngrade(), profileName, dexMetadataPath); // The end result is: // - FAILED if any path failed, // - PERFORMED if at least one path needed compilation, @@ -248,7 +256,7 @@ public class PackageDexOptimizer { private int dexOptPath(PackageParser.Package pkg, String path, String isa, String compilerFilter, boolean profileUpdated, String classLoaderContext, int dexoptFlags, int uid, CompilerStats.PackageStats packageStats, boolean downgrade, - String profileName) { + String profileName, String dexMetadataPath) { int dexoptNeeded = getDexoptNeeded(path, isa, compilerFilter, classLoaderContext, profileUpdated, downgrade); if (Math.abs(dexoptNeeded) == DexFile.NO_DEXOPT_NEEDED) { @@ -275,7 +283,7 @@ public class PackageDexOptimizer { mInstaller.dexopt(path, uid, pkg.packageName, isa, dexoptNeeded, oatDir, dexoptFlags, compilerFilter, pkg.volumeUuid, classLoaderContext, pkg.applicationInfo.seInfo, false /* downgrade*/, pkg.applicationInfo.targetSdkVersion, - profileName); + profileName, dexMetadataPath); if (packageStats != null) { long endTime = System.currentTimeMillis(); @@ -396,7 +404,8 @@ public class PackageDexOptimizer { mInstaller.dexopt(path, info.uid, info.packageName, isa, /*dexoptNeeded*/ 0, /*oatDir*/ null, dexoptFlags, compilerFilter, info.volumeUuid, classLoaderContext, info.seInfoUser, - options.isDowngrade(), info.targetSdkVersion, /*profileName*/ null); + options.isDowngrade(), info.targetSdkVersion, /*profileName*/ null, + /*dexMetadataPath*/ null); } return DEX_OPT_PERFORMED; @@ -511,9 +520,13 @@ public class PackageDexOptimizer { private int getDexFlags(ApplicationInfo info, String compilerFilter, DexoptOptions options) { int flags = info.flags; boolean debuggable = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; - // Profile guide compiled oat files should not be public. + // Profile guide compiled oat files should not be public unles they are based + // on profiles from dex metadata archives. + // The flag isDexoptInstallWithDexMetadata applies only on installs when we know that + // the user does not have an existing profile. boolean isProfileGuidedFilter = isProfileGuidedCompilerFilter(compilerFilter); - boolean isPublic = !info.isForwardLocked() && !isProfileGuidedFilter; + boolean isPublic = !info.isForwardLocked() && + (!isProfileGuidedFilter || options.isDexoptInstallWithDexMetadata()); int profileFlag = isProfileGuidedFilter ? DEXOPT_PROFILE_GUIDED : 0; // System apps are invoked with a runtime flag which exempts them from // restrictions on hidden API usage. We dexopt with the same runtime flag diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index a6ff4f7e5f70..3dd5a3415e35 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -77,6 +77,7 @@ import android.os.RevocableFileDescriptor; import android.os.UserHandle; import android.os.storage.StorageManager; import android.system.ErrnoException; +import android.system.Int64Ref; import android.system.Os; import android.system.OsConstants; import android.system.StructStat; @@ -575,14 +576,24 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @Override public ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes) { try { - return openWriteInternal(name, offsetBytes, lengthBytes); + return doWriteInternal(name, offsetBytes, lengthBytes, null); } catch (IOException e) { throw ExceptionUtils.wrap(e); } } - private ParcelFileDescriptor openWriteInternal(String name, long offsetBytes, long lengthBytes) - throws IOException { + @Override + public void write(String name, long offsetBytes, long lengthBytes, + ParcelFileDescriptor fd) { + try { + doWriteInternal(name, offsetBytes, lengthBytes, fd); + } catch (IOException e) { + throw ExceptionUtils.wrap(e); + } + } + + private ParcelFileDescriptor doWriteInternal(String name, long offsetBytes, long lengthBytes, + ParcelFileDescriptor incomingFd) throws IOException { // Quick sanity check of state, and allocate a pipe for ourselves. We // then do heavy disk allocation outside the lock, but this open pipe // will block any attempted install transitions. @@ -636,7 +647,44 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { Os.lseek(targetFd, offsetBytes, OsConstants.SEEK_SET); } - if (PackageInstaller.ENABLE_REVOCABLE_FD) { + if (incomingFd != null) { + switch (Binder.getCallingUid()) { + case android.os.Process.SHELL_UID: + case android.os.Process.ROOT_UID: + break; + default: + throw new SecurityException("Reverse mode only supported from shell"); + } + + // In "reverse" mode, we're streaming data ourselves from the + // incoming FD, which means we never have to hand out our + // sensitive internal FD. We still rely on a "bridge" being + // inserted above to hold the session active. + try { + final Int64Ref last = new Int64Ref(0); + FileUtils.copy(incomingFd.getFileDescriptor(), targetFd, (long progress) -> { + if (params.sizeBytes > 0) { + final long delta = progress - last.value; + last.value = progress; + addClientProgress((float) delta / (float) params.sizeBytes); + } + }, null, lengthBytes); + } finally { + IoUtils.closeQuietly(targetFd); + IoUtils.closeQuietly(incomingFd); + + // We're done here, so remove the "bridge" that was holding + // the session active. + synchronized (mLock) { + if (PackageInstaller.ENABLE_REVOCABLE_FD) { + mFds.remove(fd); + } else { + mBridges.remove(bridge); + } + } + } + return null; + } else if (PackageInstaller.ENABLE_REVOCABLE_FD) { fd.init(mContext, targetFd); return fd.getRevocableFileDescriptor(); } else { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 89fbd1736200..940d19f90be2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3840,10 +3840,6 @@ Slog.e("TODD", if (ps == null) { return null; } - PackageParser.Package p = ps.pkg; - if (p == null) { - return null; - } final int callingUid = Binder.getCallingUid(); // Filter out ephemeral app metadata: // * The system/shell/root can see metadata for any app @@ -3855,32 +3851,58 @@ Slog.e("TODD", return null; } - final PermissionsState permissionsState = ps.getPermissionsState(); - - // Compute GIDs only if requested - final int[] gids = (flags & PackageManager.GET_GIDS) == 0 - ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId); - // Compute granted permissions only if package has requested permissions - final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions) - ? Collections.<String>emptySet() : permissionsState.getPermissions(userId); - final PackageUserState state = ps.readUserState(userId); - if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0 && ps.isSystem()) { flags |= MATCH_ANY_USER; } - PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); + final PackageUserState state = ps.readUserState(userId); + PackageParser.Package p = ps.pkg; + if (p != null) { + final PermissionsState permissionsState = ps.getPermissionsState(); + + // Compute GIDs only if requested + final int[] gids = (flags & PackageManager.GET_GIDS) == 0 + ? EMPTY_INT_ARRAY : permissionsState.computeGids(userId); + // Compute granted permissions only if package has requested permissions + final Set<String> permissions = ArrayUtils.isEmpty(p.requestedPermissions) + ? Collections.<String>emptySet() : permissionsState.getPermissions(userId); - if (packageInfo == null) { - return null; - } + PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); - packageInfo.packageName = packageInfo.applicationInfo.packageName = - resolveExternalPackageNameLPr(p); + if (packageInfo == null) { + return null; + } - return packageInfo; + packageInfo.packageName = packageInfo.applicationInfo.packageName = + resolveExternalPackageNameLPr(p); + + return packageInfo; + } else if ((flags & MATCH_UNINSTALLED_PACKAGES) != 0 && state.isAvailable(flags)) { + PackageInfo pi = new PackageInfo(); + pi.packageName = ps.name; + pi.setLongVersionCode(ps.versionCode); + pi.sharedUserId = (ps.sharedUser != null) ? ps.sharedUser.name : null; + pi.firstInstallTime = ps.firstInstallTime; + pi.lastUpdateTime = ps.lastUpdateTime; + + ApplicationInfo ai = new ApplicationInfo(); + ai.packageName = ps.name; + ai.uid = UserHandle.getUid(userId, ps.appId); + ai.primaryCpuAbi = ps.primaryCpuAbiString; + ai.secondaryCpuAbi = ps.secondaryCpuAbiString; + ai.versionCode = ps.versionCode; + ai.flags = ps.pkgFlags; + ai.privateFlags = ps.pkgPrivateFlags; + pi.applicationInfo = PackageParser.generateApplicationInfo(ai, flags, state, userId); + + if (DEBUG_PACKAGE_INFO) Log.v(TAG, "ps.pkg is n/a for [" + + ps.name + "]. Provides a minimum info."); + return pi; + } else { + return null; + } } @Override @@ -17309,7 +17331,8 @@ Slog.e("TODD", // Also, don't fail application installs if the dexopt step fails. DexoptOptions dexoptOptions = new DexoptOptions(pkg.packageName, REASON_INSTALL, - DexoptOptions.DEXOPT_BOOT_COMPLETE); + DexoptOptions.DEXOPT_BOOT_COMPLETE | + DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE); mPackageDexOptimizer.performDexOpt(pkg, pkg.usesLibraryFiles, null /* instructionSets */, getOrCreateCompilerPackageStats(pkg), @@ -20913,9 +20936,6 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); if (Process.isIsolated(uid)) { return Zygote.MOUNT_EXTERNAL_NONE; } - if (checkUidPermission(WRITE_MEDIA_STORAGE, uid) == PERMISSION_GRANTED) { - return Zygote.MOUNT_EXTERNAL_DEFAULT; - } if (checkUidPermission(READ_EXTERNAL_STORAGE, uid) == PERMISSION_DENIED) { return Zygote.MOUNT_EXTERNAL_DEFAULT; } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 686c4a5eb321..758c9d56d32a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -16,6 +16,12 @@ package com.android.server.pm; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; +import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; + import android.accounts.IAccountManager; import android.app.ActivityManager; import android.app.ActivityManagerInternal; @@ -32,8 +38,10 @@ import android.content.pm.IPackageManager; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; +import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageParser; import android.content.pm.PackageParser.ApkLite; import android.content.pm.PackageParser.PackageLite; @@ -41,9 +49,6 @@ import android.content.pm.PackageParser.PackageParserException; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; -import android.content.pm.PackageInstaller.SessionInfo; -import android.content.pm.PackageInstaller.SessionParams; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.content.pm.VersionedPackage; @@ -73,7 +78,6 @@ import android.util.PrintWriterPrinter; import com.android.internal.content.PackageHelper; import com.android.internal.util.ArrayUtils; -import com.android.internal.util.SizedInputStream; import com.android.server.LocalServices; import com.android.server.SystemConfig; @@ -81,9 +85,8 @@ import dalvik.system.DexFile; import libcore.io.IoUtils; +import java.io.FileDescriptor; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.io.PrintWriter; import java.net.URISyntaxException; import java.util.ArrayList; @@ -95,12 +98,6 @@ import java.util.WeakHashMap; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; -import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; - class PackageManagerShellCommand extends ShellCommand { /** Path for streaming APK content */ private static final String STDIN_PATH = "-"; @@ -2213,7 +2210,7 @@ class PackageManagerShellCommand extends ShellCommand { final PrintWriter pw = getOutPrintWriter(); final ParcelFileDescriptor fd; if (STDIN_PATH.equals(inPath)) { - fd = null; + fd = new ParcelFileDescriptor(getInFileDescriptor()); } else if (inPath != null) { fd = openFileForSystem(inPath, "r"); if (fd == null) { @@ -2225,53 +2222,27 @@ class PackageManagerShellCommand extends ShellCommand { return -1; } } else { - fd = null; + fd = new ParcelFileDescriptor(getInFileDescriptor()); } if (sizeBytes <= 0) { getErrPrintWriter().println("Error: must specify a APK size"); return 1; } - final SessionInfo info = mInterface.getPackageInstaller().getSessionInfo(sessionId); - PackageInstaller.Session session = null; - InputStream in = null; - OutputStream out = null; try { session = new PackageInstaller.Session( mInterface.getPackageInstaller().openSession(sessionId)); - - if (fd != null) { - in = new ParcelFileDescriptor.AutoCloseInputStream(fd); - } else { - in = new SizedInputStream(getRawInputStream(), sizeBytes); - } - out = session.openWrite(splitName, 0, sizeBytes); - - int total = 0; - byte[] buffer = new byte[1024 * 1024]; - int c; - while ((c = in.read(buffer)) != -1) { - total += c; - out.write(buffer, 0, c); - - if (info.sizeBytes > 0) { - final float fraction = ((float) c / (float) info.sizeBytes); - session.addProgress(fraction); - } - } - session.fsync(out); + session.write(splitName, 0, sizeBytes, fd); if (logSuccess) { - pw.println("Success: streamed " + total + " bytes"); + pw.println("Success: streamed " + sizeBytes + " bytes"); } return 0; } catch (IOException e) { getErrPrintWriter().println("Error: failed to write; " + e.getMessage()); return 1; } finally { - IoUtils.closeQuietly(out); - IoUtils.closeQuietly(in); IoUtils.closeQuietly(session); } } diff --git a/services/core/java/com/android/server/pm/PackageSignatures.java b/services/core/java/com/android/server/pm/PackageSignatures.java index 95f490ef1b27..471729ee649d 100644 --- a/services/core/java/com/android/server/pm/PackageSignatures.java +++ b/services/core/java/com/android/server/pm/PackageSignatures.java @@ -318,7 +318,7 @@ class PackageSignatures { mSigningDetails.signatures[i].hashCode())); } } - buf.append("]}"); + buf.append("]"); buf.append(", past signatures:["); if (mSigningDetails.pastSigningCertificates != null) { for (int i = 0; i < mSigningDetails.pastSigningCertificates.length; i++) { @@ -329,6 +329,7 @@ class PackageSignatures { buf.append(Integer.toHexString(mSigningDetails.pastSigningCertificatesFlags[i])); } } + buf.append("]}"); return buf.toString(); } } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index ebf6672cf57e..e4c74edf0f0f 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -703,7 +703,7 @@ class ShortcutPackage extends ShortcutPackageItem { */ public boolean rescanPackageIfNeeded(boolean isNewApp, boolean forceRescan) { final ShortcutService s = mShortcutUser.mService; - final long start = s.injectElapsedRealtime(); + final long start = s.getStatStartTime(); final PackageInfo pi; try { diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index d2bc6d24e2e9..a85d6d838045 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -99,6 +99,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; +import com.android.server.StatLogger; import com.android.server.SystemService; import com.android.server.pm.ShortcutUser.PackageWithUser; @@ -367,7 +368,7 @@ public class ShortcutService extends IShortcutService.Stub { int COUNT = GET_DEFAULT_LAUNCHER + 1; } - private static final String[] STAT_LABELS = { + private final StatLogger mStatLogger = new StatLogger(new String[] { "getHomeActivities()", "Launcher permission check", "getPackageInfo()", @@ -385,15 +386,7 @@ public class ShortcutService extends IShortcutService.Stub { "packageUpdateCheck", "asyncPreloadUserDelay", "getDefaultLauncher()" - }; - - final Object mStatLock = new Object(); - - @GuardedBy("mStatLock") - private final int[] mCountStats = new int[Stats.COUNT]; - - @GuardedBy("mStatLock") - private final long[] mDurationStats = new long[Stats.COUNT]; + }); private static final int PROCESS_STATE_FOREGROUND_THRESHOLD = ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE; @@ -480,11 +473,12 @@ public class ShortcutService extends IShortcutService.Stub { | ActivityManager.UID_OBSERVER_GONE); } + long getStatStartTime() { + return mStatLogger.getTime(); + } + void logDurationStat(int statId, long start) { - synchronized (mStatLock) { - mCountStats[statId]++; - mDurationStats[statId] += (injectElapsedRealtime() - start); - } + mStatLogger.logDurationStat(statId, start); } public String injectGetLocaleTagsForUser(@UserIdInt int userId) { @@ -621,7 +615,7 @@ public class ShortcutService extends IShortcutService.Stub { // late since the launcher would already have started. // So we just create a new thread. This code runs rarely, so we don't use a thread pool // or anything. - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); injectRunOnNewThread(() -> { synchronized (mLock) { logDurationStat(Stats.ASYNC_PRELOAD_USER_DELAY, start); @@ -1289,7 +1283,7 @@ public class ShortcutService extends IShortcutService.Stub { if (DEBUG) { Slog.d(TAG, "cleanupDanglingBitmaps: userId=" + userId); } - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final ShortcutUser user = getUserShortcutsLocked(userId); @@ -1485,7 +1479,7 @@ public class ShortcutService extends IShortcutService.Stub { final Resources publisherRes = injectGetResourcesForApplicationAsUser( si.getPackage(), si.getUserId()); if (publisherRes != null) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { si.lookupAndFillInResourceNames(publisherRes); } finally { @@ -2264,7 +2258,7 @@ public class ShortcutService extends IShortcutService.Stub { if (canSeeAnyPinnedShortcut(callingPackage, userId, callingPid, callingUid)) { return true; } - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { return hasShortcutHostPermissionInner(callingPackage, userId); } finally { @@ -2327,7 +2321,7 @@ public class ShortcutService extends IShortcutService.Stub { @Nullable ComponentName getDefaultLauncher(@UserIdInt int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { synchronized (mLock) { @@ -2338,7 +2332,7 @@ public class ShortcutService extends IShortcutService.Stub { final List<ResolveInfo> allHomeCandidates = new ArrayList<>(); // Default launcher from package manager. - final long startGetHomeActivitiesAsUser = injectElapsedRealtime(); + final long startGetHomeActivitiesAsUser = getStatStartTime(); final ComponentName defaultLauncher = mPackageManagerInternal .getHomeActivitiesAsUser(allHomeCandidates, userId); logDurationStat(Stats.GET_DEFAULT_HOME, startGetHomeActivitiesAsUser); @@ -2910,7 +2904,7 @@ public class ShortcutService extends IShortcutService.Stub { return; } - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { final ArrayList<PackageWithUser> gonePackages = new ArrayList<>(); @@ -3087,7 +3081,7 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting PackageInfo injectPackageInfoWithUninstalled(String packageName, @UserIdInt int userId, boolean getSignatures) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { return mIPackageManager.getPackageInfo( @@ -3122,7 +3116,7 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting ApplicationInfo injectApplicationInfoWithUninstalled( String packageName, @UserIdInt int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { return mIPackageManager.getApplicationInfo(packageName, PACKAGE_MATCH_FLAGS, userId); @@ -3153,7 +3147,7 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting ActivityInfo injectGetActivityInfoWithMetadataWithUninstalled( ComponentName activity, @UserIdInt int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { return mIPackageManager.getActivityInfo(activity, @@ -3175,7 +3169,7 @@ public class ShortcutService extends IShortcutService.Stub { @NonNull @VisibleForTesting final List<PackageInfo> getInstalledPackages(@UserIdInt int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { final List<PackageInfo> all = injectGetPackagesWithUninstalled(userId); @@ -3280,7 +3274,7 @@ public class ShortcutService extends IShortcutService.Stub { @Nullable Resources injectGetResourcesForApplicationAsUser(String packageName, int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); final long token = injectClearCallingIdentity(); try { return mContext.getPackageManager().getResourcesForApplicationAsUser( @@ -3348,7 +3342,7 @@ public class ShortcutService extends IShortcutService.Stub { */ @Nullable ComponentName injectGetDefaultMainActivity(@NonNull String packageName, int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { final List<ResolveInfo> resolved = queryActivities(getMainActivityIntent(), packageName, null, userId); @@ -3362,7 +3356,7 @@ public class ShortcutService extends IShortcutService.Stub { * Return whether an activity is enabled, exported and main. */ boolean injectIsMainActivity(@NonNull ComponentName activity, int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { if (activity == null) { wtf("null activity detected"); @@ -3397,7 +3391,7 @@ public class ShortcutService extends IShortcutService.Stub { */ @NonNull List<ResolveInfo> injectGetMainActivities(@NonNull String packageName, int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { return queryActivities(getMainActivityIntent(), packageName, null, userId); } finally { @@ -3411,7 +3405,7 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting boolean injectIsActivityEnabledAndExported( @NonNull ComponentName activity, @UserIdInt int userId) { - final long start = injectElapsedRealtime(); + final long start = getStatStartTime(); try { return queryActivities(new Intent(), activity.getPackageName(), activity, userId) .size() > 0; @@ -3831,12 +3825,7 @@ public class ShortcutService extends IShortcutService.Stub { pw.println(mMaxShortcuts); pw.println(); - pw.println(" Stats:"); - synchronized (mStatLock) { - for (int i = 0; i < Stats.COUNT; i++) { - dumpStatLS(pw, " ", i); - } - } + mStatLogger.dump(pw, " "); pw.println(); pw.print(" #Failures: "); @@ -3902,15 +3891,6 @@ public class ShortcutService extends IShortcutService.Stub { pw.print(formatTime(injectCurrentTimeMillis())); } - private void dumpStatLS(PrintWriter pw, String prefix, int statId) { - pw.print(prefix); - final int count = mCountStats[statId]; - final long dur = mDurationStats[statId]; - pw.println(String.format("%s: count=%d, total=%dms, avg=%.1fms", - STAT_LABELS[statId], count, dur, - (count == 0 ? 0 : ((double) dur) / count))); - } - /** * Dumpsys for checkin. * diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 92fd9041b32d..b53d83b1291c 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -88,6 +88,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IAppOpsService; import com.android.internal.logging.MetricsLogger; +import com.android.internal.os.BackgroundThread; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; @@ -387,7 +388,9 @@ public class UserManagerService extends IUserManager.Stub { } final IntentSender target = intent.getParcelableExtra(Intent.EXTRA_INTENT); final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL); - setQuietModeEnabled(userHandle, false, target); + // Call setQuietModeEnabled on bg thread to avoid ANR + BackgroundThread.getHandler() + .post(() -> setQuietModeEnabled(userHandle, false, target)); } }; diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index a42fcbdd94a0..842f8d0a42f5 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -117,7 +117,7 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_AUTOFILL, UserManager.DISALLOW_USER_SWITCH, UserManager.DISALLOW_UNIFIED_PASSWORD, - UserManager.DISALLOW_CONFIG_LOCATION_MODE, + UserManager.DISALLOW_CONFIG_LOCATION, UserManager.DISALLOW_AIRPLANE_MODE, UserManager.DISALLOW_CONFIG_BRIGHTNESS, UserManager.DISALLOW_SHARE_INTO_MANAGED_PROFILE, diff --git a/services/core/java/com/android/server/pm/dex/DexoptOptions.java b/services/core/java/com/android/server/pm/dex/DexoptOptions.java index 0966770d4897..d4f95cb6b99f 100644 --- a/services/core/java/com/android/server/pm/dex/DexoptOptions.java +++ b/services/core/java/com/android/server/pm/dex/DexoptOptions.java @@ -59,6 +59,10 @@ public final class DexoptOptions { // When set, indicates that dexopt is invoked from the background service. public static final int DEXOPT_IDLE_BACKGROUND_JOB = 1 << 9; + // When set, indicates that dexopt is invoked from the install time flow and + // should get the dex metdata file if present. + public static final int DEXOPT_INSTALL_WITH_DEX_METADATA_FILE = 1 << 10; + // The name of package to optimize. private final String mPackageName; @@ -90,7 +94,8 @@ public final class DexoptOptions { DEXOPT_ONLY_SHARED_DEX | DEXOPT_DOWNGRADE | DEXOPT_AS_SHARED_LIBRARY | - DEXOPT_IDLE_BACKGROUND_JOB; + DEXOPT_IDLE_BACKGROUND_JOB | + DEXOPT_INSTALL_WITH_DEX_METADATA_FILE; if ((flags & (~validityMask)) != 0) { throw new IllegalArgumentException("Invalid flags : " + Integer.toHexString(flags)); } @@ -141,6 +146,10 @@ public final class DexoptOptions { return (mFlags & DEXOPT_IDLE_BACKGROUND_JOB) != 0; } + public boolean isDexoptInstallWithDexMetadata() { + return (mFlags & DEXOPT_INSTALL_WITH_DEX_METADATA_FILE) != 0; + } + public String getSplitName() { return mSplitName; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 0502848d698e..177d6af489b3 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5603,9 +5603,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { final int fl = PolicyControl.getWindowFlags(null, mTopFullscreenOpaqueWindowState.getAttrs()); if (localLOGV) { - Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw() - + " shown position: " - + mTopFullscreenOpaqueWindowState.getShownPositionLw()); + Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw()); Slog.d(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs() + " lp.flags=0x" + Integer.toHexString(fl)); } diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index e9c4c5c8138f..3af3fcbbf7a8 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -232,14 +232,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { public Rect getFrameLw(); /** - * Retrieve the current position of the window that is actually shown. - * Must be called with the window manager lock held. - * - * @return Point The point holding the shown window position. - */ - public Point getShownPositionLw(); - - /** * Retrieve the frame of the display that this window was last * laid out in. Must be called with the * window manager lock held. diff --git a/services/core/java/com/android/server/slice/SliceFullAccessList.java b/services/core/java/com/android/server/slice/SliceFullAccessList.java index 5e0cd035a67d..6f5afa207d31 100644 --- a/services/core/java/com/android/server/slice/SliceFullAccessList.java +++ b/services/core/java/com/android/server/slice/SliceFullAccessList.java @@ -16,9 +16,9 @@ package com.android.server.slice; import android.content.Context; import android.content.pm.UserInfo; +import android.os.UserHandle; import android.os.UserManager; import android.util.ArraySet; -import android.util.Log; import android.util.SparseArray; import com.android.internal.util.XmlUtils; @@ -72,7 +72,7 @@ public class SliceFullAccessList { pkgs.remove(pkg); } - public void writeXml(XmlSerializer out) throws IOException { + public void writeXml(XmlSerializer out, int user) throws IOException { out.startTag(null, TAG_LIST); out.attribute(null, ATT_VERSION, String.valueOf(DB_VERSION)); @@ -80,6 +80,9 @@ public class SliceFullAccessList { for (int i = 0 ; i < N; i++) { final int userId = mFullAccessPkgs.keyAt(i); final ArraySet<String> pkgs = mFullAccessPkgs.valueAt(i); + if (user != UserHandle.USER_ALL && user != userId) { + continue; + } out.startTag(null, TAG_USER); out.attribute(null, ATT_USER_ID, Integer.toString(userId)); if (pkgs != null) { @@ -88,7 +91,6 @@ public class SliceFullAccessList { out.startTag(null, TAG_PKG); out.text(pkgs.valueAt(j)); out.endTag(null, TAG_PKG); - } } out.endTag(null, TAG_USER); diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java index c4871dfe8d5c..a1def440a007 100644 --- a/services/core/java/com/android/server/slice/SliceManagerService.java +++ b/services/core/java/com/android/server/slice/SliceManagerService.java @@ -21,6 +21,7 @@ import static android.content.ContentProvider.getUserIdFromUri; import static android.content.ContentProvider.maybeAddUserId; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.os.Process.SYSTEM_UID; import android.Manifest.permission; import android.app.ActivityManager; @@ -68,8 +69,9 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import org.xmlpull.v1.XmlSerializer; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -93,6 +95,7 @@ public class SliceManagerService extends ISliceManager.Stub { private final ArraySet<SliceGrant> mUserGrants = new ArraySet<>(); private final Handler mHandler; private final ContentObserver mObserver; + @GuardedBy("mSliceAccessFile") private final AtomicFile mSliceAccessFile; @GuardedBy("mAccessList") private final SliceFullAccessList mAccessList; @@ -257,6 +260,63 @@ public class SliceManagerService extends ISliceManager.Stub { } } + // Backup/restore interface + @Override + public byte[] getBackupPayload(int user) { + if (Binder.getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system"); + } + //TODO: http://b/22388012 + if (user != UserHandle.USER_SYSTEM) { + Slog.w(TAG, "getBackupPayload: cannot backup policy for user " + user); + return null; + } + synchronized(mSliceAccessFile) { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer(); + out.setOutput(baos, Encoding.UTF_8.name()); + synchronized (mAccessList) { + mAccessList.writeXml(out, user); + } + out.flush(); + return baos.toByteArray(); + } catch (IOException | XmlPullParserException e) { + Slog.w(TAG, "getBackupPayload: error writing payload for user " + user, e); + } + } + return null; + } + + @Override + public void applyRestore(byte[] payload, int user) { + if (Binder.getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system"); + } + if (payload == null) { + Slog.w(TAG, "applyRestore: no payload to restore for user " + user); + return; + } + //TODO: http://b/22388012 + if (user != UserHandle.USER_SYSTEM) { + Slog.w(TAG, "applyRestore: cannot restore policy for user " + user); + return; + } + synchronized(mSliceAccessFile) { + final ByteArrayInputStream bais = new ByteArrayInputStream(payload); + try { + XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); + parser.setInput(bais, Encoding.UTF_8.name()); + synchronized (mAccessList) { + mAccessList.readXml(parser); + } + mHandler.post(mSaveAccessList); + } catch (NumberFormatException | XmlPullParserException | IOException e) { + Slog.w(TAG, "applyRestore: error reading payload", e); + } + } + } + /// ----- internal code ----- private void removeFullAccess(String pkg, int userId) { synchronized (mAccessList) { @@ -492,7 +552,7 @@ public class SliceManagerService extends ISliceManager.Stub { XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer(); out.setOutput(stream, Encoding.UTF_8.name()); synchronized (mAccessList) { - mAccessList.writeXml(out); + mAccessList.writeXml(out, UserHandle.USER_ALL); } out.flush(); mSliceAccessFile.finishWrite(stream); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index adb368b074c0..7c170aee92fa 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -56,7 +56,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; - /** * A note on locking: We rely on the fact that calls onto mBar are oneway or * if they are local, that they just enqueue messages to not deadlock. @@ -525,6 +524,26 @@ public class StatusBarManagerService extends IStatusBarService.Stub { } @Override + public void showPinningEnterExitToast(boolean entering) throws RemoteException { + if (mBar != null) { + try { + mBar.showPinningEnterExitToast(entering); + } catch (RemoteException ex) { + } + } + } + + @Override + public void showPinningEscapeToast() throws RemoteException { + if (mBar != null) { + try { + mBar.showPinningEscapeToast(); + } catch (RemoteException ex) { + } + } + } + + @Override public void showFingerprintDialog(Bundle bundle, IFingerprintDialogReceiver receiver) { if (mBar != null) { try { diff --git a/services/core/java/com/android/server/wm/Dimmer.java b/services/core/java/com/android/server/wm/Dimmer.java index b435605b654f..4394a99bc5c9 100644 --- a/services/core/java/com/android/server/wm/Dimmer.java +++ b/services/core/java/com/android/server/wm/Dimmer.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import android.util.ArrayMap; import android.view.SurfaceControl; import android.graphics.Rect; @@ -124,17 +123,30 @@ class Dimmer { } } - @VisibleForTesting - ArrayMap<WindowContainer, DimState> mDimLayerUsers = new ArrayMap<>(); - /** * The {@link WindowContainer} that our Dim's are bounded to. We may be dimming on behalf of the * host, some controller of it, or one of the hosts children. */ private WindowContainer mHost; + private WindowContainer mLastRequestedDimContainer; + @VisibleForTesting + DimState mDimState; + + private final SurfaceAnimatorStarter mSurfaceAnimatorStarter; + + @VisibleForTesting + interface SurfaceAnimatorStarter { + void startAnimation(SurfaceAnimator surfaceAnimator, SurfaceControl.Transaction t, + AnimationAdapter anim, boolean hidden); + } Dimmer(WindowContainer host) { + this(host, SurfaceAnimator::startAnimation); + } + + Dimmer(WindowContainer host, SurfaceAnimatorStarter surfaceAnimatorStarter) { mHost = host; + mSurfaceAnimatorStarter = surfaceAnimatorStarter; } private SurfaceControl makeDimLayer() { @@ -146,29 +158,32 @@ class Dimmer { } /** - * Retreive the DimState for a given child of the host. + * Retrieve the DimState, creating one if it doesn't exist. */ private DimState getDimState(WindowContainer container) { - DimState state = mDimLayerUsers.get(container); - if (state == null) { + if (mDimState == null) { final SurfaceControl ctl = makeDimLayer(); - state = new DimState(ctl); + mDimState = new DimState(ctl); /** * See documentation on {@link #dimAbove} to understand lifecycle management of Dim's * via state resetting for Dim's with containers. */ if (container == null) { - state.mDontReset = true; + mDimState.mDontReset = true; } - mDimLayerUsers.put(container, state); } - return state; + + mLastRequestedDimContainer = container; + return mDimState; } private void dim(SurfaceControl.Transaction t, WindowContainer container, int relativeLayer, float alpha) { final DimState d = getDimState(container); if (container != null) { + // The dim method is called from WindowState.prepareSurfaces(), which is always called + // in the correct Z from lowest Z to highest. This ensures that the dim layer is always + // relative to the highest Z layer with a dim. t.setRelativeLayer(d.mDimLayer, container.getSurfaceControl(), relativeLayer); } else { t.setLayer(d.mDimLayer, Integer.MAX_VALUE); @@ -237,11 +252,8 @@ class Dimmer { * a chance to request dims to continue. */ void resetDimStates() { - for (int i = mDimLayerUsers.size() - 1; i >= 0; i--) { - final DimState state = mDimLayerUsers.valueAt(i); - if (!state.mDontReset) { - state.mDimming = false; - } + if (mDimState != null && !mDimState.mDontReset) { + mDimState.mDimming = false; } } @@ -254,30 +266,25 @@ class Dimmer { * @return true if any Dims were updated. */ boolean updateDims(SurfaceControl.Transaction t, Rect bounds) { - boolean didSomething = false; - for (int i = mDimLayerUsers.size() - 1; i >= 0; i--) { - DimState state = mDimLayerUsers.valueAt(i); - WindowContainer container = mDimLayerUsers.keyAt(i); - - // TODO: We want to animate the addition and removal of Dim's instead of immediately - // acting. When we do this we need to take care to account for the "Replacing Windows" - // case (and seamless dim transfer). - if (!state.mDimming) { - mDimLayerUsers.removeAt(i); - startDimExit(container, state.mSurfaceAnimator, t); - } else { - didSomething = true; - // TODO: Once we use geometry from hierarchy this falls away. - t.setSize(state.mDimLayer, bounds.width(), bounds.height()); - t.setPosition(state.mDimLayer, bounds.left, bounds.top); - if (!state.isVisible) { - state.isVisible = true; - t.show(state.mDimLayer); - startDimEnter(container, state.mSurfaceAnimator, t); - } + if (mDimState == null) { + return false; + } + + if (!mDimState.mDimming) { + startDimExit(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t); + mDimState = null; + return false; + } else { + // TODO: Once we use geometry from hierarchy this falls away. + t.setSize(mDimState.mDimLayer, bounds.width(), bounds.height()); + t.setPosition(mDimState.mDimLayer, bounds.left, bounds.top); + if (!mDimState.isVisible) { + mDimState.isVisible = true; + t.show(mDimState.mDimLayer); + startDimEnter(mLastRequestedDimContainer, mDimState.mSurfaceAnimator, t); } + return true; } - return didSomething; } private void startDimEnter(WindowContainer container, SurfaceAnimator animator, @@ -292,7 +299,7 @@ class Dimmer { private void startAnim(WindowContainer container, SurfaceAnimator animator, SurfaceControl.Transaction t, float startAlpha, float endAlpha) { - animator.startAnimation(t, new LocalAnimationAdapter( + mSurfaceAnimatorStarter.startAnimation(animator, t, new LocalAnimationAdapter( new AlphaAnimationSpec(startAlpha, endAlpha, getDimDuration(container)), mHost.mService.mSurfaceAnimationRunner), false /* hidden */); } diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index d55a64926504..fc370d930cf3 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -153,9 +153,9 @@ class DragDropController { mDragState.mToken = dragToken; final Display display = displayContent.getDisplay(); - mDragState.register(display); - if (!mService.mInputManager.transferTouchFocus(callingWin.mInputChannel, - mDragState.getInputChannel())) { + if (!mCallback.get().registerInputChannel( + mDragState, display, mService.mInputManager, + callingWin.mInputChannel)) { Slog.e(TAG_WM, "Unable to transfer touch focus"); return null; } diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index f09a294be75b..2c3c5d281fc6 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -55,6 +55,7 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.WindowManager; +import com.android.internal.os.logging.MetricsLoggerWrapper; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethodClient; import com.android.internal.view.IInputMethodManager; @@ -508,8 +509,14 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { // on-going notification for the user to control their visibility. if (visible) { changed = mAlertWindowSurfaces.add(surfaceController); + if (changed) { + MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, true); + } } else { changed = mAlertWindowSurfaces.remove(surfaceController); + if (changed) { + MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, true); + } } if (changed) { @@ -530,8 +537,14 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { if (visible) { changed = mAppOverlaySurfaces.add(surfaceController); + if (changed) { + MetricsLoggerWrapper.logAppOverlayEnter(mUid, mPackageName, false); + } } else { changed = mAppOverlaySurfaces.remove(surfaceController); + if (changed) { + MetricsLoggerWrapper.logAppOverlayExit(mUid, mPackageName, false); + } } if (changed) { diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 0512a08c59db..83baee1ddbc6 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -53,7 +53,8 @@ class SurfaceAnimator { SurfaceControl mLeash; private final Animatable mAnimatable; private final OnAnimationFinishedCallback mInnerAnimationFinishedCallback; - private final Runnable mAnimationFinishedCallback; + @VisibleForTesting + final Runnable mAnimationFinishedCallback; private boolean mAnimationStartDelayed; /** diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 212a0d70927a..a7a2b534131d 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -27,6 +27,7 @@ import android.app.ActivityManager; import android.app.ActivityManager.TaskSnapshot; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.GraphicBuffer; import android.graphics.Rect; import android.os.Environment; @@ -40,6 +41,7 @@ import android.view.ThreadedRenderer; import android.view.WindowManager.LayoutParams; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.graphics.ColorUtils; import com.android.server.policy.WindowManagerPolicy.ScreenOffListener; import com.android.server.policy.WindowManagerPolicy.StartingSurface; import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter; @@ -324,7 +326,8 @@ class TaskSnapshotController { if (mainWindow == null) { return null; } - final int color = task.getTaskDescription().getBackgroundColor(); + final int color = ColorUtils.setAlphaComponent( + task.getTaskDescription().getBackgroundColor(), 255); final int statusBarColor = task.getTaskDescription().getStatusBarColor(); final int navigationBarColor = task.getTaskDescription().getNavigationBarColor(); final LayoutParams attrs = mainWindow.getAttrs(); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 259f8df15e31..e4db3b075e91 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -47,6 +47,7 @@ import android.app.ActivityManager.TaskSnapshot; import android.app.ActivityThread; import android.content.Context; import android.graphics.Canvas; +import android.graphics.Color; import android.graphics.GraphicBuffer; import android.graphics.Paint; import android.graphics.Rect; @@ -516,7 +517,7 @@ class TaskSnapshotSurface implements StartingSurface { @VisibleForTesting void drawStatusBarBackground(Canvas c, @Nullable Rect alreadyDrawnFrame, int statusBarHeight) { - if (statusBarHeight > 0 + if (statusBarHeight > 0 && Color.alpha(mStatusBarColor) != 0 && (alreadyDrawnFrame == null || c.getWidth() > alreadyDrawnFrame.right)) { final int rightInset = DecorView.getColorViewRightInset(mStableInsets.right, mContentInsets.right); @@ -531,7 +532,7 @@ class TaskSnapshotSurface implements StartingSurface { getNavigationBarRect(c.getWidth(), c.getHeight(), mStableInsets, mContentInsets, navigationBarRect); final boolean visible = isNavigationBarColorViewVisible(); - if (visible && !navigationBarRect.isEmpty()) { + if (visible && Color.alpha(mNavigationBarColor) != 0 && !navigationBarRect.isEmpty()) { c.drawRect(navigationBarRect, mNavigationBarPaint); } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index f2ad6fb7a888..da3a035ad8df 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -272,6 +272,8 @@ class WallpaperController { } boolean updateWallpaperOffset(WindowState wallpaperWin, int dw, int dh, boolean sync) { + int xOffset = 0; + int yOffset = 0; boolean rawChanged = false; // Set the default wallpaper x-offset to either edge of the screen (depending on RTL), to // match the behavior of most Launchers @@ -283,11 +285,8 @@ class WallpaperController { if (mLastWallpaperDisplayOffsetX != Integer.MIN_VALUE) { offset += mLastWallpaperDisplayOffsetX; } - boolean changed = wallpaperWin.mXOffset != offset; - if (changed) { - if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " + wallpaperWin + " x: " + offset); - wallpaperWin.mXOffset = offset; - } + xOffset = offset; + if (wallpaperWin.mWallpaperX != wpx || wallpaperWin.mWallpaperXStep != wpxs) { wallpaperWin.mWallpaperX = wpx; wallpaperWin.mWallpaperXStep = wpxs; @@ -301,17 +300,16 @@ class WallpaperController { if (mLastWallpaperDisplayOffsetY != Integer.MIN_VALUE) { offset += mLastWallpaperDisplayOffsetY; } - if (wallpaperWin.mYOffset != offset) { - if (DEBUG_WALLPAPER) Slog.v(TAG, "Update wallpaper " + wallpaperWin + " y: " + offset); - changed = true; - wallpaperWin.mYOffset = offset; - } + yOffset = offset; + if (wallpaperWin.mWallpaperY != wpy || wallpaperWin.mWallpaperYStep != wpys) { wallpaperWin.mWallpaperY = wpy; wallpaperWin.mWallpaperYStep = wpys; rawChanged = true; } + boolean changed = wallpaperWin.mWinAnimator.setWallpaperOffset(xOffset, yOffset); + if (rawChanged && (wallpaperWin.mAttrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS) != 0) { try { diff --git a/services/core/java/com/android/server/wm/WallpaperWindowToken.java b/services/core/java/com/android/server/wm/WallpaperWindowToken.java index 2ae5c7bd9c25..ddda027595da 100644 --- a/services/core/java/com/android/server/wm/WallpaperWindowToken.java +++ b/services/core/java/com/android/server/wm/WallpaperWindowToken.java @@ -74,10 +74,6 @@ class WallpaperWindowToken extends WindowToken { for (int wallpaperNdx = mChildren.size() - 1; wallpaperNdx >= 0; wallpaperNdx--) { final WindowState wallpaper = mChildren.get(wallpaperNdx); if (wallpaperController.updateWallpaperOffset(wallpaper, dw, dh, sync)) { - final WindowStateAnimator winAnimator = wallpaper.mWinAnimator; - winAnimator.computeShownFrameLocked(); - // No need to lay out the windows - we can just set the wallpaper position directly. - winAnimator.setWallpaperOffset(wallpaper.mShownPosition); // We only want to be synchronous with one wallpaper. sync = false; } diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 1935a44cf243..6bceda5ae3bc 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -23,12 +23,14 @@ import android.graphics.Rect; import android.graphics.Region; import android.hardware.display.DisplayManagerInternal; import android.os.IBinder; +import android.view.Display; import android.view.IInputFilter; import android.view.IWindow; +import android.view.InputChannel; import android.view.MagnificationSpec; import android.view.WindowInfo; -import android.view.animation.Animation; +import com.android.server.input.InputManagerService; import com.android.server.policy.WindowManagerPolicy; import java.util.List; @@ -153,6 +155,13 @@ public abstract class WindowManagerInternal { * An interface to customize drag and drop behaviors. */ public interface IDragDropCallback { + default boolean registerInputChannel( + DragState state, Display display, InputManagerService service, + InputChannel source) { + state.register(display); + return service.transferTouchFocus(source, state.getInputChannel()); + } + /** * Called when drag operation is starting. */ diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d565a6a7a476..676fb9f2d208 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -904,16 +904,9 @@ public class WindowManagerService extends IWindowManager.Stub public static WindowManagerService main(final Context context, final InputManagerService im, final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore, WindowManagerPolicy policy) { - return main(context, im, haveInputMethods, showBootMsgs, onlyCore, policy, - new SurfaceAnimationRunner()); - } - - public static WindowManagerService main(final Context context, final InputManagerService im, - final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore, - WindowManagerPolicy policy, SurfaceAnimationRunner surfaceAnimationRunner) { DisplayThread.getHandler().runWithScissors(() -> sInstance = new WindowManagerService(context, im, haveInputMethods, showBootMsgs, - onlyCore, policy, surfaceAnimationRunner), 0); + onlyCore, policy), 0); return sInstance; } @@ -936,7 +929,7 @@ public class WindowManagerService extends IWindowManager.Stub private WindowManagerService(Context context, InputManagerService inputManager, boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore, - WindowManagerPolicy policy, SurfaceAnimationRunner surfaceAnimationRunner) { + WindowManagerPolicy policy) { installLock(this, INDEX_WINDOW); mContext = context; mHaveInputMethods = haveInputMethods; @@ -1063,7 +1056,7 @@ public class WindowManagerService extends IWindowManager.Stub PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG_WM); mHoldingScreenWakeLock.setReferenceCounted(false); - mSurfaceAnimationRunner = surfaceAnimationRunner; + mSurfaceAnimationRunner = new SurfaceAnimationRunner(); mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean( com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a9f2e03a16c6..3bee1e8ab628 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -137,7 +137,6 @@ import static com.android.server.wm.proto.WindowStateProto.REMOVED; import static com.android.server.wm.proto.WindowStateProto.REMOVE_ON_EXIT; import static com.android.server.wm.proto.WindowStateProto.REQUESTED_HEIGHT; import static com.android.server.wm.proto.WindowStateProto.REQUESTED_WIDTH; -import static com.android.server.wm.proto.WindowStateProto.SHOWN_POSITION; import static com.android.server.wm.proto.WindowStateProto.STABLE_INSETS; import static com.android.server.wm.proto.WindowStateProto.STACK_ID; import static com.android.server.wm.proto.WindowStateProto.SURFACE_INSETS; @@ -297,12 +296,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP private final MergedConfiguration mLastReportedConfiguration = new MergedConfiguration(); /** - * Actual position of the surface shown on-screen (may be modified by animation). These are - * in the screen's coordinate space (WITH the compatibility scale applied). - */ - final Point mShownPosition = new Point(); - - /** * Insets that determine the actually visible area. These are in the application's * coordinate space (without compatibility scale applied). */ @@ -461,10 +454,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP int mWallpaperDisplayOffsetX = Integer.MIN_VALUE; int mWallpaperDisplayOffsetY = Integer.MIN_VALUE; - // Wallpaper windows: pixels offset based on above variables. - int mXOffset; - int mYOffset; - /** * This is set after IWindowSession.relayout() has been called at * least once for the window. It allows us to detect the situation @@ -745,8 +734,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mRequestedHeight = 0; mLastRequestedWidth = 0; mLastRequestedHeight = 0; - mXOffset = 0; - mYOffset = 0; mLayer = 0; mInputWindowHandle = new InputWindowHandle( mAppToken != null ? mAppToken.mInputApplicationHandle : null, this, c, @@ -1112,11 +1099,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } @Override - public Point getShownPositionLw() { - return mShownPosition; - } - - @Override public Rect getDisplayFrameLw() { return mDisplayFrame; } @@ -3134,7 +3116,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mContentInsets.writeToProto(proto, CONTENT_INSETS); mAttrs.surfaceInsets.writeToProto(proto, SURFACE_INSETS); mSurfacePosition.writeToProto(proto, SURFACE_POSITION); - mShownPosition.writeToProto(proto, SHOWN_POSITION); mWinAnimator.writeToProto(proto, ANIMATOR); proto.write(ANIMATING_EXIT, mAnimatingExit); for (int i = 0; i < mChildren.size(); i++) { @@ -3250,10 +3231,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled); pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded); } - if (mXOffset != 0 || mYOffset != 0) { - pw.print(prefix); pw.print("Offsets x="); pw.print(mXOffset); - pw.print(" y="); pw.println(mYOffset); - } if (dumpAll) { pw.print(prefix); pw.print("mGivenContentInsets="); mGivenContentInsets.printShortString(pw); @@ -3272,7 +3249,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.println(getLastReportedConfiguration()); } pw.print(prefix); pw.print("mHasSurface="); pw.print(mHasSurface); - pw.print(" mShownPosition="); mShownPosition.printShortString(pw); pw.print(" isReadyForDisplay()="); pw.print(isReadyForDisplay()); pw.print(" mWindowRemovalAllowed="); pw.println(mWindowRemovalAllowed); if (dumpAll) { @@ -4195,9 +4171,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int width = mFrame.width(); final int height = mFrame.height(); - // Compute the offset of the window in relation to the decor rect. - final int left = mXOffset + mFrame.left; - final int top = mYOffset + mFrame.top; + final int left = mFrame.left; + final int top = mFrame.top; // Initialize the decor rect to the entire frame. if (isDockedResizing()) { @@ -4392,8 +4367,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP float9[Matrix.MSKEW_Y] = mWinAnimator.mDtDx; float9[Matrix.MSKEW_X] = mWinAnimator.mDtDy; float9[Matrix.MSCALE_Y] = mWinAnimator.mDsDy; - int x = mSurfacePosition.x + mShownPosition.x; - int y = mSurfacePosition.y + mShownPosition.y; + int x = mSurfacePosition.x; + int y = mSurfacePosition.y; // If changed, also adjust transformFrameToSurfacePosition final WindowContainer parent = getParent(); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 5c9cfbb7a5a1..499322c0b17a 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -209,6 +209,12 @@ class WindowStateAnimator { float mExtraHScale = (float) 1.0; float mExtraVScale = (float) 1.0; + // An offset in pixel of the surface contents from the window position. Used for Wallpaper + // to provide the effect of scrolling within a large surface. We just use these values as + // a cache. + int mXOffset = 0; + int mYOffset = 0; + private final Rect mTmpSize = new Rect(); WindowStateAnimator(final WindowState win) { @@ -436,7 +442,7 @@ class WindowStateAnimator { flags |= SurfaceControl.SECURE; } - mTmpSize.set(w.mFrame.left + w.mXOffset, w.mFrame.top + w.mYOffset, 0, 0); + mTmpSize.set(0, 0, 0, 0); calculateSurfaceBounds(w, attrs); final int width = mTmpSize.width(); final int height = mTmpSize.height(); @@ -677,8 +683,8 @@ class WindowStateAnimator { // WindowState.prepareSurfaces expands for surface insets (in order they don't get // clipped by the WindowState surface), so we need to go into the other direction here. - tmpMatrix.postTranslate(mWin.mXOffset + mWin.mAttrs.surfaceInsets.left, - mWin.mYOffset + mWin.mAttrs.surfaceInsets.top); + tmpMatrix.postTranslate(mWin.mAttrs.surfaceInsets.left, + mWin.mAttrs.surfaceInsets.top); // "convert" it into SurfaceFlinger's format @@ -693,9 +699,6 @@ class WindowStateAnimator { mDtDx = tmpFloats[Matrix.MSKEW_Y]; mDtDy = tmpFloats[Matrix.MSKEW_X]; mDsDy = tmpFloats[Matrix.MSCALE_Y]; - float x = tmpFloats[Matrix.MTRANS_X]; - float y = tmpFloats[Matrix.MTRANS_Y]; - mWin.mShownPosition.set(Math.round(x), Math.round(y)); // Now set the alpha... but because our current hardware // can't do alpha transformation on a non-opaque surface, @@ -705,8 +708,7 @@ class WindowStateAnimator { mShownAlpha = mAlpha; if (!mService.mLimitedAlphaCompositing || (!PixelFormat.formatHasAlpha(mWin.mAttrs.format) - || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDtDy, mDsDy) - && x == frame.left && y == frame.top))) { + || (mWin.isIdentityMatrix(mDsDx, mDtDx, mDtDy, mDsDy)))) { //Slog.i(TAG_WM, "Applying alpha transform"); if (screenAnimation) { mShownAlpha *= screenRotationAnimation.getEnterTransformation().getAlpha(); @@ -736,10 +738,6 @@ class WindowStateAnimator { TAG, "computeShownFrameLocked: " + this + " not attached, mAlpha=" + mAlpha); - // WindowState.prepareSurfaces expands for surface insets (in order they don't get - // clipped by the WindowState surface), so we need to go into the other direction here. - mWin.mShownPosition.set(mWin.mXOffset + mWin.mAttrs.surfaceInsets.left, - mWin.mYOffset + mWin.mAttrs.surfaceInsets.top); mShownAlpha = mAlpha; mHaveMatrix = false; mDsDx = mWin.mGlobalScale; @@ -790,12 +788,6 @@ class WindowStateAnimator { if (DEBUG_WINDOW_CROP) Slog.d(TAG, "win=" + w + " Initial clip rect: " + clipRect + " fullscreen=" + fullscreen); - if (isFreeformResizing && !w.isChildWindow()) { - // For freeform resizing non child windows, we are using the big surface positioned - // at 0,0. Thus we must express the crop in that coordinate space. - clipRect.offset(w.mShownPosition.x, w.mShownPosition.y); - } - w.expandForSurfaceInsets(clipRect); // The clip rect was generated assuming (0,0) as the window origin, @@ -837,7 +829,7 @@ class WindowStateAnimator { return; } - mTmpSize.set(w.mShownPosition.x, w.mShownPosition.y, 0, 0); + mTmpSize.set(0, 0, 0, 0); calculateSurfaceBounds(w, attrs); mExtraHScale = (float) 1.0; @@ -971,11 +963,6 @@ class WindowStateAnimator { // then take over the scaling until the new buffer arrives, and things // will be seamless. mForceScaleUntilResize = true; - } else { - if (!w.mSeamlesslyRotated) { - mSurfaceController.setPositionInTransaction(mTmpSize.left, mTmpSize.top, - recoveringMemory); - } } // If we are ending the scaling mode. We switch to SCALING_MODE_FREEZE @@ -1167,24 +1154,26 @@ class WindowStateAnimator { mSurfaceController.setTransparentRegionHint(region); } - void setWallpaperOffset(Point shownPosition) { - final LayoutParams attrs = mWin.getAttrs(); - final int left = shownPosition.x - attrs.surfaceInsets.left; - final int top = shownPosition.y - attrs.surfaceInsets.top; + boolean setWallpaperOffset(int dx, int dy) { + if (mXOffset == dx && mYOffset == dy) { + return false; + } + mXOffset = dx; + mYOffset = dy; try { if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset"); mService.openSurfaceTransaction(); - mSurfaceController.setPositionInTransaction(mWin.mFrame.left + left, - mWin.mFrame.top + top, false); + mSurfaceController.setPositionInTransaction(dx, dy, false); applyCrop(null, false); } catch (RuntimeException e) { Slog.w(TAG, "Error positioning surface of " + mWin - + " pos=(" + left + "," + top + ")", e); + + " pos=(" + dx + "," + dy + ")", e); } finally { mService.closeSurfaceTransaction("setWallpaperOffset"); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setWallpaperOffset"); + return true; } } diff --git a/services/core/jni/BroadcastRadio/convert.cpp b/services/core/jni/BroadcastRadio/convert.cpp index 8c38e0a9e363..847222ae4ba1 100644 --- a/services/core/jni/BroadcastRadio/convert.cpp +++ b/services/core/jni/BroadcastRadio/convert.cpp @@ -395,7 +395,8 @@ static JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Propert gjni.ModuleProperties.cstor, moduleId, jServiceName.get(), prop10.classId, jImplementor.get(), jProduct.get(), jVersion.get(), jSerial.get(), prop10.numTuners, prop10.numAudioSources, prop10.supportsCapture, jBands.get(), isBgScanSupported, - jSupportedProgramTypes.get(), jSupportedIdentifierTypes.get(), jVendorInfo.get())); + jSupportedProgramTypes.get(), jSupportedIdentifierTypes.get(), nullptr, + jVendorInfo.get())); } JavaRef<jobject> ModulePropertiesFromHal(JNIEnv *env, const V1_0::Properties &properties, @@ -712,7 +713,7 @@ void register_android_server_broadcastradio_convert(JNIEnv *env) { gjni.ModuleProperties.cstor = GetMethodIDOrDie(env, modulePropertiesClass, "<init>", "(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;" "Ljava/lang/String;IIZ[Landroid/hardware/radio/RadioManager$BandDescriptor;Z" - "[I[ILjava/util/Map;)V"); + "[I[ILjava/util/Map;Ljava/util/Map;)V"); auto programInfoClass = FindClassOrDie(env, "android/hardware/radio/RadioManager$ProgramInfo"); gjni.ProgramInfo.clazz = MakeGlobalRefOrDie(env, programInfoClass); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java index 9fcf3eedd983..c4e485c1523a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/BaseIDevicePolicyManager.java @@ -177,4 +177,9 @@ abstract class BaseIDevicePolicyManager extends IDevicePolicyManager.Stub { String packageName, int userId) { return false; } + + @Override + public long forceSecurityLogs() { + return 0; + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 4c57f7f050d0..4afe1c784701 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11659,6 +11659,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return logs != null ? new ParceledListSlice<SecurityEvent>(logs) : null; } + @Override + public long forceSecurityLogs() { + enforceShell("forceSecurityLogs"); + if (!mInjector.securityLogGetLoggingEnabledProperty()) { + throw new IllegalStateException("logging is not available"); + } + return mSecurityLogMonitor.forceLogs(); + } + private void enforceCanManageDeviceAdmin() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS, null); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/SecurityLogMonitor.java b/services/devicepolicy/java/com/android/server/devicepolicy/SecurityLogMonitor.java index 3277adf479ed..fb34913a5606 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/SecurityLogMonitor.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/SecurityLogMonitor.java @@ -16,6 +16,9 @@ package com.android.server.devicepolicy; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.NANOSECONDS; + import android.app.admin.DeviceAdminReceiver; import android.app.admin.SecurityLog; import android.app.admin.SecurityLog.SecurityEvent; @@ -30,6 +33,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -55,6 +59,7 @@ class SecurityLogMonitor implements Runnable { SecurityLogMonitor(DevicePolicyManagerService service, long id) { this.mService = service; this.mId = id; + this.mLastForceNanos = System.nanoTime(); } private static final boolean DEBUG = false; // STOPSHIP if true. @@ -77,20 +82,22 @@ class SecurityLogMonitor implements Runnable { /** * How often should Device Owner be notified under normal circumstances. */ - private static final long RATE_LIMIT_INTERVAL_MILLISECONDS = TimeUnit.HOURS.toMillis(2); + private static final long RATE_LIMIT_INTERVAL_MS = TimeUnit.HOURS.toMillis(2); /** * How often to retry the notification about available logs if it is ignored or missed by DO. */ - private static final long BROADCAST_RETRY_INTERVAL_MILLISECONDS = TimeUnit.MINUTES.toMillis(30); + private static final long BROADCAST_RETRY_INTERVAL_MS = TimeUnit.MINUTES.toMillis(30); /** * Internally how often should the monitor poll the security logs from logd. */ - private static final long POLLING_INTERVAL_MILLISECONDS = TimeUnit.MINUTES.toMillis(1); + private static final long POLLING_INTERVAL_MS = TimeUnit.MINUTES.toMillis(1); /** * Overlap between two subsequent log requests, required to avoid losing out of order events. */ - private static final long OVERLAP_NANOS = TimeUnit.SECONDS.toNanos(3); + private static final long OVERLAP_NS = TimeUnit.SECONDS.toNanos(3); + /** Minimum time between forced fetch attempts. */ + private static final long FORCE_FETCH_THROTTLE_NS = TimeUnit.SECONDS.toNanos(10); @GuardedBy("mLock") private Thread mMonitorThread = null; @@ -122,6 +129,13 @@ class SecurityLogMonitor implements Runnable { @GuardedBy("mLock") private boolean mPaused = false; + /** Semaphore used to force log fetching on request from adb. */ + private final Semaphore mForceSemaphore = new Semaphore(0 /* permits */); + + /** The last timestamp when force fetch was used, to prevent abuse. */ + @GuardedBy("mForceSemaphore") + private long mLastForceNanos = 0; + void start() { Slog.i(TAG, "Starting security logging."); SecurityLog.writeEvent(SecurityLog.TAG_LOGGING_STARTED); @@ -203,7 +217,7 @@ class SecurityLogMonitor implements Runnable { Slog.i(TAG, "Resumed."); try { - notifyDeviceOwnerIfNeeded(); + notifyDeviceOwnerIfNeeded(false /* force */); } catch (InterruptedException e) { Log.w(TAG, "Thread interrupted.", e); } @@ -231,7 +245,7 @@ class SecurityLogMonitor implements Runnable { if (mAllowedToRetrieve) { mAllowedToRetrieve = false; mNextAllowedRetrievalTimeMillis = SystemClock.elapsedRealtime() - + RATE_LIMIT_INTERVAL_MILLISECONDS; + + RATE_LIMIT_INTERVAL_MS; List<SecurityEvent> result = mPendingLogs; mPendingLogs = new ArrayList<>(); mCriticalLevelLogged = false; @@ -247,8 +261,7 @@ class SecurityLogMonitor implements Runnable { /** * Requests the next (or the first) batch of events from the log with appropriate timestamp. */ - private void getNextBatch(ArrayList<SecurityEvent> newLogs) - throws IOException, InterruptedException { + private void getNextBatch(ArrayList<SecurityEvent> newLogs) throws IOException { if (mLastEventNanos < 0) { // Non-blocking read that returns all logs immediately. if (DEBUG) Slog.d(TAG, "SecurityLog.readEvents"); @@ -257,7 +270,7 @@ class SecurityLogMonitor implements Runnable { // If we have last events from the previous batch, request log events with time overlap // with previously retrieved messages to avoid losing events due to reordering in logd. final long startNanos = mLastEvents.isEmpty() - ? mLastEventNanos : Math.max(0, mLastEventNanos - OVERLAP_NANOS); + ? mLastEventNanos : Math.max(0, mLastEventNanos - OVERLAP_NS); if (DEBUG) Slog.d(TAG, "SecurityLog.readEventsSince: " + startNanos); // Non-blocking read that returns all logs with timestamps >= startNanos immediately. SecurityLog.readEventsSince(startNanos, newLogs); @@ -293,7 +306,7 @@ class SecurityLogMonitor implements Runnable { // Position of the earliest event that has to be saved. Start from the penultimate event, // going backward. int pos = newLogs.size() - 2; - while (pos >= 0 && mLastEventNanos - newLogs.get(pos).getTimeNanos() < OVERLAP_NANOS) { + while (pos >= 0 && mLastEventNanos - newLogs.get(pos).getTimeNanos() < OVERLAP_NS) { pos--; } // We either run past the start of the list or encountered an event that is too old to keep. @@ -401,10 +414,11 @@ class SecurityLogMonitor implements Runnable { public void run() { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - ArrayList<SecurityEvent> newLogs = new ArrayList<>(); + final ArrayList<SecurityEvent> newLogs = new ArrayList<>(); while (!Thread.currentThread().isInterrupted()) { try { - Thread.sleep(POLLING_INTERVAL_MILLISECONDS); + final boolean force = mForceSemaphore.tryAcquire(POLLING_INTERVAL_MS, MILLISECONDS); + getNextBatch(newLogs); mLock.lockInterruptibly(); @@ -416,7 +430,7 @@ class SecurityLogMonitor implements Runnable { saveLastEvents(newLogs); newLogs.clear(); - notifyDeviceOwnerIfNeeded(); + notifyDeviceOwnerIfNeeded(force); } catch (IOException e) { Log.e(TAG, "Failed to read security log", e); } catch (InterruptedException e) { @@ -437,7 +451,7 @@ class SecurityLogMonitor implements Runnable { Slog.i(TAG, "MonitorThread exit."); } - private void notifyDeviceOwnerIfNeeded() throws InterruptedException { + private void notifyDeviceOwnerIfNeeded(boolean force) throws InterruptedException { boolean allowRetrievalAndNotifyDO = false; mLock.lockInterruptibly(); try { @@ -445,8 +459,8 @@ class SecurityLogMonitor implements Runnable { return; } final int logSize = mPendingLogs.size(); - if (logSize >= BUFFER_ENTRIES_NOTIFICATION_LEVEL) { - // Allow DO to retrieve logs if too many pending logs + if (logSize >= BUFFER_ENTRIES_NOTIFICATION_LEVEL || (force && logSize > 0)) { + // Allow DO to retrieve logs if too many pending logs or if forced. if (!mAllowedToRetrieve) { allowRetrievalAndNotifyDO = true; } @@ -461,7 +475,7 @@ class SecurityLogMonitor implements Runnable { mAllowedToRetrieve = true; // Set the timeout to retry the notification if the DO misses it. mNextAllowedRetrievalTimeMillis = SystemClock.elapsedRealtime() - + BROADCAST_RETRY_INTERVAL_MILLISECONDS; + + BROADCAST_RETRY_INTERVAL_MS; } } finally { mLock.unlock(); @@ -472,4 +486,26 @@ class SecurityLogMonitor implements Runnable { null); } } + + /** + * Forces the logs to be fetched and made available. Returns 0 on success or timeout to wait + * before attempting in milliseconds. + */ + public long forceLogs() { + final long nowNanos = System.nanoTime(); + // We only synchronize with another calls to this function, not with the fetching thread. + synchronized (mForceSemaphore) { + final long toWaitNanos = mLastForceNanos + FORCE_FETCH_THROTTLE_NS - nowNanos; + if (toWaitNanos > 0) { + return NANOSECONDS.toMillis(toWaitNanos) + 1; // Round up. + } + mLastForceNanos = nowNanos; + // There is a race condition with the fetching thread below, but if the last permit is + // acquired just after we do the check, logs are forced anyway and that's what we need. + if (mForceSemaphore.availablePermits() == 0) { + mForceSemaphore.release(); + } + return 0; + } + } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 210fd473ccd4..3210f1a2e8b9 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -723,21 +723,9 @@ public final class SystemServer { MmsServiceBroker mmsService = null; HardwarePropertiesManagerService hardwarePropertiesService = null; - boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false); boolean disableRtt = SystemProperties.getBoolean("config.disable_rtt", false); - boolean disableMediaProjection = SystemProperties.getBoolean("config.disable_mediaproj", - false); - boolean disableSerial = SystemProperties.getBoolean("config.disable_serial", false); - boolean disableSearchManager = SystemProperties.getBoolean("config.disable_searchmanager", - false); - boolean disableTrustManager = SystemProperties.getBoolean("config.disable_trustmanager", - false); - boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", - false); boolean disableSystemTextClassifier = SystemProperties.getBoolean( "config.disable_systemtextclassifier", false); - boolean disableConsumerIr = SystemProperties.getBoolean("config.disable_consumerir", false); - boolean disableVrManager = SystemProperties.getBoolean("config.disable_vrmanager", false); boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice", false); boolean disableSlices = SystemProperties.getBoolean("config.disable_slices", false); @@ -745,6 +733,9 @@ public final class SystemServer { boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1"); + boolean isWatch = context.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WATCH); + // For debugging RescueParty if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_system", false)) { throw new RuntimeException(); @@ -819,7 +810,7 @@ public final class SystemServer { ServiceManager.addService("vibrator", vibrator); traceEnd(); - if (!disableConsumerIr) { + if (!isWatch) { traceBeginAndSlog("StartConsumerIrService"); consumerIr = new ConsumerIrService(context); ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); @@ -862,7 +853,7 @@ public final class SystemServer { traceLog.traceEnd(); }, START_HIDL_SERVICES); - if (!disableVrManager) { + if (!isWatch) { traceBeginAndSlog("StartVrManagerService"); mSystemServiceManager.startService(VrManagerService.class); traceEnd(); @@ -1030,7 +1021,7 @@ public final class SystemServer { mSystemServiceManager.startService(DevicePolicyManagerService.Lifecycle.class); traceEnd(); - if (!disableSystemUI) { + if (!isWatch) { traceBeginAndSlog("StartStatusBarManagerService"); try { statusBar = new StatusBarManagerService(context, wm); @@ -1063,11 +1054,9 @@ public final class SystemServer { } traceEnd(); - if (!disableTextServices) { - traceBeginAndSlog("StartTextServicesManager"); - mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class); - traceEnd(); - } + traceBeginAndSlog("StartTextServicesManager"); + mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class); + traceEnd(); if (!disableSystemTextClassifier) { traceBeginAndSlog("StartTextClassificationManagerService"); @@ -1204,7 +1193,6 @@ public final class SystemServer { SystemNotificationChannels.createAll(context); notification = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); - networkPolicy.bindNotificationManager(notification); traceEnd(); traceBeginAndSlog("StartDeviceMonitor"); @@ -1229,7 +1217,7 @@ public final class SystemServer { } traceEnd(); - if (!disableSearchManager) { + if (!isWatch) { traceBeginAndSlog("StartSearchManagerService"); try { mSystemServiceManager.startService(SEARCH_MANAGER_SERVICE_CLASS); @@ -1259,7 +1247,7 @@ public final class SystemServer { mSystemServiceManager.startService(DockObserver.class); traceEnd(); - if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { + if (isWatch) { traceBeginAndSlog("StartThermalObserver"); mSystemServiceManager.startService(THERMAL_OBSERVER_CLASS); traceEnd(); @@ -1291,7 +1279,7 @@ public final class SystemServer { traceEnd(); } - if (!disableSerial) { + if (!isWatch) { traceBeginAndSlog("StartSerialService"); try { // Serial port support @@ -1331,11 +1319,9 @@ public final class SystemServer { mSystemServiceManager.startService(SoundTriggerService.class); traceEnd(); - if (!disableTrustManager) { - traceBeginAndSlog("StartTrustManager"); - mSystemServiceManager.startService(TrustManagerService.class); - traceEnd(); - } + traceBeginAndSlog("StartTrustManager"); + mSystemServiceManager.startService(TrustManagerService.class); + traceEnd(); if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BACKUP)) { traceBeginAndSlog("StartBackupManager"); @@ -1392,14 +1378,16 @@ public final class SystemServer { traceEnd(); } - traceBeginAndSlog("StartNetworkTimeUpdateService"); - try { - networkTimeUpdater = new NetworkTimeUpdateService(context); - ServiceManager.addService("network_time_update_service", networkTimeUpdater); - } catch (Throwable e) { - reportWtf("starting NetworkTimeUpdate service", e); + if (!isWatch) { + traceBeginAndSlog("StartNetworkTimeUpdateService"); + try { + networkTimeUpdater = new NetworkTimeUpdateService(context); + ServiceManager.addService("network_time_update_service", networkTimeUpdater); + } catch (Throwable e) { + reportWtf("starting NetworkTimeUpdate service", e); + } + traceEnd(); } - traceEnd(); traceBeginAndSlog("StartCommonTimeManagementService"); try { @@ -1535,13 +1523,13 @@ public final class SystemServer { traceEnd(); } - if (!disableMediaProjection) { + if (!isWatch) { traceBeginAndSlog("StartMediaProjectionManager"); mSystemServiceManager.startService(MediaProjectionManagerService.class); traceEnd(); } - if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { + if (isWatch) { traceBeginAndSlog("StartWearConnectivityService"); mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS); traceEnd(); diff --git a/services/net/OWNERS b/services/net/OWNERS index 6f77e04da3c0..ce50558bf4f6 100644 --- a/services/net/OWNERS +++ b/services/net/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com lorenzo@google.com satk@google.com diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index d6cc80516485..e1c1eb298e31 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -61,10 +61,10 @@ import android.widget.Toast; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; -import com.android.internal.print.DualDumpOutputStream; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.LocalServices; import com.android.server.SystemService; @@ -708,12 +708,12 @@ public final class PrintManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { if (dumpAsProto) { - dump(new DualDumpOutputStream(new ProtoOutputStream(fd), null), + dump(new DualDumpOutputStream(new ProtoOutputStream(fd)), userStatesToDump); } else { pw.println("PRINT MANAGER STATE (dumpsys print)"); - dump(new DualDumpOutputStream(null, new IndentingPrintWriter(pw, " ")), + dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), userStatesToDump); } } finally { diff --git a/services/print/java/com/android/server/print/RemotePrintService.java b/services/print/java/com/android/server/print/RemotePrintService.java index 80b97cf995ae..f72d8eee7b9b 100644 --- a/services/print/java/com/android/server/print/RemotePrintService.java +++ b/services/print/java/com/android/server/print/RemotePrintService.java @@ -16,8 +16,8 @@ package com.android.server.print; -import static com.android.internal.print.DumpUtils.writeComponentName; import static com.android.internal.print.DumpUtils.writePrinterId; +import static com.android.internal.util.dump.DumpUtils.writeComponentName; import android.annotation.FloatRange; import android.annotation.NonNull; @@ -49,7 +49,7 @@ import android.service.print.ActivePrintServiceProto; import android.util.Slog; import com.android.internal.annotations.GuardedBy; -import com.android.internal.print.DualDumpOutputStream; +import com.android.internal.util.dump.DualDumpOutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index a69baa110f5a..ba5dde04897f 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -46,7 +46,7 @@ import android.util.TimedRemoteCaller; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.TransferPipe; -import com.android.internal.print.DualDumpOutputStream; +import com.android.internal.util.dump.DualDumpOutputStream; import libcore.io.IoUtils; diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index e2808e8245e5..84c1bb272b5a 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -20,11 +20,11 @@ import static android.content.pm.PackageManager.GET_META_DATA; import static android.content.pm.PackageManager.GET_SERVICES; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; -import static com.android.internal.print.DumpUtils.writeComponentName; import static com.android.internal.print.DumpUtils.writePrintJobInfo; import static com.android.internal.print.DumpUtils.writePrinterId; import static com.android.internal.print.DumpUtils.writePrinterInfo; -import static com.android.internal.print.DumpUtils.writeStringIfNotNull; +import static com.android.internal.util.dump.DumpUtils.writeComponentName; +import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.annotation.NonNull; @@ -81,7 +81,7 @@ import com.android.internal.R; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.BackgroundThread; -import com.android.internal.print.DualDumpOutputStream; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.print.RemotePrintService.PrintServiceCallbacks; import com.android.server.print.RemotePrintServiceRecommendationService .RemotePrintServiceRecommendationServiceCallbacks; diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index 218a2b89bbc1..b3fac48173c4 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -27,7 +27,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ ShortcutManagerTestUtils \ truth-prebuilt \ testables \ - testng + testng \ + platformprotosnano LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl diff --git a/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java b/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java index a16f118007da..2c50f2272187 100644 --- a/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java @@ -54,7 +54,6 @@ import android.os.PowerSaveState; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; -import android.provider.Settings; import android.provider.Settings.Global; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -64,7 +63,6 @@ import android.util.Pair; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; -import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.ForceAppStandbyTracker.Listener; import org.junit.Before; @@ -83,6 +81,12 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +/** + * Tests for {@link ForceAppStandbyTracker} + * + * Run with: + atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java + */ @SmallTest @RunWith(AndroidJUnit4.class) public class ForceAppStandbyTrackerTest { @@ -236,7 +240,8 @@ public class ForceAppStandbyTrackerTest { verify(mMockIActivityManager).registerUidObserver( uidObserverArgumentCaptor.capture(), eq(ActivityManager.UID_OBSERVER_GONE | ActivityManager.UID_OBSERVER_IDLE - | ActivityManager.UID_OBSERVER_ACTIVE), + | ActivityManager.UID_OBSERVER_ACTIVE + | ActivityManager.UID_OBSERVER_PROCSTATE), eq(ActivityManager.PROCESS_STATE_UNKNOWN), isNull()); verify(mMockIAppOpsService).startWatchingMode( @@ -333,23 +338,23 @@ public class ForceAppStandbyTrackerTest { mPowerSaveMode = true; mPowerSaveObserver.accept(getPowerSaveState()); - assertFalse(instance.isInForeground(UID_1)); - assertFalse(instance.isInForeground(UID_2)); - assertTrue(instance.isInForeground(Process.SYSTEM_UID)); + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); mIUidObserver.onUidActive(UID_1); areRestricted(instance, UID_1, PACKAGE_1, NONE); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE); - assertTrue(instance.isInForeground(UID_1)); - assertFalse(instance.isInForeground(UID_2)); + assertTrue(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); mIUidObserver.onUidGone(UID_1, /*disable=*/ false); areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE); - assertFalse(instance.isInForeground(UID_1)); - assertFalse(instance.isInForeground(UID_2)); + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); mIUidObserver.onUidActive(UID_1); areRestricted(instance, UID_1, PACKAGE_1, NONE); @@ -360,8 +365,8 @@ public class ForceAppStandbyTrackerTest { areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE); - assertFalse(instance.isInForeground(UID_1)); - assertFalse(instance.isInForeground(UID_2)); + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); // Toggle the app ops. mPowerSaveMode = false; @@ -456,6 +461,88 @@ public class ForceAppStandbyTrackerTest { } @Test + public void testUidStateForeground() throws Exception { + final ForceAppStandbyTrackerTestable instance = newInstance(); + callStart(instance); + + mIUidObserver.onUidActive(UID_1); + + assertTrue(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertFalse(instance.isUidInForeground(UID_1)); + assertFalse(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + + mIUidObserver.onUidStateChanged(UID_2, + ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0); + + assertTrue(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertFalse(instance.isUidInForeground(UID_1)); + assertTrue(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + + mIUidObserver.onUidStateChanged(UID_1, + ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0); + + assertTrue(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertTrue(instance.isUidInForeground(UID_1)); + assertTrue(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + mIUidObserver.onUidGone(UID_1, true); + + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertFalse(instance.isUidInForeground(UID_1)); + assertTrue(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + mIUidObserver.onUidIdle(UID_2, true); + + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertFalse(instance.isUidInForeground(UID_1)); + assertFalse(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + mIUidObserver.onUidStateChanged(UID_1, + ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0); + + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertTrue(instance.isUidInForeground(UID_1)); + assertFalse(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + + mIUidObserver.onUidStateChanged(UID_1, + ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0); + + assertFalse(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_2)); + assertTrue(instance.isUidActive(Process.SYSTEM_UID)); + + assertFalse(instance.isUidInForeground(UID_1)); + assertFalse(instance.isUidInForeground(UID_2)); + assertTrue(instance.isUidInForeground(Process.SYSTEM_UID)); + } + + @Test public void testExempt() throws Exception { final ForceAppStandbyTrackerTestable instance = newInstance(); callStart(instance); @@ -953,8 +1040,8 @@ public class ForceAppStandbyTrackerTest { setAppOps(UID_2, PACKAGE_2, true); setAppOps(UID_10_2, PACKAGE_2, true); - assertTrue(instance.isInForeground(UID_1)); - assertTrue(instance.isInForeground(UID_10_1)); + assertTrue(instance.isUidActive(UID_1)); + assertTrue(instance.isUidActive(UID_10_1)); assertFalse(instance.isRunAnyInBackgroundAppOpsAllowed(UID_2, PACKAGE_2)); assertFalse(instance.isRunAnyInBackgroundAppOpsAllowed(UID_10_2, PACKAGE_2)); @@ -965,8 +1052,8 @@ public class ForceAppStandbyTrackerTest { waitUntilMainHandlerDrain(); - assertTrue(instance.isInForeground(UID_1)); - assertFalse(instance.isInForeground(UID_10_1)); + assertTrue(instance.isUidActive(UID_1)); + assertFalse(instance.isUidActive(UID_10_1)); assertFalse(instance.isRunAnyInBackgroundAppOpsAllowed(UID_2, PACKAGE_2)); assertTrue(instance.isRunAnyInBackgroundAppOpsAllowed(UID_10_2, PACKAGE_2)); diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index 045b73c59345..184e8de15973 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -27,7 +27,6 @@ import static android.net.NetworkPolicyManager.POLICY_NONE; import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; import static android.net.NetworkPolicyManager.uidPoliciesToString; import static android.net.NetworkTemplate.buildTemplateMobileAll; -import static android.net.TrafficStats.KB_IN_BYTES; import static android.net.TrafficStats.MB_IN_BYTES; import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED; import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED; @@ -35,12 +34,12 @@ import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEF import static android.telephony.CarrierConfigManager.KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG; import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_THRESHOLD_BYTES_LONG; import static android.telephony.CarrierConfigManager.KEY_MONTHLY_DATA_CYCLE_DAY_INT; -import static android.telephony.SubscriptionPlan.LIMIT_BEHAVIOR_THROTTLED; -import static android.text.format.DateUtils.MINUTE_IN_MILLIS; +import static android.telephony.SubscriptionPlan.LIMIT_BEHAVIOR_DISABLED; import static android.text.format.Time.TIMEZONE_UTC; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED; +import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID; import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; import static com.google.common.truth.Truth.assertThat; @@ -72,9 +71,9 @@ import android.Manifest; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.IActivityManager; -import android.app.INotificationManager; import android.app.IUidObserver; import android.app.Notification; +import android.app.NotificationManager; import android.app.usage.UsageStatsManagerInternal; import android.content.Context; import android.content.Intent; @@ -107,12 +106,12 @@ import android.os.PowerSaveState; import android.os.RemoteException; import android.os.UserHandle; import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionPlan; import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.MediumTest; import android.text.TextUtils; import android.text.format.Time; import android.util.DataUnit; @@ -193,6 +192,8 @@ public class NetworkPolicyManagerServiceTest { private static final String TEST_IFACE = "test0"; private static final String TEST_SSID = "AndroidAP"; private static final String TEST_IMSI = "310210"; + private static final int TEST_SUB_ID = 42; + private static final int TEST_NET_ID = 24; private static NetworkTemplate sTemplateWifi = NetworkTemplate.buildTemplateWifi(TEST_SSID); @@ -216,7 +217,7 @@ public class NetworkPolicyManagerServiceTest { private @Mock INetworkManagementService mNetworkManager; private @Mock TrustedTime mTime; private @Mock IConnectivityManager mConnManager; - private @Mock INotificationManager mNotifManager; + private @Mock NotificationManager mNotifManager; private @Mock PackageManager mPackageManager; private @Mock IPackageManager mIpm; private @Mock SubscriptionManager mSubscriptionManager; @@ -312,6 +313,8 @@ public class NetworkPolicyManagerServiceTest { return mCarrierConfigManager; case Context.TELEPHONY_SERVICE: return mTelephonyManager; + case Context.NOTIFICATION_SERVICE: + return mNotifManager; default: return super.getSystemService(name); } @@ -340,7 +343,6 @@ public class NetworkPolicyManagerServiceTest { mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService, mNetworkManager, mIpm, mTime, mPolicyDir, true); mService.bindConnectivityManager(mConnManager); - mService.bindNotificationManager(mNotifManager); mPolicyListener = new NetworkPolicyListenerAnswer(mService); // Sets some common expectations. @@ -960,124 +962,112 @@ public class NetworkPolicyManagerServiceTest { sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); - // TODO: consider making strongly ordered mock - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, (2 * MB_IN_BYTES) - 512); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, + (2 * MB_IN_BYTES) - 512); } @Test - public void testOverWarningLimitNotification() throws Exception { - NetworkState[] state = null; - NetworkStats stats = null; - Future<String> tagFuture = null; + public void testNotificationWarningLimitSnooze() throws Exception { + // Create a place to store fake usage + final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1)); + when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) + .thenAnswer(new Answer<Long>() { + @Override + public Long answer(InvocationOnMock invocation) throws Throwable { + final NetworkStatsHistory.Entry entry = history.getValues( + invocation.getArgument(1), invocation.getArgument(2), null); + return entry.rxBytes + entry.txBytes; + } + }); - final int CYCLE_DAY = 15; - final long NOW = parseTime("2007-03-10T00:00Z"); - final long CYCLE_START = parseTime("2007-02-15T00:00Z"); - final long CYCLE_END = parseTime("2007-03-15T00:00Z"); + // Get active mobile network in place + expectMobileDefaults(); + mService.updateNetworks(); - setCurrentTimeMillis(NOW); + // Define simple data plan + final SubscriptionPlan plan = SubscriptionPlan.Builder + .createRecurringMonthly(ZonedDateTime.parse("2015-11-01T00:00:00.00Z")) + .setDataLimit(DataUnit.MEGABYTES.toBytes(1800), LIMIT_BEHAVIOR_DISABLED) + .build(); + mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[] { plan }, + mServiceContext.getOpPackageName()); - // assign wifi policy - state = new NetworkState[] {}; - stats = new NetworkStats(getElapsedRealtime(), 1) - .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); + // We're 20% through the month (6 days) + final long start = parseTime("2015-11-01T00:00Z"); + final long end = parseTime("2015-11-07T00:00Z"); + setCurrentTimeMillis(end); + expectCurrentTime(); + // Normal usage means no notification { - expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, - CYCLE_END)).thenReturn(stats.getTotalBytes()); - - mPolicyListener.expect().onMeteredIfacesChanged(any()); - setNetworkPolicies(new NetworkPolicy(sTemplateWifi, CYCLE_DAY, TIMEZONE_UTC, 1 - * MB_IN_BYTES, 2 * MB_IN_BYTES, false)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(any()); - verifyPolicyDataEnable(TYPE_WIFI, true); - } - - // bring up wifi network - incrementCurrentTime(MINUTE_IN_MILLIS); - state = new NetworkState[] { buildWifi() }; - stats = new NetworkStats(getElapsedRealtime(), 1) - .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); + history.removeBucketsBefore(Long.MAX_VALUE); + history.recordData(start, end, + new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0)); - { - expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, - CYCLE_END)).thenReturn(stats.getTotalBytes()); + reset(mTelephonyManager, mNetworkManager, mNotifManager); + expectMobileDefaults(); - mPolicyListener.expect().onMeteredIfacesChanged(any()); - mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION)); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); + mService.updateNetworks(); - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, 2 * MB_IN_BYTES); + verify(mTelephonyManager, atLeastOnce()).setPolicyDataEnabled(true, TEST_SUB_ID); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, + DataUnit.MEGABYTES.toBytes(1800 - 360)); + verify(mNotifManager, never()).notifyAsUser(any(), anyInt(), any(), any()); } - // go over warning, which should kick notification - incrementCurrentTime(MINUTE_IN_MILLIS); - stats = new NetworkStats(getElapsedRealtime(), 1) - .addIfaceValues(TEST_IFACE, 1536 * KB_IN_BYTES, 15L, 0L, 0L); - + // Push over warning { - expectCurrentTime(); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, - CYCLE_END)).thenReturn(stats.getTotalBytes()); - tagFuture = expectEnqueueNotification(); + history.removeBucketsBefore(Long.MAX_VALUE); + history.recordData(start, end, + new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1799), 0L, 0L, 0L, 0)); - mNetworkObserver.limitReached(null, TEST_IFACE); + reset(mTelephonyManager, mNetworkManager, mNotifManager); + expectMobileDefaults(); - assertNotificationType(TYPE_WARNING, tagFuture.get()); - verifyPolicyDataEnable(TYPE_WIFI, true); + mService.updateNetworks(); + verify(mTelephonyManager, atLeastOnce()).setPolicyDataEnabled(true, TEST_SUB_ID); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, + DataUnit.MEGABYTES.toBytes(1800 - 1799)); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_WARNING), + isA(Notification.class), eq(UserHandle.ALL)); } - // go over limit, which should kick notification and dialog - incrementCurrentTime(MINUTE_IN_MILLIS); - stats = new NetworkStats(getElapsedRealtime(), 1) - .addIfaceValues(TEST_IFACE, 5 * MB_IN_BYTES, 512L, 0L, 0L); - + // Push over limit { - expectCurrentTime(); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, - CYCLE_END)).thenReturn(stats.getTotalBytes()); - tagFuture = expectEnqueueNotification(); + history.removeBucketsBefore(Long.MAX_VALUE); + history.recordData(start, end, + new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1810), 0L, 0L, 0L, 0)); - mNetworkObserver.limitReached(null, TEST_IFACE); + reset(mTelephonyManager, mNetworkManager, mNotifManager); + expectMobileDefaults(); - assertNotificationType(TYPE_LIMIT, tagFuture.get()); - verifyPolicyDataEnable(TYPE_WIFI, false); - } + mService.updateNetworks(); - // now snooze policy, which should remove quota - incrementCurrentTime(MINUTE_IN_MILLIS); + verify(mTelephonyManager, atLeastOnce()).setPolicyDataEnabled(false, TEST_SUB_ID); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, 1); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_LIMIT), + isA(Notification.class), eq(UserHandle.ALL)); + } + // Snooze limit { - expectCurrentTime(); - when(mConnManager.getAllNetworkState()).thenReturn(state); - when(mStatsService.getNetworkTotalBytes(sTemplateWifi, CYCLE_START, - CYCLE_END)).thenReturn(stats.getTotalBytes()); - tagFuture = expectEnqueueNotification(); + reset(mTelephonyManager, mNetworkManager, mNotifManager); + expectMobileDefaults(); - mPolicyListener.expect().onMeteredIfacesChanged(any()); - mService.snoozeLimit(sTemplateWifi); - mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); + mService.snoozeLimit(NetworkTemplate.buildTemplateMobileAll(TEST_IMSI)); + mService.updateNetworks(); - assertNotificationType(TYPE_LIMIT_SNOOZED, tagFuture.get()); - // snoozed interface still has high quota so background data is - // still restricted. - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); - verifyPolicyDataEnable(TYPE_WIFI, true); + verify(mTelephonyManager, atLeastOnce()).setPolicyDataEnabled(true, TEST_SUB_ID); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, + Long.MAX_VALUE); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_LIMIT_SNOOZED), + isA(Notification.class), eq(UserHandle.ALL)); } } @Test - public void testRapidNotification() throws Exception { + public void testNotificationRapid() throws Exception { // Create a place to store fake usage final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1)); when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) @@ -1090,38 +1080,33 @@ public class NetworkPolicyManagerServiceTest { } }); + // Get active mobile network in place + expectMobileDefaults(); + mService.updateNetworks(); + // Define simple data plan which gives us effectively 60MB/day final SubscriptionPlan plan = SubscriptionPlan.Builder .createRecurringMonthly(ZonedDateTime.parse("2015-11-01T00:00:00.00Z")) - .setDataLimit(DataUnit.MEGABYTES.toBytes(1800), LIMIT_BEHAVIOR_THROTTLED) + .setDataLimit(DataUnit.MEGABYTES.toBytes(1800), LIMIT_BEHAVIOR_DISABLED) .build(); - mService.setSubscriptionPlans(42, new SubscriptionPlan[] { plan }, + mService.setSubscriptionPlans(TEST_SUB_ID, new SubscriptionPlan[] { plan }, mServiceContext.getOpPackageName()); - // And get that active network in place - when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] { - new NetworkState(null, new LinkProperties(), - new NetworkCapabilities().addTransportType(TRANSPORT_CELLULAR) - .setNetworkSpecifier(new StringNetworkSpecifier("42")), - new Network(42), TEST_IMSI, null) - }); - mService.updateNetworks(); - // We're 20% through the month (6 days) final long start = parseTime("2015-11-01T00:00Z"); final long end = parseTime("2015-11-07T00:00Z"); setCurrentTimeMillis(end); + expectCurrentTime(); - // Using 20% of data in 20% is normal + // Using 20% data in 20% time is normal { history.removeBucketsBefore(Long.MAX_VALUE); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0)); reset(mNotifManager); - mService.updateNotifications(); - verify(mNotifManager, never()).enqueueNotificationWithTag(any(), any(), any(), - anyInt(), any(), anyInt()); + mService.updateNetworks(); + verify(mNotifManager, never()).notifyAsUser(any(), anyInt(), any(), any()); } // Using 80% data in 20% time is alarming @@ -1131,9 +1116,9 @@ public class NetworkPolicyManagerServiceTest { new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1440), 0L, 0L, 0L, 0)); reset(mNotifManager); - mService.updateNotifications(); - verify(mNotifManager, atLeastOnce()).enqueueNotificationWithTag(any(), any(), any(), - anyInt(), any(), anyInt()); + mService.updateNetworks(); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_RAPID), + isA(Notification.class), eq(UserHandle.ALL)); } } @@ -1165,9 +1150,8 @@ public class NetworkPolicyManagerServiceTest { true)); mPolicyListener.waitAndVerify().onMeteredIfacesChanged(eq(new String[]{TEST_IFACE})); - verifyPolicyDataEnable(TYPE_WIFI, true); - verifyRemoveInterfaceQuota(TEST_IFACE); - verifySetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); + verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(TEST_IFACE, + Long.MAX_VALUE); } } @@ -1426,6 +1410,26 @@ public class NetworkPolicyManagerServiceTest { true); } + private NetworkInfo buildNetworkInfo() { + final NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, + TelephonyManager.NETWORK_TYPE_LTE, null, null); + ni.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null); + return ni; + } + + private LinkProperties buildLinkProperties(String iface) { + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(iface); + return lp; + } + + private NetworkCapabilities buildNetworkCapabilities(int subId) { + final NetworkCapabilities nc = new NetworkCapabilities(); + nc.addTransportType(TRANSPORT_CELLULAR); + nc.setNetworkSpecifier(new StringNetworkSpecifier(String.valueOf(subId))); + return nc; + } + private NetworkPolicy buildDefaultFakeMobilePolicy() { NetworkPolicy p = mService.buildDefaultMobilePolicy(FAKE_SUB_ID, FAKE_SUBSCRIBER_ID); // set a deterministic cycle date @@ -1478,30 +1482,21 @@ public class NetworkPolicyManagerServiceTest { when(mTime.getCacheCertainty()).thenReturn(0L); } - private Future<String> expectEnqueueNotification() throws Exception { - final FutureAnswer<String> futureAnswer = new FutureAnswer<String>(2); - doAnswer(futureAnswer).when(mNotifManager).enqueueNotificationWithTag( - anyString(), anyString(), anyString() /* capture here (index 2)*/, - anyInt(), isA(Notification.class), anyInt()); - return futureAnswer; - } - private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception { when(mIpm.checkUidPermission(Manifest.permission.INTERNET, uid)).thenReturn( hasIt ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED); } - private void verifySetInterfaceQuota(String iface, long quotaBytes) throws Exception { - verify(mNetworkManager, atLeastOnce()).setInterfaceQuota(iface, quotaBytes); - } - - private void verifyRemoveInterfaceQuota(String iface) throws Exception { - verify(mNetworkManager, atLeastOnce()).removeInterfaceQuota(iface); - } - - private Future<Void> verifyPolicyDataEnable(int type, boolean enabled) throws Exception { - // TODO: bring back this test - return null; + private void expectMobileDefaults() throws Exception { + when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn( + new int[] { TEST_SUB_ID }); + when(mTelephonyManager.getSubscriberId(TEST_SUB_ID)).thenReturn(TEST_IMSI); + when(mConnManager.getAllNetworkState()).thenReturn(new NetworkState[] { + new NetworkState(buildNetworkInfo(), + buildLinkProperties(TEST_IFACE), + buildNetworkCapabilities(TEST_SUB_ID), + new Network(TEST_NET_ID), TEST_IMSI, null) + }); } private void verifyAdvisePersistThreshold() throws Exception { @@ -1519,21 +1514,6 @@ public class NetworkPolicyManagerServiceTest { } } - private static class FutureAnswer<T> extends TestAbstractFuture<T> implements Answer<Void> { - private final int index; - - FutureAnswer(int index) { - this.index = index; - } - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - @SuppressWarnings("unchecked") - T captured = (T) invocation.getArguments()[index]; - set(captured); - return null; - } - } - private static void assertTimeEquals(long expected, long actual) { if (expected != actual) { fail("expected " + formatTime(expected) + " but was actually " + formatTime(actual)); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java index fc17da843a9a..2378e6d49b88 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackSupervisorTests.java @@ -16,6 +16,8 @@ package com.android.server.am; +import static android.app.ActivityManager.START_DELIVERED_TO_TOP; +import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; @@ -25,6 +27,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; +import android.app.ActivityManager; +import android.app.WaitResult; import android.content.ComponentName; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; @@ -45,7 +49,7 @@ import static com.android.server.am.ActivityStackSupervisor.MATCH_TASK_IN_STACKS * Tests for the {@link ActivityStackSupervisor} class. * * Build/Install/Run: - * bit FrameworksServicesTests:com.android.server.am.ActivityStackSupervisorTests + * atest FrameworksServicesTests:com.android.server.am.ActivityStackSupervisorTests */ @MediumTest @Presubmit @@ -146,4 +150,34 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase { assertFalse(mSupervisor.mStoppingActivities.contains(firstActivity)); } + + /** + * Ensures that waiting results are notified of launches. + */ + @Test + public void testReportWaitingActivityLaunchedIfNeeded() throws Exception { + final ActivityRecord firstActivity = new ActivityBuilder(mService).setCreateTask(true) + .setStack(mFullscreenStack).build(); + + // #notifyAll will be called on the ActivityManagerService. we must hold the object lock + // when this happens. + synchronized (mSupervisor.mService) { + final WaitResult taskToFrontWait = new WaitResult(); + mSupervisor.mWaitingActivityLaunched.add(taskToFrontWait); + mSupervisor.reportWaitingActivityLaunchedIfNeeded(firstActivity, START_TASK_TO_FRONT); + + assertTrue(mSupervisor.mWaitingActivityLaunched.isEmpty()); + assertEquals(taskToFrontWait.result, START_TASK_TO_FRONT); + assertEquals(taskToFrontWait.who, null); + + final WaitResult deliverToTopWait = new WaitResult(); + mSupervisor.mWaitingActivityLaunched.add(deliverToTopWait); + mSupervisor.reportWaitingActivityLaunchedIfNeeded(firstActivity, + START_DELIVERED_TO_TOP); + + assertTrue(mSupervisor.mWaitingActivityLaunched.isEmpty()); + assertEquals(deliverToTopWait.result, START_DELIVERED_TO_TOP); + assertEquals(deliverToTopWait.who, firstActivity.realActivity); + } + } } diff --git a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java index d2ae22b43445..1cbb3991e461 100644 --- a/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/am/LockTaskControllerTest.java @@ -90,7 +90,6 @@ public class LockTaskControllerTest { @Mock private IStatusBarService mStatusBarService; @Mock private WindowManagerService mWindowManager; @Mock private LockPatternUtils mLockPatternUtils; - @Mock private LockTaskNotify mLockTaskNotify; @Mock private StatusBarManagerInternal mStatusBarManagerInternal; @Mock private TelecomManager mTelecomManager; @Mock private RecentTasks mRecentTasks; @@ -123,7 +122,6 @@ public class LockTaskControllerTest { mLockTaskController.mDevicePolicyManager = mDevicePolicyManager; mLockTaskController.mTelecomManager = mTelecomManager; mLockTaskController.mLockPatternUtils = mLockPatternUtils; - mLockTaskController.mLockTaskNotify = mLockTaskNotify; LocalServices.removeServiceForTest(StatusBarManagerInternal.class); LocalServices.addService(StatusBarManagerInternal.class, mStatusBarManagerInternal); @@ -208,7 +206,7 @@ public class LockTaskControllerTest { // THEN lock task mode should be started verifyLockTaskStarted(STATUS_BAR_MASK_PINNED, DISABLE2_NONE); // THEN screen pinning toast should be shown - verify(mLockTaskNotify).showPinningStartToast(); + verify(mStatusBarService).showPinningEnterExitToast(true /* entering */); } @Test @@ -377,7 +375,7 @@ public class LockTaskControllerTest { // THEN the keyguard should be shown verify(mLockPatternUtils).requireCredentialEntry(UserHandle.USER_ALL); // THEN screen pinning toast should be shown - verify(mLockTaskNotify).showPinningExitToast(); + verify(mStatusBarService).showPinningEnterExitToast(false /* entering */); } @Test diff --git a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java index deaa34ca9f51..7c3ea4ffe86a 100644 --- a/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java +++ b/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java @@ -25,7 +25,7 @@ import android.test.suitebuilder.annotation.SmallTest; /** * Test for SyncOperation. * - * bit FrameworksServicesTests:com.android.server.content.SyncOperationTest + * atest ${ANDROID_BUILD_TOP}/frameworks/base/services/tests/servicestests/src/com/android/server/content/SyncOperationTest.java */ @SmallTest public class SyncOperationTest extends AndroidTestCase { @@ -59,7 +59,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority1", b1, - false); + false, + /*isAppStandbyExempted=*/ false); // Same as op1 but different time infos SyncOperation op2 = new SyncOperation(account1, 0, @@ -67,7 +68,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority1", b1, - false); + false, + /*isAppStandbyExempted=*/ false); // Same as op1 but different authority SyncOperation op3 = new SyncOperation(account1, 0, @@ -75,7 +77,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority2", b1, - false); + false, + /*isAppStandbyExempted=*/ false); // Same as op1 but different account SyncOperation op4 = new SyncOperation(account2, 0, @@ -83,7 +86,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority1", b1, - false); + false, + /*isAppStandbyExempted=*/ false); // Same as op1 but different bundle SyncOperation op5 = new SyncOperation(account1, 0, @@ -91,7 +95,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority1", b2, - false); + false, + /*isAppStandbyExempted=*/ false); assertEquals(op1.key, op2.key); assertNotSame(op1.key, op3.key); @@ -111,7 +116,8 @@ public class SyncOperationTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, "authority1", b1, - false); + false, + /*isAppStandbyExempted=*/ false); PersistableBundle pb = op1.toJobInfoExtras(); SyncOperation op2 = SyncOperation.maybeCreateFromJobExtras(pb); @@ -138,7 +144,8 @@ public class SyncOperationTest extends AndroidTestCase { "provider", 0); Bundle extras = new Bundle(); SyncOperation periodic = new SyncOperation(ep, 0, "package", 0, 0, extras, false, true, - SyncOperation.NO_JOB_ID, 60000, 10000); + SyncOperation.NO_JOB_ID, 60000, 10000, + /*isAppStandbyExempted=*/ false); SyncOperation oneoff = periodic.createOneTimeSyncOperation(); assertFalse("Conversion to oneoff sync failed.", oneoff.isPeriodic); assertEquals("Period not restored", periodic.periodMillis, oneoff.periodMillis); diff --git a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java index 85de1f1c3e86..7209c7971145 100644 --- a/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java +++ b/services/tests/servicestests/src/com/android/server/content/SyncStorageEngineTest.java @@ -31,6 +31,7 @@ import android.test.mock.MockContext; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; +import android.test.suitebuilder.annotation.Suppress; import com.android.internal.os.AtomicFile; @@ -44,6 +45,7 @@ import java.io.FileOutputStream; * * TODO Broken. Fix it. b/62485315 */ +@Suppress public class SyncStorageEngineTest extends AndroidTestCase { protected Account account1; @@ -101,7 +103,8 @@ public class SyncStorageEngineTest extends AndroidTestCase { SyncOperation.REASON_PERIODIC, SyncStorageEngine.SOURCE_LOCAL, authority, - Bundle.EMPTY, true); + Bundle.EMPTY, true, + /*isAppStandbyExempted=*/ false); long historyId = engine.insertStartSyncEvent(op, time0); long time1 = time0 + SyncStorageEngine.MILLIS_IN_4WEEKS * 2; engine.stopSyncEvent(historyId, time1 - time0, "yay", 0, 0); diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java index c863aabb905f..473a813c3838 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java @@ -39,6 +39,7 @@ import android.Manifest; import android.os.Binder; import android.os.ServiceSpecificException; import android.os.UserHandle; +import android.security.KeyStore; import android.security.keystore.AndroidKeyStoreSecretKey; import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; @@ -49,6 +50,7 @@ import android.support.test.filters.SmallTest; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; +import com.android.server.locksettings.recoverablekeystore.storage.ApplicationKeyStorage; import com.android.server.locksettings.recoverablekeystore.storage.RecoverableKeyStoreDb; import com.android.server.locksettings.recoverablekeystore.storage.RecoverySessionStorage; import com.android.server.locksettings.recoverablekeystore.storage.RecoverySnapshotStorage; @@ -135,6 +137,8 @@ public class RecoverableKeyStoreManagerTest { @Mock private RecoverySnapshotListenersStorage mMockListenersStorage; @Mock private KeyguardManager mKeyguardManager; @Mock private PlatformKeyManager mPlatformKeyManager; + @Mock private KeyStore mKeyStore; + @Mock private ApplicationKeyStorage mApplicationKeyStorage; private RecoverableKeyStoreDb mRecoverableKeyStoreDb; private File mDatabaseFile; @@ -164,12 +168,14 @@ public class RecoverableKeyStoreManagerTest { mRecoverableKeyStoreManager = new RecoverableKeyStoreManager( mMockContext, + mKeyStore, mRecoverableKeyStoreDb, mRecoverySessionStorage, Executors.newSingleThreadExecutor(), mRecoverySnapshotStorage, mMockListenersStorage, - mPlatformKeyManager); + mPlatformKeyManager, + mApplicationKeyStorage); } @After diff --git a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java new file mode 100644 index 000000000000..9f4b75462134 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2018 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.net; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import android.net.IpConfiguration; +import android.net.IpConfiguration.IpAssignment; +import android.net.IpConfiguration.ProxySettings; +import android.net.LinkAddress; +import android.net.NetworkUtils; +import android.net.ProxyInfo; +import android.net.StaticIpConfiguration; +import android.support.test.runner.AndroidJUnit4; +import android.util.ArrayMap; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Unit tests for {@link IpConfigStore} + */ +@RunWith(AndroidJUnit4.class) +public class IpConfigStoreTest { + + @Test + public void backwardCompatibility2to3() throws IOException { + final int KEY_CONFIG = 17; + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + DataOutputStream outputStream = new DataOutputStream(byteStream); + + IpConfiguration expectedConfig = new IpConfiguration(IpAssignment.DHCP, + ProxySettings.NONE, null, null); + + // Emulate writing to old format. + writeDhcpConfigV2(outputStream, KEY_CONFIG, expectedConfig); + + InputStream in = new ByteArrayInputStream(byteStream.toByteArray()); + ArrayMap<String, IpConfiguration> configurations = IpConfigStore.readIpConfigurations(in); + + assertNotNull(configurations); + assertEquals(1, configurations.size()); + IpConfiguration actualConfig = configurations.get(String.valueOf(KEY_CONFIG)); + assertNotNull(actualConfig); + assertEquals(expectedConfig, actualConfig); + } + + @Test + public void staticIpMultiNetworks() throws Exception { + final String IFACE_1 = "eth0"; + final String IFACE_2 = "eth1"; + final String IP_ADDR_1 = "192.168.1.10/24"; + final String IP_ADDR_2 = "192.168.1.20/24"; + final String DNS_IP_ADDR_1 = "1.2.3.4"; + final String DNS_IP_ADDR_2 = "5.6.7.8"; + + StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration(); + staticIpConfiguration.ipAddress = new LinkAddress(IP_ADDR_1); + staticIpConfiguration.dnsServers.add(NetworkUtils.numericToInetAddress(DNS_IP_ADDR_1)); + staticIpConfiguration.dnsServers.add(NetworkUtils.numericToInetAddress(DNS_IP_ADDR_2)); + + ProxyInfo proxyInfo = new ProxyInfo("10.10.10.10", 88, "host1,host2"); + + IpConfiguration expectedConfig1 = new IpConfiguration(IpAssignment.STATIC, + ProxySettings.STATIC, staticIpConfiguration, proxyInfo); + IpConfiguration expectedConfig2 = new IpConfiguration(expectedConfig1); + expectedConfig2.getStaticIpConfiguration().ipAddress = new LinkAddress(IP_ADDR_2); + + ArrayMap<String, IpConfiguration> expectedNetworks = new ArrayMap<>(); + expectedNetworks.put(IFACE_1, expectedConfig1); + expectedNetworks.put(IFACE_2, expectedConfig2); + + MockedDelayedDiskWrite writer = new MockedDelayedDiskWrite(); + IpConfigStore store = new IpConfigStore(writer); + store.writeIpConfigurations("file/path/not/used/", expectedNetworks); + + InputStream in = new ByteArrayInputStream(writer.byteStream.toByteArray()); + ArrayMap<String, IpConfiguration> actualNetworks = IpConfigStore.readIpConfigurations(in); + assertNotNull(actualNetworks); + assertEquals(2, actualNetworks.size()); + assertEquals(expectedNetworks.get(IFACE_1), actualNetworks.get(IFACE_1)); + assertEquals(expectedNetworks.get(IFACE_2), actualNetworks.get(IFACE_2)); + } + + // This is simplified snapshot of code that was used to store values in V2 format (key as int). + private static void writeDhcpConfigV2(DataOutputStream out, int configKey, + IpConfiguration config) throws IOException { + out.writeInt(2); // VERSION 2 + switch (config.ipAssignment) { + case DHCP: + out.writeUTF("ipAssignment"); + out.writeUTF(config.ipAssignment.toString()); + break; + default: + fail("Not supported in test environment"); + } + + out.writeUTF("id"); + out.writeInt(configKey); + out.writeUTF("eos"); + } + + /** Synchronously writes into given byte steam */ + private static class MockedDelayedDiskWrite extends DelayedDiskWrite { + final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + + @Override + public void write(String filePath, Writer w) { + DataOutputStream outputStream = new DataOutputStream(byteStream); + + try { + w.onWriteCalled(outputStream); + } catch (IOException e) { + fail(); + } + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/ReportUtilsTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java index 395969eb7c77..cb4f6c5f9351 100644 --- a/services/tests/servicestests/src/com/android/server/net/watchlist/ReportUtilsTests.java +++ b/services/tests/servicestests/src/com/android/server/net/watchlist/ReportEncoderTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 The Android Open Source Project + * Copyright (C) 2018 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. @@ -16,15 +16,13 @@ package com.android.server.net.watchlist; -import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; -import com.android.internal.util.HexDump; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -37,18 +35,21 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; +import com.android.service.nano.NetworkWatchlistReportProto; +import com.android.service.nano.NetworkWatchlistAppResultProto; + /** - * runtest frameworks-services -c com.android.server.net.watchlist.ReportUtilsTests + * runtest frameworks-services -c com.android.server.net.watchlist.ReportEncoderTests */ @RunWith(AndroidJUnit4.class) @SmallTest -public class ReportUtilsTests { +public class ReportEncoderTests { private static final String TEST_XML_1 = "NetworkWatchlistTest/watchlist_config_test1.xml"; private static final String TEST_XML_1_HASH = "C99F27A08B1FDB15B101098E12BB2A0AA0D474E23C50F24920A52AB2322BFD94"; - private static final String REPORT_HEADER_MAGIC = "8D370AAC"; - private static final String REPORT_HEADER_VERSION = "0001"; + private static final int REPORT_VERSION = 1; + private static final int EXPECTED_REPORT_VERSION = 1; private Context mContext; private File mTestXmlFile; @@ -56,7 +57,7 @@ public class ReportUtilsTests { @Before public void setUp() throws Exception { mContext = InstrumentationRegistry.getContext(); - mTestXmlFile = new File(mContext.getFilesDir(), "test_watchlist_config.xml"); + mTestXmlFile = new File(mContext.getFilesDir(), "test_watchlist_config.xml"); mTestXmlFile.delete(); } @@ -67,26 +68,28 @@ public class ReportUtilsTests { @Test public void testReportUtils_serializeReport() throws Exception { - final byte[] expectedResult = HexDump.hexStringToByteArray( - REPORT_HEADER_MAGIC + REPORT_HEADER_VERSION + TEST_XML_1_HASH - + "B86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB43" + "01" - + "C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB44" + "00" - + "D86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB45" + "00" - + "E86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB46" + "01" - + "F86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB47" + "01" - ); - HashMap<String, Boolean> input = new HashMap<>(); - input.put("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB44", false); - input.put("B86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB43", true); - input.put("D86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB45", false); - input.put("E86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB46", true); - input.put("F86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB47", true); + HashMap<String, Boolean> map = new HashMap<>(); + map.put("C86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB44", false); + map.put("B86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB43", true); + map.put("D86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB45", false); + map.put("E86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB46", true); + map.put("F86F9D37425340B635F43D6BC2506630761ADA71F5E6BBDBCA4651C479F9FB47", true); copyWatchlistConfigXml(mContext, TEST_XML_1, mTestXmlFile); WatchlistConfig config = new WatchlistConfig(mTestXmlFile); - byte[] result = ReportEncoder.serializeReport(config, input); - assertArrayEquals(expectedResult, result); + final byte[] result = ReportEncoder.serializeReport(config, map); + + // Parse result back to NetworkWatchlistReportDumpProto + final NetworkWatchlistReportProto reportProto = + NetworkWatchlistReportProto.parseFrom(result); + assertEquals(REPORT_VERSION, reportProto.reportVersion); + assertEquals(TEST_XML_1_HASH, reportProto.watchlistConfigHash); + assertEquals(map.size(), reportProto.appResult.length); + for (NetworkWatchlistAppResultProto appProto : reportProto.appResult) { + final String digest = appProto.appDigest; + assertEquals(map.get(digest), appProto.encodedResult); + } } private static void copyWatchlistConfigXml(Context context, String xmlAsset, File outFile) diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java index c2072df75bd8..f559986a6f15 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/DexoptOptionsTests.java @@ -53,6 +53,7 @@ public class DexoptOptionsTests { assertFalse(opt.isDowngrade()); assertFalse(opt.isForce()); assertFalse(opt.isDexoptIdleBackgroundJob()); + assertFalse(opt.isDexoptInstallWithDexMetadata()); } @Test @@ -65,7 +66,8 @@ public class DexoptOptionsTests { DexoptOptions.DEXOPT_ONLY_SHARED_DEX | DexoptOptions.DEXOPT_DOWNGRADE | DexoptOptions.DEXOPT_AS_SHARED_LIBRARY | - DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; + DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB | + DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE; DexoptOptions opt = new DexoptOptions(mPackageName, mCompilerFilter, flags); assertEquals(mPackageName, opt.getPackageName()); @@ -79,6 +81,7 @@ public class DexoptOptionsTests { assertTrue(opt.isForce()); assertTrue(opt.isDexoptAsSharedLibrary()); assertTrue(opt.isDexoptIdleBackgroundJob()); + assertTrue(opt.isDexoptInstallWithDexMetadata()); } @Test diff --git a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java index a628b7b70c15..5de393c7ae2b 100644 --- a/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java +++ b/services/tests/servicestests/src/com/android/server/policy/FakeWindowState.java @@ -79,11 +79,6 @@ public class FakeWindowState implements WindowManagerPolicy.WindowState { } @Override - public Point getShownPositionLw() { - return new Point(parentFrame.left, parentFrame.top); - } - - @Override public Rect getDisplayFrameLw() { return displayFrame; } 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 40964c03db81..78b6077dc1bd 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -24,6 +24,7 @@ import static android.app.usage.UsageStatsManager.REASON_PREDICTED; import static android.app.usage.UsageStatsManager.REASON_TIMEOUT; import static android.app.usage.UsageStatsManager.REASON_USAGE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; +import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; @@ -35,6 +36,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; @@ -80,6 +82,8 @@ public class AppStandbyControllerTests { private static final String PACKAGE_1 = "com.example.foo"; private static final int UID_1 = 10000; + private static final String PACKAGE_EXEMPTED_1 = "com.android.exempted"; + private static final int UID_EXEMPTED_1 = 10001; private static final int USER_ID = 0; private static final int USER_ID2 = 10; @@ -116,7 +120,7 @@ public class AppStandbyControllerTests { List<String> mPowerSaveWhitelistExceptIdle = new ArrayList<>(); boolean mDisplayOn; DisplayManager.DisplayListener mDisplayListener; - String mBoundWidgetPackage; + String mBoundWidgetPackage = PACKAGE_EXEMPTED_1; MyInjector(Context context, Looper looper) { super(context, looper); @@ -223,10 +227,21 @@ public class AppStandbyControllerTests { pi.packageName = PACKAGE_1; packages.add(pi); + PackageInfo pie = new PackageInfo(); + pie.applicationInfo = new ApplicationInfo(); + pie.applicationInfo.uid = UID_EXEMPTED_1; + pie.packageName = PACKAGE_EXEMPTED_1; + packages.add(pie); + doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt()); try { - doReturn(UID_1).when(mockPm).getPackageUidAsUser(anyString(), anyInt(), anyInt()); - doReturn(pi.applicationInfo).when(mockPm).getApplicationInfo(anyString(), anyInt()); + doReturn(UID_1).when(mockPm).getPackageUidAsUser(eq(PACKAGE_1), anyInt(), anyInt()); + doReturn(UID_EXEMPTED_1).when(mockPm).getPackageUidAsUser(eq(PACKAGE_EXEMPTED_1), + anyInt(), anyInt()); + doReturn(pi.applicationInfo).when(mockPm).getApplicationInfo(eq(pi.packageName), + anyInt()); + doReturn(pie.applicationInfo).when(mockPm).getApplicationInfo(eq(pie.packageName), + anyInt()); } catch (PackageManager.NameNotFoundException nnfe) {} } @@ -239,14 +254,21 @@ public class AppStandbyControllerTests { private AppStandbyController setupController() throws Exception { mInjector.mElapsedRealtime = 0; + setupPm(mInjector.getContext().getPackageManager()); AppStandbyController controller = new AppStandbyController(mInjector); + controller.initializeDefaultsForSystemApps(USER_ID); controller.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); controller.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); mInjector.setDisplayOn(false); mInjector.setDisplayOn(true); setChargingState(controller, false); - setupPm(mInjector.getContext().getPackageManager()); controller.checkIdleStates(USER_ID); + assertEquals(STANDBY_BUCKET_EXEMPTED, + controller.getAppStandbyBucket(PACKAGE_EXEMPTED_1, USER_ID, + mInjector.mElapsedRealtime, false)); + assertNotEquals(STANDBY_BUCKET_EXEMPTED, + controller.getAppStandbyBucket(PACKAGE_1, USER_ID, + mInjector.mElapsedRealtime, false)); return controller; } diff --git a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java index 396fef40466f..57dd8084823b 100644 --- a/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/DimmerTests.java @@ -18,11 +18,9 @@ package com.android.server.wm; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.graphics.Rect; @@ -32,24 +30,17 @@ import android.view.SurfaceControl; import android.view.SurfaceSession; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.stubbing.Answer; /** * Build/Install/Run: * atest FrameworksServicesTests:com.android.server.wm.DimmerTests; */ @Presubmit -@Ignore("b/72450130") @RunWith(AndroidJUnit4.class) public class DimmerTests extends WindowTestsBase { - public DimmerTests() { - super(spy(new SurfaceAnimationRunner())); - } - private class TestWindowContainer extends WindowContainer<TestWindowContainer> { final SurfaceControl mControl = mock(SurfaceControl.class); final SurfaceControl.Transaction mTransaction = mock(SurfaceControl.Transaction.class); @@ -71,14 +62,11 @@ public class DimmerTests extends WindowTestsBase { private class MockSurfaceBuildingContainer extends WindowContainer<TestWindowContainer> { final SurfaceSession mSession = new SurfaceSession(); + final SurfaceControl mHostControl = mock(SurfaceControl.class); final SurfaceControl.Transaction mHostTransaction = mock(SurfaceControl.Transaction.class); MockSurfaceBuildingContainer() { super(sWm); - mSurfaceControl = sWm.makeSurfaceBuilder(mSession) - .setName("test surface") - .setSize(1, 1) - .build(); } class MockSurfaceBuilder extends SurfaceControl.Builder { @@ -88,23 +76,18 @@ public class DimmerTests extends WindowTestsBase { @Override public SurfaceControl build() { - return spy(sWm.makeSurfaceBuilder(mSession) - .setName("test surface") - .setSize(1, 1) - .build()); + return mock(SurfaceControl.class); } } @Override - SurfaceControl.Builder makeSurface() { - return sWm.makeSurfaceBuilder(mSession) - .setName("test surface") - .setSize(1, 1); + SurfaceControl.Builder makeChildSurface(WindowContainer child) { + return new MockSurfaceBuilder(mSession); } @Override - SurfaceControl.Builder makeChildSurface(WindowContainer child) { - return new MockSurfaceBuilder(mSession); + public SurfaceControl getSurfaceControl() { + return mHostControl; } @Override @@ -113,9 +96,9 @@ public class DimmerTests extends WindowTestsBase { } } - MockSurfaceBuildingContainer mHost; - Dimmer mDimmer; - SurfaceControl.Transaction mTransaction; + private MockSurfaceBuildingContainer mHost; + private Dimmer mDimmer; + private SurfaceControl.Transaction mTransaction; @Before public void setUp() throws Exception { @@ -123,13 +106,9 @@ public class DimmerTests extends WindowTestsBase { mHost = new MockSurfaceBuildingContainer(); mTransaction = mock(SurfaceControl.Transaction.class); - mDimmer = new Dimmer(mHost); - - doAnswer((Answer<Void>) invocation -> { - Runnable runnable = invocation.getArgument(3); - runnable.run(); - return null; - }).when(sWm.mSurfaceAnimationRunner).startAnimation(any(), any(), any(), any()); + mDimmer = new Dimmer(mHost, + (surfaceAnimator, t, anim, hidden) -> surfaceAnimator.mAnimationFinishedCallback + .run()); } @Test @@ -137,7 +116,7 @@ public class DimmerTests extends WindowTestsBase { final float alpha = 0.8f; mDimmer.dimAbove(mTransaction, alpha); - SurfaceControl dimLayer = getDimLayer(null); + SurfaceControl dimLayer = getDimLayer(); assertNotNull("Dimmer should have created a surface", dimLayer); @@ -149,12 +128,12 @@ public class DimmerTests extends WindowTestsBase { public void testDimAboveNoChildRedundantlyUpdatesAlphaOnExistingSurface() throws Exception { float alpha = 0.8f; mDimmer.dimAbove(mTransaction, alpha); - final SurfaceControl firstSurface = getDimLayer(null); + final SurfaceControl firstSurface = getDimLayer(); alpha = 0.9f; mDimmer.dimAbove(mTransaction, alpha); - assertEquals(firstSurface, getDimLayer(null)); + assertEquals(firstSurface, getDimLayer()); verify(mTransaction).setAlpha(firstSurface, 0.9f); } @@ -167,18 +146,18 @@ public class DimmerTests extends WindowTestsBase { Rect bounds = new Rect(0, 0, width, height); mDimmer.updateDims(mTransaction, bounds); - verify(mTransaction).setSize(getDimLayer(null), width, height); - verify(mTransaction).show(getDimLayer(null)); + verify(mTransaction).setSize(getDimLayer(), width, height); + verify(mTransaction).show(getDimLayer()); } @Test public void testDimAboveNoChildNotReset() throws Exception { mDimmer.dimAbove(mTransaction, 0.8f); - SurfaceControl dimLayer = getDimLayer(null); + SurfaceControl dimLayer = getDimLayer(); mDimmer.resetDimStates(); mDimmer.updateDims(mTransaction, new Rect()); - verify(mTransaction).show(getDimLayer(null)); + verify(mTransaction).show(getDimLayer()); verify(dimLayer, never()).destroy(); } @@ -189,12 +168,12 @@ public class DimmerTests extends WindowTestsBase { final float alpha = 0.8f; mDimmer.dimAbove(mTransaction, child, alpha); - SurfaceControl mDimLayer = getDimLayer(child); + SurfaceControl dimLayer = getDimLayer(); - assertNotNull("Dimmer should have created a surface", mDimLayer); + assertNotNull("Dimmer should have created a surface", dimLayer); - verify(mTransaction).setAlpha(mDimLayer, alpha); - verify(mTransaction).setRelativeLayer(mDimLayer, child.mControl, 1); + verify(mTransaction).setAlpha(dimLayer, alpha); + verify(mTransaction).setRelativeLayer(dimLayer, child.mControl, 1); } @Test @@ -204,12 +183,12 @@ public class DimmerTests extends WindowTestsBase { final float alpha = 0.8f; mDimmer.dimBelow(mTransaction, child, alpha); - SurfaceControl mDimLayer = getDimLayer(child); + SurfaceControl dimLayer = getDimLayer(); - assertNotNull("Dimmer should have created a surface", mDimLayer); + assertNotNull("Dimmer should have created a surface", dimLayer); - verify(mTransaction).setAlpha(mDimLayer, alpha); - verify(mTransaction).setRelativeLayer(mDimLayer, child.mControl, -1); + verify(mTransaction).setAlpha(dimLayer, alpha); + verify(mTransaction).setRelativeLayer(dimLayer, child.mControl, -1); } @Test @@ -219,7 +198,7 @@ public class DimmerTests extends WindowTestsBase { final float alpha = 0.8f; mDimmer.dimAbove(mTransaction, child, alpha); - SurfaceControl dimLayer = getDimLayer(child); + SurfaceControl dimLayer = getDimLayer(); mDimmer.resetDimStates(); mDimmer.updateDims(mTransaction, new Rect()); @@ -233,7 +212,7 @@ public class DimmerTests extends WindowTestsBase { final float alpha = 0.8f; mDimmer.dimAbove(mTransaction, child, alpha); - SurfaceControl dimLayer = getDimLayer(child); + SurfaceControl dimLayer = getDimLayer(); mDimmer.resetDimStates(); mDimmer.dimAbove(mTransaction, child, alpha); @@ -242,7 +221,29 @@ public class DimmerTests extends WindowTestsBase { verify(dimLayer, never()).destroy(); } - private SurfaceControl getDimLayer(WindowContainer windowContainer) { - return mDimmer.mDimLayerUsers.get(windowContainer).mDimLayer; + @Test + public void testDimUpdateWhileDimming() throws Exception { + Rect bounds = new Rect(); + TestWindowContainer child = new TestWindowContainer(); + mHost.addChild(child, 0); + + final float alpha = 0.8f; + mDimmer.dimAbove(mTransaction, child, alpha); + + SurfaceControl dimLayer = getDimLayer(); + bounds.set(0, 0, 10, 10); + mDimmer.updateDims(mTransaction, bounds); + verify(mTransaction, times(1)).show(dimLayer); + verify(mTransaction).setSize(dimLayer, bounds.width(), bounds.height()); + verify(mTransaction).setPosition(dimLayer, 0, 0); + + bounds.set(10, 10, 30, 30); + mDimmer.updateDims(mTransaction, bounds); + verify(mTransaction).setSize(dimLayer, bounds.width(), bounds.height()); + verify(mTransaction).setPosition(dimLayer, 10, 10); + } + + private SurfaceControl getDimLayer() { + return mDimmer.mDimState.mDimLayer; } } diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 81fd889c82c2..000cf38aceae 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -69,11 +69,6 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { private Runnable mRunnableWhenAddingSplashScreen; static synchronized WindowManagerService getWindowManagerService(Context context) { - return getWindowManagerService(context, new SurfaceAnimationRunner()); - } - - static synchronized WindowManagerService getWindowManagerService(Context context, - SurfaceAnimationRunner surfaceAnimationRunner) { if (sWm == null) { // We only want to do this once for the test process as we don't want WM to try to // register a bunch of local services again. @@ -111,7 +106,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } sWm = WindowManagerService.main(context, ims, true, false, - false, new TestWindowManagerPolicy(), surfaceAnimationRunner); + false, new TestWindowManagerPolicy()); } return sWm; } diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java index 7918901f7e2d..69b13787ef93 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java @@ -84,16 +84,6 @@ class WindowTestsBase { WindowState mChildAppWindowBelow; HashSet<WindowState> mCommonWindows; - private final SurfaceAnimationRunner mSurfaceAnimationRunner; - - public WindowTestsBase() { - this(new SurfaceAnimationRunner()); - } - - public WindowTestsBase(SurfaceAnimationRunner surfaceAnimationRunner) { - mSurfaceAnimationRunner = surfaceAnimationRunner; - } - @Before public void setUp() throws Exception { if (!sOneTimeSetupDone) { @@ -108,7 +98,7 @@ class WindowTestsBase { final Context context = InstrumentationRegistry.getTargetContext(); AttributeCache.init(context); - sWm = TestWindowManagerPolicy.getWindowManagerService(context, mSurfaceAnimationRunner); + sWm = TestWindowManagerPolicy.getWindowManagerService(context); beforeCreateDisplay(); context.getDisplay().getDisplayInfo(mDisplayInfo); diff --git a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java index 99eb8468c20d..e36586eba26c 100644 --- a/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java +++ b/services/tests/shortcutmanagerutils/src/com/android/server/pm/shortcutmanagertest/ShortcutManagerTestUtils.java @@ -210,6 +210,9 @@ public class ShortcutManagerTestUtils { runCommand(instrumentation, "cmd package set-home-activity --user " + instrumentation.getContext().getUserId() + " " + component, result -> result.contains("Success")); + runCommand(instrumentation, "cmd shortcut clear-default-launcher --user " + + instrumentation.getContext().getUserId(), + result -> result.contains("Success")); } public static void setDefaultLauncher(Instrumentation instrumentation, Context packageContext) { 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 9ae6f00f44ca..cd324259ce56 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -117,7 +117,7 @@ import java.util.Set; public class NotificationManagerServiceTest extends UiServiceTestCase { private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId"; private final int mUid = Binder.getCallingUid(); - private NotificationManagerService mService; + private TestableNotificationManagerService mService; private INotificationManager mBinderService; private NotificationManagerInternal mInternalService; @Mock @@ -152,17 +152,21 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // Use a Testable subclass so we can simulate calls from the system without failing. private static class TestableNotificationManagerService extends NotificationManagerService { + int countSystemChecks = 0; + public TestableNotificationManagerService(Context context) { super(context); } @Override protected boolean isCallingUidSystem() { + countSystemChecks++; return true; } @Override protected boolean isCallerSystemOrPhone() { + countSystemChecks++; return true; } @@ -1225,7 +1229,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { captor.getValue().getAction()); assertEquals(PKG, captor.getValue().getPackage()); assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra( - NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID)); + NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID)); assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false)); } @@ -1247,7 +1251,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { captor.getValue().getAction()); assertEquals(PKG, captor.getValue().getPackage()); assertEquals(mTestNotificationChannel.getId(), captor.getValue().getStringExtra( - NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID)); + NotificationManager.EXTRA_NOTIFICATION_CHANNEL_ID)); assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false)); } @@ -1283,7 +1287,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { captor.getValue().getAction()); assertEquals(PKG, captor.getValue().getPackage()); assertEquals(existing.getId(), captor.getValue().getStringExtra( - NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID)); + NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID)); assertTrue(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false)); } @@ -1304,7 +1308,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { captor.getValue().getAction()); assertEquals(PKG, captor.getValue().getPackage()); assertEquals(existing.getId(), captor.getValue().getStringExtra( - NotificationManager.EXTRA_BLOCK_STATE_CHANGED_ID)); + NotificationManager.EXTRA_NOTIFICATION_CHANNEL_GROUP_ID)); assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, false)); } @@ -2429,4 +2433,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .setUid(user2.sbn.getUid()) .setLastNotified(user2.sbn.getPostTime()))); } + + @Test + public void testRestore() throws Exception { + int systemChecks = mService.countSystemChecks; + mBinderService.applyRestore(null, UserHandle.USER_SYSTEM); + assertEquals(1, mService.countSystemChecks - systemChecks); + } + + @Test + public void testBackup() throws Exception { + int systemChecks = mService.countSystemChecks; + mBinderService.getBackupPayload(1); + assertEquals(1, mService.countSystemChecks - systemChecks); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java index b784c6006a86..bc2815099fdb 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceFullAccessListTest.java @@ -18,6 +18,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import android.os.UserHandle; import android.support.test.filters.SmallTest; import android.util.Xml.Encoding; @@ -85,7 +86,7 @@ public class SliceFullAccessListTest extends UiServiceTestCase { ByteArrayOutputStream output = new ByteArrayOutputStream(); XmlSerializer out = XmlPullParserFactory.newInstance().newSerializer(); out.setOutput(output, Encoding.UTF_8.name()); - mAccessList.writeXml(out); + mAccessList.writeXml(out, UserHandle.USER_ALL); out.flush(); assertEquals(TEST_XML, output.toString(Encoding.UTF_8.name())); diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java index 2becdf230dbc..b654a66f7d30 100644 --- a/services/usage/java/com/android/server/usage/AppIdleHistory.java +++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java @@ -228,7 +228,9 @@ public class AppIdleHistory { } if (timeout > elapsedRealtime) { // Convert to elapsed timebase - appUsageHistory.bucketTimeoutTime = mElapsedDuration + (timeout - mElapsedSnapshot); + appUsageHistory.bucketTimeoutTime = + Math.max(appUsageHistory.bucketTimeoutTime, + mElapsedDuration + (timeout - mElapsedSnapshot)); } } appUsageHistory.bucketingReason = REASON_USAGE; diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index 8cb2eecc654a..cc21199edfd9 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -183,6 +183,8 @@ public class AppStandbyController { boolean mCharging; private long mLastAppIdleParoledTime; private boolean mSystemServicesReady = false; + // There was a system update, defaults need to be initialized after services are ready + private boolean mPendingInitializeDefaults; private final DeviceStateReceiver mDeviceStateReceiver; @@ -279,6 +281,7 @@ public class AppStandbyController { public void onBootPhase(int phase) { mInjector.onBootPhase(phase); if (phase == PHASE_SYSTEM_SERVICES_READY) { + Slog.d(TAG, "Setting app idle enabled state"); setAppIdleEnabled(mInjector.isAppIdleEnabled()); // Observe changes to the threshold SettingsObserver settingsObserver = new SettingsObserver(mHandler); @@ -293,11 +296,15 @@ public class AppStandbyController { mAppIdleHistory.updateDisplay(isDisplayOn(), mInjector.elapsedRealtime()); } + mSystemServicesReady = true; + + if (mPendingInitializeDefaults) { + initializeDefaultsForSystemApps(UserHandle.USER_SYSTEM); + } + if (mPendingOneTimeCheckIdleStates) { postOneTimeCheckIdleStates(); } - - mSystemServicesReady = true; } else if (phase == PHASE_BOOT_COMPLETED) { setChargingState(mInjector.isCharging()); } @@ -451,7 +458,8 @@ public class AppStandbyController { UserHandle.getAppId(pi.applicationInfo.uid), userId); if (DEBUG) { - Slog.d(TAG, " Checking idle state for " + packageName); + Slog.d(TAG, " Checking idle state for " + packageName + " special=" + + isSpecial); } if (isSpecial) { synchronized (mAppIdleLock) { @@ -523,6 +531,7 @@ public class AppStandbyController { elapsedRealtime, bucket)) { StandbyUpdateRecord r = StandbyUpdateRecord.obtain(packageName, userId, bucket, userStartedInteracting); + if (DEBUG) Slog.d(TAG, "Standby bucket for " + packageName + "=" + bucket); mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, StandbyUpdateRecord.obtain(packageName, userId, bucket, userStartedInteracting))); @@ -1087,7 +1096,13 @@ public class AppStandbyController { } void initializeDefaultsForSystemApps(int userId) { - Slog.d(TAG, "Initializing defaults for system apps on user " + userId); + if (!mSystemServicesReady) { + // Do it later, since SettingsProvider wasn't queried yet for app_standby_enabled + mPendingInitializeDefaults = true; + return; + } + Slog.d(TAG, "Initializing defaults for system apps on user " + userId + ", " + + "appIdleEnabled=" + mAppIdleEnabled); final long elapsedRealtime = mInjector.elapsedRealtime(); List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser( PackageManager.MATCH_DISABLED_COMPONENTS, @@ -1102,11 +1117,6 @@ public class AppStandbyController { // past usage pattern was. mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE, 0, elapsedRealtime + 4 * ONE_HOUR); - if (isAppSpecial(packageName, UserHandle.getAppId(pi.applicationInfo.uid), - userId)) { - mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, - STANDBY_BUCKET_EXEMPTED, REASON_DEFAULT); - } } } } diff --git a/services/usb/java/com/android/server/usb/UsbAlsaDevice.java b/services/usb/java/com/android/server/usb/UsbAlsaDevice.java new file mode 100644 index 000000000000..7480e5662d7a --- /dev/null +++ b/services/usb/java/com/android/server/usb/UsbAlsaDevice.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2014 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.usb; + +import android.annotation.NonNull; +import android.service.usb.UsbAlsaDeviceProto; + +import com.android.internal.util.dump.DualDumpOutputStream; + +/** + * Represents the ALSA specification, and attributes of an ALSA device. + */ +public final class UsbAlsaDevice { + private static final String TAG = "UsbAlsaDevice"; + protected static final boolean DEBUG = false; + + private final int mCardNum; + private final int mDeviceNum; + private final boolean mHasPlayback; + private final boolean mHasCapture; + + private final boolean mIsInputHeadset; + private final boolean mIsOutputHeadset; + + private final String mDeviceAddress; + + private String mDeviceName = ""; + private String mDeviceDescription = ""; + + public UsbAlsaDevice(int card, int device, String deviceAddress, + boolean hasPlayback, boolean hasCapture, + boolean isInputHeadset, boolean isOutputHeadset) { + mCardNum = card; + mDeviceNum = device; + mDeviceAddress = deviceAddress; + mHasPlayback = hasPlayback; + mHasCapture = hasCapture; + mIsInputHeadset = isInputHeadset; + mIsOutputHeadset = isOutputHeadset; + } + + /** + * @returns the ALSA card number associated with this peripheral. + */ + public int getCardNum() { + return mCardNum; + } + + /** + * @returns the ALSA device number associated with this peripheral. + */ + public int getDeviceNum() { + return mDeviceNum; + } + + /** + * @returns the USB device device address associated with this peripheral. + */ + public String getDeviceAddress() { + return mDeviceAddress; + } + + /** + * @returns true if the device supports playback. + */ + public boolean hasPlayback() { + return mHasPlayback; + } + + /** + * @returns true if the device supports capture (recording). + */ + public boolean hasCapture() { + return mHasCapture; + } + + /** + * @returns true if the device is a headset for purposes of capture. + */ + public boolean isInputHeadset() { + return mIsInputHeadset; + } + + /** + * @returns true if the device is a headset for purposes of playback. + */ + public boolean isOutputHeadset() { + return mIsOutputHeadset; + } + + /** + * @Override + * @returns a string representation of the object. + */ + public String toString() { + return "UsbAlsaDevice: [card: " + mCardNum + + ", device: " + mDeviceNum + + ", name: " + mDeviceName + + ", hasPlayback: " + mHasPlayback + + ", hasCapture: " + mHasCapture + "]"; + } + + /** + * Write a description of the device to a dump stream. + */ + public void dump(@NonNull DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("card", UsbAlsaDeviceProto.CARD, mCardNum); + dump.write("device", UsbAlsaDeviceProto.DEVICE, mDeviceNum); + dump.write("name", UsbAlsaDeviceProto.NAME, mDeviceName); + dump.write("has_playback", UsbAlsaDeviceProto.HAS_PLAYBACK, mHasPlayback); + dump.write("has_capture", UsbAlsaDeviceProto.HAS_CAPTURE, mHasCapture); + dump.write("address", UsbAlsaDeviceProto.ADDRESS, mDeviceAddress); + + dump.end(token); + } + + // called by logDevices + String toShortString() { + return "[card:" + mCardNum + " device:" + mDeviceNum + " " + mDeviceName + "]"; + } + + String getDeviceName() { + return mDeviceName; + } + + void setDeviceNameAndDescription(String deviceName, String deviceDescription) { + mDeviceName = deviceName; + mDeviceDescription = deviceDescription; + } + + /** + * @Override + * @returns true if the objects are equivalent. + */ + public boolean equals(Object obj) { + if (!(obj instanceof UsbAlsaDevice)) { + return false; + } + UsbAlsaDevice other = (UsbAlsaDevice) obj; + return (mCardNum == other.mCardNum + && mDeviceNum == other.mDeviceNum + && mHasPlayback == other.mHasPlayback + && mHasCapture == other.mHasCapture + && mIsInputHeadset == other.mIsInputHeadset + && mIsOutputHeadset == other.mIsOutputHeadset); + } + + /** + * @Override + * @returns a hash code generated from the object contents. + */ + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + mCardNum; + result = prime * result + mDeviceNum; + result = prime * result + (mHasPlayback ? 0 : 1); + result = prime * result + (mHasCapture ? 0 : 1); + result = prime * result + (mIsInputHeadset ? 0 : 1); + result = prime * result + (mIsOutputHeadset ? 0 : 1); + + return result; + } +} + diff --git a/services/usb/java/com/android/server/usb/UsbAlsaManager.java b/services/usb/java/com/android/server/usb/UsbAlsaManager.java index 7bea8a11133b..0c5f8f113adc 100644 --- a/services/usb/java/com/android/server/usb/UsbAlsaManager.java +++ b/services/usb/java/com/android/server/usb/UsbAlsaManager.java @@ -10,7 +10,7 @@ * 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 an + * See the License for the specific language governing permissions and * limitations under the License. */ @@ -19,28 +19,25 @@ package com.android.server.usb; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; -import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbInterface; import android.media.AudioSystem; import android.media.IAudioService; import android.media.midi.MidiDeviceInfo; import android.os.Bundle; -import android.os.FileObserver; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemClock; import android.provider.Settings; +import android.service.usb.UsbAlsaManagerProto; import android.util.Slog; import com.android.internal.alsa.AlsaCardsParser; -import com.android.internal.alsa.AlsaDevicesParser; -import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.audio.AudioService; +import com.android.server.usb.descriptors.UsbDescriptorParser; import libcore.io.IoUtils; -import java.io.File; +import java.util.ArrayList; import java.util.HashMap; /** @@ -57,107 +54,36 @@ public final class UsbAlsaManager { private final boolean mHasMidiFeature; private final AlsaCardsParser mCardsParser = new AlsaCardsParser(); - private final AlsaDevicesParser mDevicesParser = new AlsaDevicesParser(); // this is needed to map USB devices to ALSA Audio Devices, especially to remove an // ALSA device when we are notified that its associated USB device has been removed. + private final ArrayList<UsbAlsaDevice> mAlsaDevices = new ArrayList<UsbAlsaDevice>(); - private final HashMap<UsbDevice,UsbAudioDevice> - mAudioDevices = new HashMap<UsbDevice,UsbAudioDevice>(); - - private boolean mIsInputHeadset; // as reported by UsbDescriptorParser - private boolean mIsOutputHeadset; // as reported by UsbDescriptorParser - - private final HashMap<UsbDevice,UsbMidiDevice> - mMidiDevices = new HashMap<UsbDevice,UsbMidiDevice>(); - - private final HashMap<String,AlsaDevice> - mAlsaDevices = new HashMap<String,AlsaDevice>(); - - private UsbAudioDevice mAccessoryAudioDevice = null; + /** + * List of connected MIDI devices + */ + private final HashMap<String, UsbMidiDevice> + mMidiDevices = new HashMap<String, UsbMidiDevice>(); // UsbMidiDevice for USB peripheral mode (gadget) device private UsbMidiDevice mPeripheralMidiDevice = null; - private final class AlsaDevice { - public static final int TYPE_UNKNOWN = 0; - public static final int TYPE_PLAYBACK = 1; - public static final int TYPE_CAPTURE = 2; - public static final int TYPE_MIDI = 3; - - public int mCard; - public int mDevice; - public int mType; - - public AlsaDevice(int type, int card, int device) { - mType = type; - mCard = card; - mDevice = device; - } - - public boolean equals(Object obj) { - if (! (obj instanceof AlsaDevice)) { - return false; - } - AlsaDevice other = (AlsaDevice)obj; - return (mType == other.mType && mCard == other.mCard && mDevice == other.mDevice); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("AlsaDevice: [card: " + mCard); - sb.append(", device: " + mDevice); - sb.append(", type: " + mType); - sb.append("]"); - return sb.toString(); - } - } - - private final FileObserver mAlsaObserver = new FileObserver(ALSA_DIRECTORY, - FileObserver.CREATE | FileObserver.DELETE) { - public void onEvent(int event, String path) { - switch (event) { - case FileObserver.CREATE: - alsaFileAdded(path); - break; - case FileObserver.DELETE: - alsaFileRemoved(path); - break; - } - } - }; - /* package */ UsbAlsaManager(Context context) { mContext = context; mHasMidiFeature = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI); - - // initial scan - if (mCardsParser.scan() != AlsaCardsParser.SCANSTATUS_SUCCESS) { - Slog.e(TAG, "Error scanning ASLA cards file."); - } } public void systemReady() { mAudioService = IAudioService.Stub.asInterface( ServiceManager.getService(Context.AUDIO_SERVICE)); - - mAlsaObserver.startWatching(); - - // add existing alsa devices - File[] files = new File(ALSA_DIRECTORY).listFiles(); - if (files != null) { - for (int i = 0; i < files.length; i++) { - alsaFileAdded(files[i].getName()); - } - } } // Notifies AudioService when a device is added or removed // audioDevice - the AudioDevice that was added or removed // enabled - if true, we're connecting a device (it's arrived), else disconnecting - private void notifyDeviceState(UsbAudioDevice audioDevice, boolean enabled) { + private void notifyDeviceState(UsbAlsaDevice alsaDevice, boolean enabled) { if (DEBUG) { - Slog.d(TAG, "notifyDeviceState " + enabled + " " + audioDevice); + Slog.d(TAG, "notifyDeviceState " + enabled + " " + alsaDevice); } if (mAudioService == null) { @@ -177,276 +103,151 @@ public final class UsbAlsaManager { } int state = (enabled ? 1 : 0); - int alsaCard = audioDevice.mCard; - int alsaDevice = audioDevice.mDevice; - if (alsaCard < 0 || alsaDevice < 0) { - Slog.e(TAG, "Invalid alsa card or device alsaCard: " + alsaCard + - " alsaDevice: " + alsaDevice); + int cardNum = alsaDevice.getCardNum(); + int deviceNum = alsaDevice.getDeviceNum(); + if (cardNum < 0 || deviceNum < 0) { + Slog.e(TAG, "Invalid alsa card or device alsaCard: " + cardNum + + " alsaDevice: " + deviceNum); return; } - String address = AudioService.makeAlsaAddressString(alsaCard, alsaDevice); + String address = AudioService.makeAlsaAddressString(cardNum, deviceNum); try { // Playback Device - if (audioDevice.mHasPlayback) { - int device; - if (mIsOutputHeadset) { - device = AudioSystem.DEVICE_OUT_USB_HEADSET; - } else { - device = (audioDevice == mAccessoryAudioDevice - ? AudioSystem.DEVICE_OUT_USB_ACCESSORY - : AudioSystem.DEVICE_OUT_USB_DEVICE); - } + if (alsaDevice.hasPlayback()) { + int device = alsaDevice.isOutputHeadset() + ? AudioSystem.DEVICE_OUT_USB_HEADSET + : AudioSystem.DEVICE_OUT_USB_DEVICE; if (DEBUG) { Slog.i(TAG, "pre-call device:0x" + Integer.toHexString(device) + - " addr:" + address + " name:" + audioDevice.getDeviceName()); + " addr:" + address + " name:" + alsaDevice.getDeviceName()); } mAudioService.setWiredDeviceConnectionState( - device, state, address, audioDevice.getDeviceName(), TAG); + device, state, address, alsaDevice.getDeviceName(), TAG); } // Capture Device - if (audioDevice.mHasCapture) { - int device; - if (mIsInputHeadset) { - device = AudioSystem.DEVICE_IN_USB_HEADSET; - } else { - device = (audioDevice == mAccessoryAudioDevice - ? AudioSystem.DEVICE_IN_USB_ACCESSORY - : AudioSystem.DEVICE_IN_USB_DEVICE); - } + if (alsaDevice.hasCapture()) { + int device = alsaDevice.isInputHeadset() + ? AudioSystem.DEVICE_IN_USB_HEADSET + : AudioSystem.DEVICE_IN_USB_DEVICE; mAudioService.setWiredDeviceConnectionState( - device, state, address, audioDevice.getDeviceName(), TAG); + device, state, address, alsaDevice.getDeviceName(), TAG); } } catch (RemoteException e) { Slog.e(TAG, "RemoteException in setWiredDeviceConnectionState"); } } - private AlsaDevice waitForAlsaDevice(int card, int device, int type) { - if (DEBUG) { - Slog.e(TAG, "waitForAlsaDevice(c:" + card + " d:" + device + ")"); - } - - AlsaDevice testDevice = new AlsaDevice(type, card, device); - - // This value was empirically determined. - final int kWaitTimeMs = 2500; - - synchronized(mAlsaDevices) { - long timeoutMs = SystemClock.elapsedRealtime() + kWaitTimeMs; - do { - if (mAlsaDevices.values().contains(testDevice)) { - return testDevice; - } - long waitTimeMs = timeoutMs - SystemClock.elapsedRealtime(); - if (waitTimeMs > 0) { - try { - mAlsaDevices.wait(waitTimeMs); - } catch (InterruptedException e) { - Slog.d(TAG, "usb: InterruptedException while waiting for ALSA file."); - } - } - } while (timeoutMs > SystemClock.elapsedRealtime()); - } - - Slog.e(TAG, "waitForAlsaDevice failed for " + testDevice); - return null; - } - - private void alsaFileAdded(String name) { - Slog.i(TAG, "alsaFileAdded(" + name + ")"); - int type = AlsaDevice.TYPE_UNKNOWN; - int card = -1, device = -1; - - if (name.startsWith("pcmC")) { - if (name.endsWith("p")) { - type = AlsaDevice.TYPE_PLAYBACK; - } else if (name.endsWith("c")) { - type = AlsaDevice.TYPE_CAPTURE; - } - } else if (name.startsWith("midiC")) { - type = AlsaDevice.TYPE_MIDI; - } - - if (type != AlsaDevice.TYPE_UNKNOWN) { - try { - int c_index = name.indexOf('C'); - int d_index = name.indexOf('D'); - int end = name.length(); - if (type == AlsaDevice.TYPE_PLAYBACK || type == AlsaDevice.TYPE_CAPTURE) { - // skip trailing 'p' or 'c' - end--; - } - card = Integer.parseInt(name.substring(c_index + 1, d_index)); - device = Integer.parseInt(name.substring(d_index + 1, end)); - } catch (Exception e) { - Slog.e(TAG, "Could not parse ALSA file name " + name, e); - return; - } - synchronized(mAlsaDevices) { - if (mAlsaDevices.get(name) == null) { - AlsaDevice alsaDevice = new AlsaDevice(type, card, device); - Slog.d(TAG, "Adding ALSA device " + alsaDevice); - mAlsaDevices.put(name, alsaDevice); - mAlsaDevices.notifyAll(); - } + private int getAlsaDeviceListIndexFor(String deviceAddress) { + for (int index = 0; index < mAlsaDevices.size(); index++) { + if (mAlsaDevices.get(index).getDeviceAddress().equals(deviceAddress)) { + return index; } } + return -1; } - private void alsaFileRemoved(String path) { - synchronized(mAlsaDevices) { - AlsaDevice device = mAlsaDevices.remove(path); - if (device != null) { - Slog.d(TAG, "ALSA device removed: " + device); - } - } - } - - /* - * Select the default device of the specified card. - */ - /* package */ UsbAudioDevice selectAudioCard(int card) { - if (DEBUG) { - Slog.d(TAG, "selectAudioCard() card:" + card - + " isCardUsb(): " + mCardsParser.isCardUsb(card)); - } - if (!mCardsParser.isCardUsb(card)) { - // Don't. AudioPolicyManager has logic for falling back to internal devices. - return null; - } - - if (mDevicesParser.scan() != AlsaDevicesParser.SCANSTATUS_SUCCESS) { - Slog.e(TAG, "Error parsing ALSA devices file."); + private UsbAlsaDevice removeAlsaDeviceFromList(String deviceAddress) { + int index = getAlsaDeviceListIndexFor(deviceAddress); + if (index > -1) { + return mAlsaDevices.remove(index); + } else { return null; } + } - int device = mDevicesParser.getDefaultDeviceNum(card); - - boolean hasPlayback = mDevicesParser.hasPlaybackDevices(card); - boolean hasCapture = mDevicesParser.hasCaptureDevices(card); + /* package */ UsbAlsaDevice selectDefaultDevice() { if (DEBUG) { - Slog.d(TAG, "usb: hasPlayback:" + hasPlayback + " hasCapture:" + hasCapture); - } - - int deviceClass = - (mCardsParser.isCardUsb(card) - ? UsbAudioDevice.kAudioDeviceClass_External - : UsbAudioDevice.kAudioDeviceClass_Internal) | - UsbAudioDevice.kAudioDeviceMeta_Alsa; - - // Playback device file needed/present? - if (hasPlayback && (waitForAlsaDevice(card, device, AlsaDevice.TYPE_PLAYBACK) == null)) { - return null; + Slog.d(TAG, "UsbAudioManager.selectDefaultDevice()"); } - // Capture device file needed/present? - if (hasCapture && (waitForAlsaDevice(card, device, AlsaDevice.TYPE_CAPTURE) == null)) { + if (mAlsaDevices.size() > 0) { + UsbAlsaDevice alsaDevice = mAlsaDevices.get(0); + if (DEBUG) { + Slog.d(TAG, " alsaDevice:" + alsaDevice); + } + if (alsaDevice != null) { + notifyDeviceState(alsaDevice, true /*enabled*/); + } + return alsaDevice; + } else { return null; } - - UsbAudioDevice audioDevice = - new UsbAudioDevice(card, device, hasPlayback, hasCapture, deviceClass); - AlsaCardsParser.AlsaCardRecord cardRecord = mCardsParser.getCardRecordFor(card); - audioDevice.setDeviceNameAndDescription(cardRecord.mCardName, cardRecord.mCardDescription); - - notifyDeviceState(audioDevice, true /*enabled*/); - - return audioDevice; - } - - /* package */ UsbAudioDevice selectDefaultDevice() { - if (DEBUG) { - Slog.d(TAG, "UsbAudioManager.selectDefaultDevice()"); - } - return selectAudioCard(mCardsParser.getDefaultCard()); } - /* package */ void usbDeviceAdded(UsbDevice usbDevice, - boolean isInputHeadset, boolean isOutputHeadset) { + /* package */ void usbDeviceAdded(String deviceAddress, UsbDevice usbDevice, + UsbDescriptorParser parser) { if (DEBUG) { - Slog.d(TAG, "deviceAdded(): " + usbDevice.getManufacturerName() + Slog.d(TAG, "usbDeviceAdded(): " + usbDevice.getManufacturerName() + " nm:" + usbDevice.getProductName()); } - mIsInputHeadset = isInputHeadset; - mIsOutputHeadset = isOutputHeadset; - - // Is there an audio interface in there? - boolean isAudioDevice = false; + // Scan the Alsa File Space + mCardsParser.scan(); - // FIXME - handle multiple configurations? - int interfaceCount = usbDevice.getInterfaceCount(); - for (int ntrfaceIndex = 0; !isAudioDevice && ntrfaceIndex < interfaceCount; - ntrfaceIndex++) { - UsbInterface ntrface = usbDevice.getInterface(ntrfaceIndex); - if (ntrface.getInterfaceClass() == UsbConstants.USB_CLASS_AUDIO) { - isAudioDevice = true; - } + // Find the ALSA spec for this device address + AlsaCardsParser.AlsaCardRecord cardRec = + mCardsParser.findCardNumFor(deviceAddress); + if (cardRec == null) { + return; } + // Add it to the devices list + boolean hasInput = parser.hasInput(); + boolean hasOutput = parser.hasOutput(); if (DEBUG) { - Slog.d(TAG, " isAudioDevice: " + isAudioDevice); - } - if (!isAudioDevice) { - return; + Slog.d(TAG, "hasInput: " + hasInput + " hasOutput:" + hasOutput); + } + if (hasInput || hasOutput) { + boolean isInputHeadset = parser.isInputHeadset(); + boolean isOutputHeadset = parser.isOutputHeadset(); + UsbAlsaDevice alsaDevice = + new UsbAlsaDevice(cardRec.getCardNum(), 0 /*device*/, deviceAddress, + hasOutput, hasInput, isInputHeadset, isOutputHeadset); + alsaDevice.setDeviceNameAndDescription( + cardRec.getCardName(), cardRec.getCardDescription()); + mAlsaDevices.add(0, alsaDevice); + + // Select it + if (alsaDevice != null) { + notifyDeviceState(alsaDevice, true /*enabled*/); + } } - int addedCard = mCardsParser.getDefaultUsbCard(); - - // If the default isn't a USB device, let the existing "select internal mechanism" - // handle the selection. + // look for MIDI devices + boolean hasMidi = parser.hasMIDIInterface(); if (DEBUG) { - Slog.d(TAG, " mCardsParser.isCardUsb(" + addedCard + ") = " - + mCardsParser.isCardUsb(addedCard)); + Slog.d(TAG, "hasMidi: " + hasMidi + " mHasMidiFeature:" + mHasMidiFeature); } - if (mCardsParser.isCardUsb(addedCard)) { - UsbAudioDevice audioDevice = selectAudioCard(addedCard); - if (audioDevice != null) { - mAudioDevices.put(usbDevice, audioDevice); - Slog.i(TAG, "USB Audio Device Added: " + audioDevice); + if (hasMidi && mHasMidiFeature) { + int device = 0; + Bundle properties = new Bundle(); + String manufacturer = usbDevice.getManufacturerName(); + String product = usbDevice.getProductName(); + String version = usbDevice.getVersion(); + String name; + if (manufacturer == null || manufacturer.isEmpty()) { + name = product; + } else if (product == null || product.isEmpty()) { + name = manufacturer; + } else { + name = manufacturer + " " + product; } - - // look for MIDI devices - - // Don't need to call mDevicesParser.scan() because selectAudioCard() does this above. - // Uncomment this next line if that behavior changes in the fugure. - // mDevicesParser.scan() - - boolean hasMidi = mDevicesParser.hasMIDIDevices(addedCard); - if (hasMidi && mHasMidiFeature) { - int device = mDevicesParser.getDefaultDeviceNum(addedCard); - AlsaDevice alsaDevice = waitForAlsaDevice(addedCard, device, AlsaDevice.TYPE_MIDI); - if (alsaDevice != null) { - Bundle properties = new Bundle(); - String manufacturer = usbDevice.getManufacturerName(); - String product = usbDevice.getProductName(); - String version = usbDevice.getVersion(); - String name; - if (manufacturer == null || manufacturer.isEmpty()) { - name = product; - } else if (product == null || product.isEmpty()) { - name = manufacturer; - } else { - name = manufacturer + " " + product; - } - properties.putString(MidiDeviceInfo.PROPERTY_NAME, name); - properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER, manufacturer); - properties.putString(MidiDeviceInfo.PROPERTY_PRODUCT, product); - properties.putString(MidiDeviceInfo.PROPERTY_VERSION, version); - properties.putString(MidiDeviceInfo.PROPERTY_SERIAL_NUMBER, - usbDevice.getSerialNumber()); - properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_CARD, alsaDevice.mCard); - properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_DEVICE, alsaDevice.mDevice); - properties.putParcelable(MidiDeviceInfo.PROPERTY_USB_DEVICE, usbDevice); - - UsbMidiDevice usbMidiDevice = UsbMidiDevice.create(mContext, properties, - alsaDevice.mCard, alsaDevice.mDevice); - if (usbMidiDevice != null) { - mMidiDevices.put(usbDevice, usbMidiDevice); - } - } + properties.putString(MidiDeviceInfo.PROPERTY_NAME, name); + properties.putString(MidiDeviceInfo.PROPERTY_MANUFACTURER, manufacturer); + properties.putString(MidiDeviceInfo.PROPERTY_PRODUCT, product); + properties.putString(MidiDeviceInfo.PROPERTY_VERSION, version); + properties.putString(MidiDeviceInfo.PROPERTY_SERIAL_NUMBER, + usbDevice.getSerialNumber()); + properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_CARD, cardRec.getCardNum()); + properties.putInt(MidiDeviceInfo.PROPERTY_ALSA_DEVICE, 0 /*deviceNum*/); + properties.putParcelable(MidiDeviceInfo.PROPERTY_USB_DEVICE, usbDevice); + + UsbMidiDevice usbMidiDevice = UsbMidiDevice.create(mContext, properties, + cardRec.getCardNum(), 0 /*device*/); + if (usbMidiDevice != null) { + mMidiDevices.put(deviceAddress, usbMidiDevice); } } @@ -455,42 +256,31 @@ public final class UsbAlsaManager { } } - /* package */ void usbDeviceRemoved(UsbDevice usbDevice) { + /* package */ void usbDeviceRemoved(String deviceAddress/*UsbDevice usbDevice*/) { if (DEBUG) { - Slog.d(TAG, "deviceRemoved(): " + usbDevice.getManufacturerName() + - " " + usbDevice.getProductName()); + Slog.d(TAG, "deviceRemoved(" + deviceAddress + ")"); } - UsbAudioDevice audioDevice = mAudioDevices.remove(usbDevice); - Slog.i(TAG, "USB Audio Device Removed: " + audioDevice); - if (audioDevice != null) { - if (audioDevice.mHasPlayback || audioDevice.mHasCapture) { - notifyDeviceState(audioDevice, false /*enabled*/); + // Audio + UsbAlsaDevice alsaDevice = removeAlsaDeviceFromList(deviceAddress); + Slog.i(TAG, "USB Audio Device Removed: " + alsaDevice); + if (alsaDevice != null) { + if (alsaDevice.hasPlayback() || alsaDevice.hasCapture()) { + notifyDeviceState(alsaDevice, false /*enabled*/); // if there any external devices left, select one of them selectDefaultDevice(); } } - UsbMidiDevice usbMidiDevice = mMidiDevices.remove(usbDevice); + + // MIDI + UsbMidiDevice usbMidiDevice = mMidiDevices.remove(deviceAddress); if (usbMidiDevice != null) { + Slog.i(TAG, "USB MIDI Device Removed: " + usbMidiDevice); IoUtils.closeQuietly(usbMidiDevice); } } - /* package */ void setAccessoryAudioState(boolean enabled, int card, int device) { - if (DEBUG) { - Slog.d(TAG, "setAccessoryAudioState " + enabled + " " + card + " " + device); - } - if (enabled) { - mAccessoryAudioDevice = new UsbAudioDevice(card, device, true, false, - UsbAudioDevice.kAudioDeviceClass_External); - notifyDeviceState(mAccessoryAudioDevice, true /*enabled*/); - } else if (mAccessoryAudioDevice != null) { - notifyDeviceState(mAccessoryAudioDevice, false /*enabled*/); - mAccessoryAudioDevice = null; - } - } - /* package */ void setPeripheralMidiState(boolean enabled, int card, int device) { if (!mHasMidiFeature) { return; @@ -528,31 +318,34 @@ public final class UsbAlsaManager { } */ - // - // Logging - // - // called by UsbService.dump - public void dump(IndentingPrintWriter pw) { - pw.println("Parsers Scan Status:"); - pw.println(" Cards Parser: " + mCardsParser.getScanStatus()); - pw.println(" Devices Parser: " + mDevicesParser.getScanStatus()); - pw.println("USB Audio Devices:"); - for (UsbDevice device : mAudioDevices.keySet()) { - pw.println(" " + device.getDeviceName() + ": " + mAudioDevices.get(device)); + /** + * Dump the USB alsa state. + */ + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("cards_parser", UsbAlsaManagerProto.CARDS_PARSER, mCardsParser.getScanStatus()); + + for (UsbAlsaDevice usbAlsaDevice : mAlsaDevices) { + usbAlsaDevice.dump(dump, "alsa_devices", UsbAlsaManagerProto.ALSA_DEVICES); } - pw.println("USB MIDI Devices:"); - for (UsbDevice device : mMidiDevices.keySet()) { - pw.println(" " + device.getDeviceName() + ": " + mMidiDevices.get(device)); + + for (String deviceAddr : mMidiDevices.keySet()) { + // A UsbMidiDevice does not have a handle to the UsbDevice anymore + mMidiDevices.get(deviceAddr).dump(deviceAddr, dump, "midi_devices", + UsbAlsaManagerProto.MIDI_DEVICES); } + + dump.end(token); } /* public void logDevicesList(String title) { if (DEBUG) { - for (HashMap.Entry<UsbDevice,UsbAudioDevice> entry : mAudioDevices.entrySet()) { + for (HashMap.Entry<UsbDevice,UsbAlsaDevice> entry : mAudioDevices.entrySet()) { Slog.i(TAG, "UsbDevice-------------------"); Slog.i(TAG, "" + (entry != null ? entry.getKey() : "[none]")); - Slog.i(TAG, "UsbAudioDevice--------------"); + Slog.i(TAG, "UsbAlsaDevice--------------"); Slog.i(TAG, "" + entry.getValue()); } } @@ -564,7 +357,7 @@ public final class UsbAlsaManager { public void logDevices(String title) { if (DEBUG) { Slog.i(TAG, title); - for (HashMap.Entry<UsbDevice,UsbAudioDevice> entry : mAudioDevices.entrySet()) { + for (HashMap.Entry<UsbDevice,UsbAlsaDevice> entry : mAudioDevices.entrySet()) { Slog.i(TAG, entry.getValue().toShortString()); } } diff --git a/services/usb/java/com/android/server/usb/UsbAudioDevice.java b/services/usb/java/com/android/server/usb/UsbAudioDevice.java deleted file mode 100644 index 4b17dfe0f27d..000000000000 --- a/services/usb/java/com/android/server/usb/UsbAudioDevice.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2014 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 an - * limitations under the License. - */ - -package com.android.server.usb; - -public final class UsbAudioDevice { - private static final String TAG = "UsbAudioDevice"; - protected static final boolean DEBUG = false; - - public final int mCard; - public final int mDevice; - public final boolean mHasPlayback; - public final boolean mHasCapture; - - // Device "class" flags - public static final int kAudioDeviceClassMask = 0x00FFFFFF; - public static final int kAudioDeviceClass_Undefined = 0x00000000; - public static final int kAudioDeviceClass_Internal = 0x00000001; - public static final int kAudioDeviceClass_External = 0x00000002; - // Device meta-data flags - public static final int kAudioDeviceMetaMask = 0xFF000000; - public static final int kAudioDeviceMeta_Alsa = 0x80000000; - // This member is a combination of the above bit-flags - public final int mDeviceClass; - - private String mDeviceName = ""; - private String mDeviceDescription = ""; - - public UsbAudioDevice(int card, int device, - boolean hasPlayback, boolean hasCapture, int deviceClass) { - mCard = card; - mDevice = device; - mHasPlayback = hasPlayback; - mHasCapture = hasCapture; - mDeviceClass = deviceClass; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("UsbAudioDevice: [card: " + mCard); - sb.append(", device: " + mDevice); - sb.append(", name: " + mDeviceName); - sb.append(", hasPlayback: " + mHasPlayback); - sb.append(", hasCapture: " + mHasCapture); - sb.append(", class: 0x" + Integer.toHexString(mDeviceClass) + "]"); - return sb.toString(); - } - - // called by logDevices - String toShortString() { - return "[card:" + mCard + " device:" + mDevice + " " + mDeviceName + "]"; - } - - String getDeviceName() { - return mDeviceName; - } - - void setDeviceNameAndDescription(String deviceName, String deviceDescription) { - mDeviceName = deviceName; - mDeviceDescription = deviceDescription; - } - -} - diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index 703f1a1ca656..74d8e129901a 100644 --- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java @@ -16,6 +16,8 @@ package com.android.server.usb; +import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; + import android.app.ActivityManager; import android.content.ActivityNotFoundException; import android.content.ComponentName; @@ -35,11 +37,12 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.service.usb.UsbDebuggingManagerProto; import android.util.Base64; import android.util.Slog; import com.android.internal.R; -import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.FgThread; import java.io.File; @@ -451,21 +454,30 @@ public class UsbDebuggingManager { mHandler.sendEmptyMessage(UsbDebuggingHandler.MESSAGE_ADB_CLEAR); } - public void dump(IndentingPrintWriter pw) { - pw.println("USB Debugging State:"); - pw.println(" Connected to adbd: " + (mThread != null)); - pw.println(" Last key received: " + mFingerprints); - pw.println(" User keys:"); + /** + * Dump the USB debugging state. + */ + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("connected_to_adb", UsbDebuggingManagerProto.CONNECTED_TO_ADB, mThread != null); + writeStringIfNotNull(dump, "last_key_received", UsbDebuggingManagerProto.LAST_KEY_RECEVIED, + mFingerprints); + try { - pw.println(FileUtils.readTextFile(new File("/data/misc/adb/adb_keys"), 0, null)); + dump.write("user_keys", UsbDebuggingManagerProto.USER_KEYS, + FileUtils.readTextFile(new File("/data/misc/adb/adb_keys"), 0, null)); } catch (IOException e) { - pw.println("IOException: " + e); + Slog.e(TAG, "Cannot read user keys", e); } - pw.println(" System keys:"); + try { - pw.println(FileUtils.readTextFile(new File("/adb_keys"), 0, null)); + dump.write("system_keys", UsbDebuggingManagerProto.SYSTEM_KEYS, + FileUtils.readTextFile(new File("/adb_keys"), 0, null)); } catch (IOException e) { - pw.println("IOException: " + e); + Slog.e(TAG, "Cannot read system keys", e); } + + dump.end(token); } } diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 55ffea6f252f..680694732b2d 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -16,6 +16,9 @@ package com.android.server.usb; +import static com.android.internal.usb.DumpUtils.writeAccessory; +import static com.android.internal.util.dump.DumpUtils.writeStringIfNotNull; + import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.KeyguardManager; @@ -41,6 +44,7 @@ import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; +import android.hardware.usb.gadget.V1_0.GadgetFunction; import android.hardware.usb.gadget.V1_0.IUsbGadget; import android.hardware.usb.gadget.V1_0.IUsbGadgetCallback; import android.hardware.usb.gadget.V1_0.Status; @@ -63,6 +67,8 @@ import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.provider.Settings; +import android.service.usb.UsbDeviceManagerProto; +import android.service.usb.UsbHandlerProto; import android.util.Pair; import android.util.Slog; @@ -72,7 +78,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.SomeArgs; -import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.FgThread; import com.android.server.LocalServices; @@ -97,6 +103,11 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver private static final boolean DEBUG = false; /** + * The name of the xml file in which screen unlocked functions are stored. + */ + private static final String USB_PREFS_XML = "UsbDeviceManagerPrefs.xml"; + + /** * The SharedPreference setting per user that stores the screen unlocked functions between * sessions. */ @@ -223,14 +234,12 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver int userHandle = ActivityManager.getCurrentUser(); boolean secure = mContext.getSystemService(KeyguardManager.class) .isDeviceSecure(userHandle); - boolean unlocking = mContext.getSystemService(UserManager.class) - .isUserUnlockingOrUnlocked(userHandle); if (DEBUG) { Slog.v(TAG, "onKeyguardStateChanged: isShowing:" + isShowing + " secure:" + secure - + " unlocking:" + unlocking + " user:" + userHandle); + + " user:" + userHandle); } - // We are unlocked when the keyguard is down or non-secure, and user storage is unlocked. - mHandler.sendMessage(MSG_UPDATE_SCREEN_LOCK, (isShowing && secure) || !unlocking); + // We are unlocked when the keyguard is down or non-secure. + mHandler.sendMessage(MSG_UPDATE_SCREEN_LOCK, (isShowing && secure)); } @Override @@ -494,7 +503,6 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver mContentResolver = context.getContentResolver(); mCurrentUser = ActivityManager.getCurrentUser(); - mScreenUnlockedFunctions = UsbManager.FUNCTION_NONE; mScreenLocked = true; /* @@ -504,6 +512,16 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver mAdbEnabled = UsbHandlerLegacy.containsFunction(getSystemProperty( USB_PERSISTENT_CONFIG_PROPERTY, ""), UsbManager.USB_FUNCTION_ADB); + mSettings = getPinnedSharedPrefs(mContext); + if (mSettings == null) { + Slog.e(TAG, "Couldn't load shared preferences"); + } else { + mScreenUnlockedFunctions = UsbManager.usbFunctionsFromString( + mSettings.getString( + String.format(Locale.ENGLISH, UNLOCKED_CONFIG_PREF, mCurrentUser), + "")); + } + // We do not show the USB notification if the primary volume supports mass storage. // The legacy mass storage UI will be used instead. final StorageManager storageManager = StorageManager.from(mContext); @@ -658,11 +676,10 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver } protected SharedPreferences getPinnedSharedPrefs(Context context) { - final File prefsFile = new File(new File( - Environment.getDataUserCePackageDirectory(StorageManager.UUID_PRIVATE_INTERNAL, - context.getUserId(), context.getPackageName()), "shared_prefs"), - UsbDeviceManager.class.getSimpleName() + ".xml"); - return context.getSharedPreferences(prefsFile, Context.MODE_PRIVATE); + final File prefsFile = new File( + Environment.getDataSystemDeDirectory(UserHandle.USER_SYSTEM), USB_PREFS_XML); + return context.createDeviceProtectedStorageContext() + .getSharedPreferences(prefsFile, Context.MODE_PRIVATE); } private boolean isUsbStateChanged(Intent intent) { @@ -726,35 +743,9 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver } private void updateUsbFunctions() { - updateAudioSourceFunction(); updateMidiFunction(); } - private void updateAudioSourceFunction() { - boolean enabled = (mCurrentFunctions & UsbManager.FUNCTION_AUDIO_SOURCE) != 0; - if (enabled != mAudioSourceEnabled) { - int card = -1; - int device = -1; - - if (enabled) { - Scanner scanner = null; - try { - scanner = new Scanner(new File(AUDIO_SOURCE_PCM_PATH)); - card = scanner.nextInt(); - device = scanner.nextInt(); - } catch (FileNotFoundException e) { - Slog.e(TAG, "could not open audio source PCM file", e); - } finally { - if (scanner != null) { - scanner.close(); - } - } - } - mUsbAlsaManager.setAccessoryAudioState(enabled, card, device); - mAudioSourceEnabled = enabled; - } - } - private void updateMidiFunction() { boolean enabled = (mCurrentFunctions & UsbManager.FUNCTION_MIDI) != 0; if (enabled != mMidiEnabled) { @@ -908,11 +899,13 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver break; case MSG_SET_SCREEN_UNLOCKED_FUNCTIONS: mScreenUnlockedFunctions = (Long) msg.obj; - SharedPreferences.Editor editor = mSettings.edit(); - editor.putString(String.format(Locale.ENGLISH, UNLOCKED_CONFIG_PREF, - mCurrentUser), - UsbManager.usbFunctionsToString(mScreenUnlockedFunctions)); - editor.commit(); + if (mSettings != null) { + SharedPreferences.Editor editor = mSettings.edit(); + editor.putString(String.format(Locale.ENGLISH, UNLOCKED_CONFIG_PREF, + mCurrentUser), + UsbManager.usbFunctionsToString(mScreenUnlockedFunctions)); + editor.commit(); + } if (!mScreenLocked && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) { // If the screen is unlocked, also set current functions. setScreenUnlockedFunctions(); @@ -923,14 +916,6 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver break; } mScreenLocked = msg.arg1 == 1; - if (mSettings == null && !mScreenLocked) { - // Shared preferences aren't accessible until the user has been unlocked. - mSettings = getPinnedSharedPrefs(mContext); - mScreenUnlockedFunctions = UsbManager.usbFunctionsFromString( - mSettings.getString( - String.format(Locale.ENGLISH, UNLOCKED_CONFIG_PREF, mCurrentUser), - "")); - } if (!mBootCompleted) { break; } @@ -984,12 +969,11 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver } mCurrentUser = msg.arg1; mScreenLocked = true; + mScreenUnlockedFunctions = UsbManager.FUNCTION_NONE; if (mSettings != null) { mScreenUnlockedFunctions = UsbManager.usbFunctionsFromString( - mSettings.getString( - String.format(Locale.ENGLISH, UNLOCKED_CONFIG_PREF, - mCurrentUser), - "")); + mSettings.getString(String.format(Locale.ENGLISH, + UNLOCKED_CONFIG_PREF, mCurrentUser), "")); } setEnabledFunctions(UsbManager.FUNCTION_NONE, false); } @@ -1270,32 +1254,66 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver return mScreenUnlockedFunctions; } + /** + * Dump a functions mask either as proto-enums (if dumping to proto) or a string (if dumping + * to a print writer) + */ + private void dumpFunctions(DualDumpOutputStream dump, String idName, long id, + long functions) { + // UsbHandlerProto.UsbFunction matches GadgetFunction + for (int i = 0; i < 63; i++) { + if ((functions & (1L << i)) != 0) { + if (dump.isProto()) { + dump.write(idName, id, 1L << i); + } else { + dump.write(idName, id, GadgetFunction.toString(1L << i)); + } + } + } + } - public void dump(IndentingPrintWriter pw) { - pw.println("USB Device State:"); - pw.println(" mCurrentFunctions: " + mCurrentFunctions); - pw.println(" mCurrentFunctionsApplied: " + mCurrentFunctionsApplied); - pw.println(" mScreenUnlockedFunctions: " + mScreenUnlockedFunctions); - pw.println(" mScreenLocked: " + mScreenLocked); - pw.println(" mConnected: " + mConnected); - pw.println(" mConfigured: " + mConfigured); - pw.println(" mCurrentAccessory: " + mCurrentAccessory); - pw.println(" mHostConnected: " + mHostConnected); - pw.println(" mSourcePower: " + mSourcePower); - pw.println(" mSinkPower: " + mSinkPower); - pw.println(" mUsbCharging: " + mUsbCharging); - pw.println(" mHideUsbNotification: " + mHideUsbNotification); - pw.println(" mAudioAccessoryConnected: " + mAudioAccessoryConnected); - pw.println(" mAdbEnabled: " + mAdbEnabled); + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dumpFunctions(dump, "current_functions", UsbHandlerProto.CURRENT_FUNCTIONS, + mCurrentFunctions); + dump.write("current_functions_applied", UsbHandlerProto.CURRENT_FUNCTIONS_APPLIED, + mCurrentFunctionsApplied); + dumpFunctions(dump, "screen_unlocked_functions", + UsbHandlerProto.SCREEN_UNLOCKED_FUNCTIONS, mScreenUnlockedFunctions); + dump.write("screen_locked", UsbHandlerProto.SCREEN_LOCKED, mScreenLocked); + dump.write("connected", UsbHandlerProto.CONNECTED, mConnected); + dump.write("configured", UsbHandlerProto.CONFIGURED, mConfigured); + if (mCurrentAccessory != null) { + writeAccessory(dump, "current_accessory", UsbHandlerProto.CURRENT_ACCESSORY, + mCurrentAccessory); + } + dump.write("host_connected", UsbHandlerProto.HOST_CONNECTED, mHostConnected); + dump.write("source_power", UsbHandlerProto.SOURCE_POWER, mSourcePower); + dump.write("sink_power", UsbHandlerProto.SINK_POWER, mSinkPower); + dump.write("usb_charging", UsbHandlerProto.USB_CHARGING, mUsbCharging); + dump.write("hide_usb_notification", UsbHandlerProto.HIDE_USB_NOTIFICATION, + mHideUsbNotification); + dump.write("audio_accessory_connected", UsbHandlerProto.AUDIO_ACCESSORY_CONNECTED, + mAudioAccessoryConnected); + dump.write("adb_enabled", UsbHandlerProto.ADB_ENABLED, mAdbEnabled); + + try { + writeStringIfNotNull(dump, "kernel_state", UsbHandlerProto.KERNEL_STATE, + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); + } catch (Exception e) { + Slog.e(TAG, "Could not read kernel state", e); + } try { - pw.println(" Kernel state: " - + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); - pw.println(" Kernel function list: " - + FileUtils.readTextFile(new File(FUNCTIONS_PATH), 0, null).trim()); - } catch (IOException e) { - pw.println("IOException: " + e); + writeStringIfNotNull(dump, "kernel_function_list", + UsbHandlerProto.KERNEL_FUNCTION_LIST, + FileUtils.readTextFile(new File(FUNCTIONS_PATH), 0, null).trim()); + } catch (Exception e) { + Slog.e(TAG, "Could not read kernel function list", e); } + + dump.end(token); } /** @@ -2026,13 +2044,21 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver } } - public void dump(IndentingPrintWriter pw) { + /** + * Write the state to a dump stream. + */ + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + if (mHandler != null) { - mHandler.dump(pw); + mHandler.dump(dump, "handler", UsbDeviceManagerProto.HANDLER); } if (mDebuggingManager != null) { - mDebuggingManager.dump(pw); + mDebuggingManager.dump(dump, "debugging_manager", + UsbDeviceManagerProto.DEBUGGING_MANAGER); } + + dump.end(token); } private native String[] nativeGetAccessoryStrings(); diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java index 7a352a4dc69d..0fcd075e8200 100644 --- a/services/usb/java/com/android/server/usb/UsbHostManager.java +++ b/services/usb/java/com/android/server/usb/UsbHostManager.java @@ -16,6 +16,10 @@ package com.android.server.usb; +import static com.android.internal.usb.DumpUtils.writeDevice; +import static com.android.internal.util.dump.DumpUtils.writeComponentName; + +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; @@ -23,11 +27,16 @@ import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.os.Bundle; import android.os.ParcelFileDescriptor; +import android.service.ServiceProtoEnums; +import android.service.usb.UsbConnectionRecordProto; +import android.service.usb.UsbHostManagerProto; +import android.service.usb.UsbIsHeadsetProto; import android.text.TextUtils; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.usb.descriptors.UsbDescriptor; import com.android.server.usb.descriptors.UsbDescriptorParser; import com.android.server.usb.descriptors.UsbDeviceDescriptor; @@ -44,7 +53,7 @@ import java.util.LinkedList; */ public class UsbHostManager { private static final String TAG = UsbHostManager.class.getSimpleName(); - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private final Context mContext; @@ -84,10 +93,13 @@ public class UsbHostManager { long mTimestamp; // Same time-base as system log. String mDeviceAddress; - static final int CONNECT = 0; - static final int CONNECT_BADPARSE = 1; - static final int CONNECT_BADDEVICE = 2; - static final int DISCONNECT = -1; + static final int CONNECT = ServiceProtoEnums.USB_CONNECTION_RECORD_MODE_CONNECT; // 0 + static final int CONNECT_BADPARSE = + ServiceProtoEnums.USB_CONNECTION_RECORD_MODE_CONNECT_BADPARSE; // 1 + static final int CONNECT_BADDEVICE = + ServiceProtoEnums.USB_CONNECTION_RECORD_MODE_CONNECT_BADDEVICE; // 2 + static final int DISCONNECT = + ServiceProtoEnums.USB_CONNECTION_RECORD_MODE_DISCONNECT; // -1 final int mMode; final byte[] mDescriptors; @@ -103,6 +115,31 @@ public class UsbHostManager { return (new StringBuilder(sFormat.format(new Date(mTimestamp)))).toString(); } + void dump(@NonNull DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("device_address", UsbConnectionRecordProto.DEVICE_ADDRESS, mDeviceAddress); + dump.write("mode", UsbConnectionRecordProto.MODE, mMode); + dump.write("timestamp", UsbConnectionRecordProto.TIMESTAMP, mTimestamp); + + if (mMode != DISCONNECT) { + UsbDescriptorParser parser = new UsbDescriptorParser(mDeviceAddress, mDescriptors); + + UsbDeviceDescriptor deviceDescriptor = parser.getDeviceDescriptor(); + + dump.write("manufacturer", UsbConnectionRecordProto.MANUFACTURER, + deviceDescriptor.getVendorID()); + dump.write("product", UsbConnectionRecordProto.PRODUCT, + deviceDescriptor.getProductID()); + long isHeadSetToken = dump.start("is_headset", UsbConnectionRecordProto.IS_HEADSET); + dump.write("in", UsbIsHeadsetProto.IN, parser.isInputHeadset()); + dump.write("out", UsbIsHeadsetProto.OUT, parser.isOutputHeadset()); + dump.end(isHeadSetToken); + } + + dump.end(token); + } + void dumpShort(IndentingPrintWriter pw) { if (mMode != DISCONNECT) { pw.println(formatTime() + " Connect " + mDeviceAddress + " mode:" + mMode); @@ -230,6 +267,7 @@ public class UsbHostManager { } private boolean isBlackListed(String deviceAddress) { + Slog.i(TAG, "isBlackListed(" + deviceAddress + ")"); int count = mHostBlacklist.length; for (int i = 0; i < count; i++) { if (deviceAddress.startsWith(mHostBlacklist[i])) { @@ -241,6 +279,7 @@ public class UsbHostManager { /* returns true if the USB device should not be accessible by applications */ private boolean isBlackListed(int clazz, int subClass) { + Slog.i(TAG, "isBlackListed(" + clazz + ", " + subClass + ")"); // blacklist hubs if (clazz == UsbConstants.USB_CLASS_HUB) return true; @@ -312,13 +351,7 @@ public class UsbHostManager { usbDeviceConnectionHandler); } - // Headset? - boolean isInputHeadset = parser.isInputHeadset(); - boolean isOutputHeadset = parser.isOutputHeadset(); - Slog.i(TAG, "---- isHeadset[in: " + isInputHeadset - + " , out: " + isOutputHeadset + "]"); - - mUsbAlsaManager.usbDeviceAdded(newDevice, isInputHeadset, isOutputHeadset); + mUsbAlsaManager.usbDeviceAdded(deviceAddress, newDevice, parser); // Tracking addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT, @@ -343,10 +376,13 @@ public class UsbHostManager { /* Called from JNI in monitorUsbHostBus to report USB device removal */ @SuppressWarnings("unused") private void usbDeviceRemoved(String deviceAddress) { + if (DEBUG) { + Slog.d(TAG, "usbDeviceRemoved(" + deviceAddress + ") - start"); + } synchronized (mLock) { UsbDevice device = mDevices.remove(deviceAddress); if (device != null) { - mUsbAlsaManager.usbDeviceRemoved(device); + mUsbAlsaManager.usbDeviceRemoved(deviceAddress/*device*/); mSettingsManager.usbDeviceRemoved(device); getCurrentUserSettings().usbDeviceRemoved(device); @@ -395,30 +431,30 @@ public class UsbHostManager { /** * Dump out various information about the state of USB device connections. - * */ - public void dump(IndentingPrintWriter pw, String[] args) { - pw.println("USB Host State:"); + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + synchronized (mHandlerLock) { if (mUsbDeviceConnectionHandler != null) { - pw.println("Default USB Host Connection handler: " + mUsbDeviceConnectionHandler); + writeComponentName(dump, "default_usb_host_connection_handler", + UsbHostManagerProto.DEFAULT_USB_HOST_CONNECTION_HANDLER, + mUsbDeviceConnectionHandler); } } synchronized (mLock) { for (String name : mDevices.keySet()) { - pw.println(" " + name + ": " + mDevices.get(name)); + writeDevice(dump, "devices", UsbHostManagerProto.DEVICES, mDevices.get(name)); } - // Connections - pw.println("" + mNumConnects + " total connects/disconnects"); - pw.println("Last " + mConnections.size() + " connections/disconnections"); + dump.write("num_connects", UsbHostManagerProto.NUM_CONNECTS, mNumConnects); + for (ConnectionRecord rec : mConnections) { - rec.dumpShort(pw); + rec.dump(dump, "connections", UsbHostManagerProto.CONNECTIONS); } - } - mUsbAlsaManager.dump(pw); + dump.end(token); } /** diff --git a/services/usb/java/com/android/server/usb/UsbMidiDevice.java b/services/usb/java/com/android/server/usb/UsbMidiDevice.java index cd19795747f5..f47636ed8ea4 100644 --- a/services/usb/java/com/android/server/usb/UsbMidiDevice.java +++ b/services/usb/java/com/android/server/usb/UsbMidiDevice.java @@ -16,14 +16,15 @@ package com.android.server.usb; +import android.annotation.NonNull; import android.content.Context; import android.media.midi.MidiDeviceInfo; import android.media.midi.MidiDeviceServer; import android.media.midi.MidiDeviceStatus; import android.media.midi.MidiManager; import android.media.midi.MidiReceiver; -import android.media.midi.MidiSender; import android.os.Bundle; +import android.service.usb.UsbMidiDeviceProto; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; @@ -32,6 +33,7 @@ import android.util.Log; import com.android.internal.midi.MidiEventScheduler; import com.android.internal.midi.MidiEventScheduler.MidiEvent; +import com.android.internal.util.dump.DualDumpOutputStream; import libcore.io.IoUtils; @@ -338,6 +340,20 @@ public final class UsbMidiDevice implements Closeable { mIsOpen = false; } + /** + * Write a description of the device to a dump stream. + */ + public void dump(String deviceAddr, @NonNull DualDumpOutputStream dump, @NonNull String idName, + long id) { + long token = dump.start(idName, id); + + dump.write("device_address", UsbMidiDeviceProto.DEVICE_ADDRESS, deviceAddr); + dump.write("card", UsbMidiDeviceProto.CARD, mAlsaCard); + dump.write("device", UsbMidiDeviceProto.DEVICE, mAlsaDevice); + + dump.end(token); + } + private static native int nativeGetSubdeviceCount(int card, int device); private native FileDescriptor[] nativeOpen(int card, int device, int subdeviceCount); private native void nativeClose(FileDescriptor[] fileDescriptors); diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index e28513a29a3a..ddb4f04200b8 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -16,6 +16,10 @@ package com.android.server.usb; +import static com.android.internal.usb.DumpUtils.writePort; +import static com.android.internal.usb.DumpUtils.writePortStatus; + +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbManager; @@ -38,12 +42,15 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.os.UserHandle; +import android.service.usb.UsbPortInfoProto; +import android.service.usb.UsbPortManagerProto; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.FgThread; import java.util.ArrayList; @@ -390,22 +397,22 @@ public class UsbPortManager { } } - public void dump(IndentingPrintWriter pw) { + /** + * Dump the USB port state. + */ + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + synchronized (mLock) { - pw.print("USB Port State:"); - if (!mSimulatedPorts.isEmpty()) { - pw.print(" (simulation active; end with 'dumpsys usb reset')"); - } - pw.println(); + dump.write("is_simulation_active", UsbPortManagerProto.IS_SIMULATION_ACTIVE, + !mSimulatedPorts.isEmpty()); - if (mPorts.isEmpty()) { - pw.println(" <no ports>"); - } else { - for (PortInfo portInfo : mPorts.values()) { - pw.println(" " + portInfo.mUsbPort.getId() + ": " + portInfo); - } + for (PortInfo portInfo : mPorts.values()) { + portInfo.dump(dump, "usb_ports", UsbPortManagerProto.USB_PORTS); } } + + dump.end(token); } private static class HALCallback extends IUsbCallback.Stub { @@ -765,6 +772,20 @@ public class UsbPortManager { return false; } + void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) { + long token = dump.start(idName, id); + + writePort(dump, "port", UsbPortInfoProto.PORT, mUsbPort); + writePortStatus(dump, "status", UsbPortInfoProto.STATUS, mUsbPortStatus); + dump.write("can_change_mode", UsbPortInfoProto.CAN_CHANGE_MODE, mCanChangeMode); + dump.write("can_change_power_role", UsbPortInfoProto.CAN_CHANGE_POWER_ROLE, + mCanChangePowerRole); + dump.write("can_change_data_role", UsbPortInfoProto.CAN_CHANGE_DATA_ROLE, + mCanChangeDataRole); + + dump.end(token); + } + @Override public String toString() { return "port=" + mUsbPort + ", status=" + mUsbPortStatus diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java index 5f1f5e496de1..4b2d9b9adbbb 100644 --- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java @@ -41,6 +41,10 @@ import android.os.AsyncTask; import android.os.Environment; import android.os.UserHandle; import android.os.UserManager; +import android.service.usb.UsbProfileGroupSettingsManagerProto; +import android.service.usb.UsbSettingsAccessoryPreferenceProto; +import android.service.usb.UsbSettingsDevicePreferenceProto; +import android.service.usb.UserPackageProto; import android.util.AtomicFile; import android.util.Log; import android.util.Slog; @@ -52,8 +56,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.Immutable; import com.android.internal.content.PackageMonitor; import com.android.internal.util.FastXmlSerializer; -import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.XmlUtils; +import com.android.internal.util.dump.DualDumpOutputStream; import libcore.io.IoUtils; @@ -154,6 +158,15 @@ class UsbProfileGroupSettingsManager { public String toString() { return user.getIdentifier() + "/" + packageName; } + + public void dump(DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + + dump.write("user_id", UserPackageProto.USER_ID, user.getIdentifier()); + dump.write("package_name", UserPackageProto.PACKAGE_NAME, packageName); + + dump.end(token); + } } private class MyPackageMonitor extends PackageMonitor { @@ -1109,17 +1122,38 @@ class UsbProfileGroupSettingsManager { } } - public void dump(IndentingPrintWriter pw) { + public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) { + long token = dump.start(idName, id); + synchronized (mLock) { - pw.println("Device preferences:"); + dump.write("parent_user_id", UsbProfileGroupSettingsManagerProto.PARENT_USER_ID, + mParentUser.getIdentifier()); + for (DeviceFilter filter : mDevicePreferenceMap.keySet()) { - pw.println(" " + filter + ": " + mDevicePreferenceMap.get(filter)); + long devicePrefToken = dump.start("device_preferences", + UsbProfileGroupSettingsManagerProto.DEVICE_PREFERENCES); + + filter.dump(dump, "filter", UsbSettingsDevicePreferenceProto.FILTER); + + mDevicePreferenceMap.get(filter).dump(dump, "user_package", + UsbSettingsDevicePreferenceProto.USER_PACKAGE); + + dump.end(devicePrefToken); } - pw.println("Accessory preferences:"); for (AccessoryFilter filter : mAccessoryPreferenceMap.keySet()) { - pw.println(" " + filter + ": " + mAccessoryPreferenceMap.get(filter)); + long accessoryPrefToken = dump.start("accessory_preferences", + UsbProfileGroupSettingsManagerProto.ACCESSORY_PREFERENCES); + + filter.dump(dump, "filter", UsbSettingsAccessoryPreferenceProto.FILTER); + + mAccessoryPreferenceMap.get(filter).dump(dump, "user_package", + UsbSettingsAccessoryPreferenceProto.USER_PACKAGE); + + dump.end(accessoryPrefToken); } } + + dump.end(token); } private static Intent createDeviceAttachedIntent(UsbDevice device) { diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index 2f6e53143312..1edc46967495 100644 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -37,17 +37,22 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.UserHandle; import android.os.UserManager; +import android.service.usb.UsbServiceDumpProto; +import android.util.ArraySet; import android.util.Slog; +import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.internal.util.dump.DualDumpOutputStream; import com.android.server.SystemService; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; /** * UsbService manages all USB related state, including both host and device support. @@ -503,21 +508,38 @@ public class UsbService extends IUsbManager.Stub { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); final long ident = Binder.clearCallingIdentity(); try { - if (args == null || args.length == 0 || "-a".equals(args[0])) { - pw.println("USB Manager State:"); - pw.increaseIndent(); + ArraySet<String> argsSet = new ArraySet<>(); + Collections.addAll(argsSet, args); + + boolean dumpAsProto = false; + if (argsSet.contains("--proto")) { + dumpAsProto = true; + } + + if (args == null || args.length == 0 || args[0].equals("-a") || dumpAsProto) { + DualDumpOutputStream dump; + if (dumpAsProto) { + dump = new DualDumpOutputStream(new ProtoOutputStream(fd)); + } else { + pw.println("USB MANAGER STATE (dumpsys usb):"); + + dump = new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")); + } + if (mDeviceManager != null) { - mDeviceManager.dump(pw); + mDeviceManager.dump(dump, "device_manager", UsbServiceDumpProto.DEVICE_MANAGER); } if (mHostManager != null) { - mHostManager.dump(pw, args); + mHostManager.dump(dump, "host_manager", UsbServiceDumpProto.HOST_MANAGER); } if (mPortManager != null) { - mPortManager.dump(pw); + mPortManager.dump(dump, "port_manager", UsbServiceDumpProto.PORT_MANAGER); } - mAlsaManager.dump(pw); + mAlsaManager.dump(dump, "alsa_manager", UsbServiceDumpProto.ALSA_MANAGER); - mSettingsManager.dump(pw); + mSettingsManager.dump(dump, "settings_manager", + UsbServiceDumpProto.SETTINGS_MANAGER); + dump.flush(); } else if ("set-port-roles".equals(args[0]) && args.length == 4) { final String portId = args[1]; final int powerRole; @@ -558,7 +580,8 @@ public class UsbService extends IUsbManager.Stub { // during debugging, it might be worth adding a sleep here before // dumping the new state. pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("add-port".equals(args[0]) && args.length == 3) { final String portId = args[1]; @@ -583,7 +606,8 @@ public class UsbService extends IUsbManager.Stub { if (mPortManager != null) { mPortManager.addSimulatedPort(portId, supportedModes, pw); pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("connect-port".equals(args[0]) && args.length == 5) { final String portId = args[1]; @@ -630,31 +654,36 @@ public class UsbService extends IUsbManager.Stub { mPortManager.connectSimulatedPort(portId, mode, canChangeMode, powerRole, canChangePowerRole, dataRole, canChangeDataRole, pw); pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("disconnect-port".equals(args[0]) && args.length == 2) { final String portId = args[1]; if (mPortManager != null) { mPortManager.disconnectSimulatedPort(portId, pw); pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("remove-port".equals(args[0]) && args.length == 2) { final String portId = args[1]; if (mPortManager != null) { mPortManager.removeSimulatedPort(portId, pw); pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("reset".equals(args[0]) && args.length == 1) { if (mPortManager != null) { mPortManager.resetSimulation(pw); pw.println(); - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("ports".equals(args[0]) && args.length == 1) { if (mPortManager != null) { - mPortManager.dump(pw); + mPortManager.dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")), + "", 0); } } else if ("dump-descriptors".equals(args[0])) { mHostManager.dumpDescriptors(pw, args); diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java index c7e5998db70d..caf05a3538ec 100644 --- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java @@ -26,11 +26,12 @@ import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.UserHandle; import android.os.UserManager; +import android.service.usb.UsbSettingsManagerProto; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; /** * Maintains all {@link UsbUserSettingsManager} for all users. @@ -134,39 +135,27 @@ class UsbSettingsManager { /** * Dump all settings of all users. - * - * @param pw The writer to dump to */ - void dump(@NonNull IndentingPrintWriter pw) { + void dump(@NonNull DualDumpOutputStream dump, String idName, long id) { + long token = dump.start(idName, id); + synchronized (mSettingsByUser) { int numUsers = mSettingsByUser.size(); for (int i = 0; i < numUsers; i++) { - final int userId = mSettingsByUser.keyAt(i); - final UsbUserSettingsManager settings = mSettingsByUser.valueAt(i); - pw.println("Settings for user " + userId + ":"); - pw.increaseIndent(); - try { - settings.dump(pw); - } finally { - pw.decreaseIndent(); - } + mSettingsByUser.valueAt(i).dump(dump, "user_settings", + UsbSettingsManagerProto.USER_SETTINGS); } } synchronized (mSettingsByProfileGroup) { int numProfileGroups = mSettingsByProfileGroup.size(); for (int i = 0; i < numProfileGroups; i++) { - final int parentUserId = mSettingsByProfileGroup.keyAt(i); - final UsbProfileGroupSettingsManager settings = mSettingsByProfileGroup.valueAt(i); - pw.println("Settings for profile group " + parentUserId + ":"); - pw.increaseIndent(); - try { - settings.dump(pw); - } finally { - pw.decreaseIndent(); - } + mSettingsByProfileGroup.valueAt(i).dump(dump, "profile_group_settings", + UsbSettingsManagerProto.PROFILE_GROUP_SETTINGS); } } + + dump.end(token); } /** diff --git a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java index 11e43e308e8a..840950679903 100644 --- a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java @@ -25,17 +25,20 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.hardware.usb.UsbAccessory; +import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbInterface; -import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbManager; import android.os.Binder; import android.os.Process; import android.os.UserHandle; +import android.service.usb.UsbSettingsAccessoryPermissionProto; +import android.service.usb.UsbSettingsDevicePermissionProto; +import android.service.usb.UsbUserSettingsManagerProto; import android.util.Slog; import android.util.SparseBooleanArray; -import com.android.internal.util.IndentingPrintWriter; +import com.android.internal.util.dump.DualDumpOutputStream; import java.util.HashMap; @@ -302,28 +305,44 @@ class UsbUserSettingsManager { } } - public void dump(IndentingPrintWriter pw) { + public void dump(@NonNull DualDumpOutputStream dump, @NonNull String idName, long id) { + long token = dump.start(idName, id); + synchronized (mLock) { - pw.println("Device permissions:"); + dump.write("user_id", UsbUserSettingsManagerProto.USER_ID, mUser.getIdentifier()); + for (String deviceName : mDevicePermissionMap.keySet()) { - pw.print(" " + deviceName + ": "); + long devicePermissionToken = dump.start("device_permissions", + UsbUserSettingsManagerProto.DEVICE_PERMISSIONS); + + dump.write("device_name", UsbSettingsDevicePermissionProto.DEVICE_NAME, deviceName); + SparseBooleanArray uidList = mDevicePermissionMap.get(deviceName); int count = uidList.size(); for (int i = 0; i < count; i++) { - pw.print(Integer.toString(uidList.keyAt(i)) + " "); + dump.write("uids", UsbSettingsDevicePermissionProto.UIDS, uidList.keyAt(i)); } - pw.println(); + + dump.end(devicePermissionToken); } - pw.println("Accessory permissions:"); for (UsbAccessory accessory : mAccessoryPermissionMap.keySet()) { - pw.print(" " + accessory + ": "); + long accessoryPermissionToken = dump.start("accessory_permissions", + UsbUserSettingsManagerProto.ACCESSORY_PERMISSIONS); + + dump.write("accessory_description", + UsbSettingsAccessoryPermissionProto.ACCESSORY_DESCRIPTION, + accessory.getDescription()); + SparseBooleanArray uidList = mAccessoryPermissionMap.get(accessory); int count = uidList.size(); for (int i = 0; i < count; i++) { - pw.print(Integer.toString(uidList.keyAt(i)) + " "); + dump.write("uids", UsbSettingsAccessoryPermissionProto.UIDS, uidList.keyAt(i)); } - pw.println(); + + dump.end(accessoryPermissionToken); } } + + dump.end(token); } } diff --git a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java index 7a1e9e2f9896..297a6eab4a78 100644 --- a/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java +++ b/services/usb/java/com/android/server/usb/descriptors/UsbDescriptorParser.java @@ -26,7 +26,7 @@ import java.util.ArrayList; */ public final class UsbDescriptorParser { private static final String TAG = "UsbDescriptorParser"; - private static final boolean DEBUG = true; + private static final boolean DEBUG = false; private final String mDeviceAddr; @@ -358,50 +358,93 @@ public final class UsbDescriptorParser { return list; } + /* + * Attribute predicates + */ /** * @hide */ - public boolean hasHIDDescriptor() { - ArrayList<UsbDescriptor> descriptors = - getInterfaceDescriptorsForClass(UsbDescriptor.CLASSID_HID); - return !descriptors.isEmpty(); + public boolean hasInput() { + if (DEBUG) { + Log.d(TAG, "---- hasInput()"); + } + ArrayList<UsbDescriptor> acDescriptors = + getACInterfaceDescriptors(UsbACInterface.ACI_INPUT_TERMINAL, + UsbACInterface.AUDIO_AUDIOCONTROL); + boolean hasInput = false; + for (UsbDescriptor descriptor : acDescriptors) { + if (descriptor instanceof UsbACTerminal) { + UsbACTerminal inDescr = (UsbACTerminal) descriptor; + // Check for input and bi-directional terminal types + int type = inDescr.getTerminalType(); + if (DEBUG) { + Log.d(TAG, " type:0x" + Integer.toHexString(type)); + } + if ((type >= UsbTerminalTypes.TERMINAL_IN_UNDEFINED + && type <= UsbTerminalTypes.TERMINAL_IN_PROC_MIC_ARRAY) + || (type >= UsbTerminalTypes.TERMINAL_BIDIR_UNDEFINED + && type <= UsbTerminalTypes.TERMINAL_BIDIR_SKRPHONE_CANCEL) + || (type == UsbTerminalTypes.TERMINAL_USB_STREAMING)) { + hasInput = true; + break; + } + } else { + Log.w(TAG, "Undefined Audio Input terminal l: " + descriptor.getLength() + + " t:0x" + Integer.toHexString(descriptor.getType())); + } + } + + if (DEBUG) { + Log.d(TAG, "hasInput() = " + hasInput); + } + return hasInput; } /** * @hide */ - public boolean hasMIDIInterface() { - ArrayList<UsbDescriptor> descriptors = - getInterfaceDescriptorsForClass(UsbDescriptor.CLASSID_AUDIO); - for (UsbDescriptor descriptor : descriptors) { - // enusure that this isn't an unrecognized interface descriptor - if (descriptor instanceof UsbInterfaceDescriptor) { - UsbInterfaceDescriptor interfaceDescr = (UsbInterfaceDescriptor) descriptor; - if (interfaceDescr.getUsbSubclass() == UsbDescriptor.AUDIO_MIDISTREAMING) { - return true; + public boolean hasOutput() { + if (DEBUG) { + Log.d(TAG, "---- hasOutput()"); + } + ArrayList<UsbDescriptor> acDescriptors = + getACInterfaceDescriptors(UsbACInterface.ACI_OUTPUT_TERMINAL, + UsbACInterface.AUDIO_AUDIOCONTROL); + boolean hasOutput = false; + for (UsbDescriptor descriptor : acDescriptors) { + if (descriptor instanceof UsbACTerminal) { + UsbACTerminal outDescr = (UsbACTerminal) descriptor; + // Check for output and bi-directional terminal types + int type = outDescr.getTerminalType(); + if (DEBUG) { + Log.d(TAG, " type:0x" + Integer.toHexString(type)); + } + if ((type >= UsbTerminalTypes.TERMINAL_OUT_UNDEFINED + && type <= UsbTerminalTypes.TERMINAL_OUT_LFSPEAKER) + || (type >= UsbTerminalTypes.TERMINAL_BIDIR_UNDEFINED + && type <= UsbTerminalTypes.TERMINAL_BIDIR_SKRPHONE_CANCEL)) { + hasOutput = true; + break; } } else { - Log.w(TAG, "Undefined Audio Class Interface l: " + descriptor.getLength() + Log.w(TAG, "Undefined Audio Input terminal l: " + descriptor.getLength() + " t:0x" + Integer.toHexString(descriptor.getType())); } } - return false; + if (DEBUG) { + Log.d(TAG, "hasOutput() = " + hasOutput); + } + return hasOutput; } /** * @hide */ - public float getInputHeadsetProbability() { - if (hasMIDIInterface()) { - return 0.0f; - } - - float probability = 0.0f; - ArrayList<UsbDescriptor> acDescriptors; - - // Look for a microphone + public boolean hasMic() { boolean hasMic = false; - acDescriptors = getACInterfaceDescriptors(UsbACInterface.ACI_INPUT_TERMINAL, + + ArrayList<UsbDescriptor> acDescriptors = + getACInterfaceDescriptors(UsbACInterface.ACI_INPUT_TERMINAL, UsbACInterface.AUDIO_AUDIOCONTROL); for (UsbDescriptor descriptor : acDescriptors) { if (descriptor instanceof UsbACTerminal) { @@ -418,18 +461,23 @@ public final class UsbDescriptorParser { + " t:0x" + Integer.toHexString(descriptor.getType())); } } + return hasMic; + } - // Look for a "speaker" + /** + * @hide + */ + public boolean hasSpeaker() { boolean hasSpeaker = false; - acDescriptors = + + ArrayList<UsbDescriptor> acDescriptors = getACInterfaceDescriptors(UsbACInterface.ACI_OUTPUT_TERMINAL, UsbACInterface.AUDIO_AUDIOCONTROL); for (UsbDescriptor descriptor : acDescriptors) { if (descriptor instanceof UsbACTerminal) { UsbACTerminal outDescr = (UsbACTerminal) descriptor; if (outDescr.getTerminalType() == UsbTerminalTypes.TERMINAL_OUT_SPEAKER - || outDescr.getTerminalType() - == UsbTerminalTypes.TERMINAL_OUT_HEADPHONES + || outDescr.getTerminalType() == UsbTerminalTypes.TERMINAL_OUT_HEADPHONES || outDescr.getTerminalType() == UsbTerminalTypes.TERMINAL_BIDIR_HEADSET) { hasSpeaker = true; break; @@ -440,6 +488,55 @@ public final class UsbDescriptorParser { } } + return hasSpeaker; + } + + /** + * @hide + */ + public boolean hasHIDDescriptor() { + ArrayList<UsbDescriptor> descriptors = + getInterfaceDescriptorsForClass(UsbDescriptor.CLASSID_HID); + return !descriptors.isEmpty(); + } + + /** + * @hide + */ + public boolean hasMIDIInterface() { + ArrayList<UsbDescriptor> descriptors = + getInterfaceDescriptorsForClass(UsbDescriptor.CLASSID_AUDIO); + for (UsbDescriptor descriptor : descriptors) { + // enusure that this isn't an unrecognized interface descriptor + if (descriptor instanceof UsbInterfaceDescriptor) { + UsbInterfaceDescriptor interfaceDescr = (UsbInterfaceDescriptor) descriptor; + if (interfaceDescr.getUsbSubclass() == UsbDescriptor.AUDIO_MIDISTREAMING) { + return true; + } + } else { + Log.w(TAG, "Undefined Audio Class Interface l: " + descriptor.getLength() + + " t:0x" + Integer.toHexString(descriptor.getType())); + } + } + return false; + } + + /** + * @hide + */ + public float getInputHeadsetProbability() { + if (hasMIDIInterface()) { + return 0.0f; + } + + float probability = 0.0f; + + // Look for a microphone + boolean hasMic = hasMic(); + + // Look for a "speaker" + boolean hasSpeaker = hasSpeaker(); + if (hasMic && hasSpeaker) { probability += 0.75f; } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index fcfc5931ac7b..95eb14ada354 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -134,6 +134,25 @@ public final class PhoneAccount implements Parcelable { "android.telecom.extra.LOG_SELF_MANAGED_CALLS"; /** + * Boolean {@link PhoneAccount} extras key (see {@link PhoneAccount#getExtras()}) which + * indicates whether calls for a {@link PhoneAccount} should generate a "call recording tone" + * when the user is recording audio on the device. + * <p> + * The call recording tone is played over the telephony audio stream so that the remote party + * has an audible indication that it is possible their call is being recorded using a call + * recording app on the device. + * <p> + * This extra only has an effect for calls placed via Telephony (e.g. + * {@link #CAPABILITY_SIM_SUBSCRIPTION}). + * <p> + * The call recording tone is a 1400 hz tone which repeats every 15 seconds while recording is + * in progress. + * @hide + */ + public static final String EXTRA_PLAY_CALL_RECORDING_TONE = + "android.telecom.extra.PLAY_CALL_RECORDING_TONE"; + + /** * Flag indicating that this {@code PhoneAccount} can act as a connection manager for * other connections. The {@link ConnectionService} associated with this {@code PhoneAccount} * will be allowed to manage phone calls including using its own proprietary phone-call diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index a34e9f9481fa..7eb691be9d25 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -77,6 +77,14 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_VOLTE_PROVISIONED_BOOL = "carrier_volte_provisioned_bool"; + /** + * Boolean indicating if the "Call barring" item is visible in the Call Settings menu. + * true means visible. false means gone. + * @hide + */ + public static final String KEY_CALL_BARRING_VISIBILITY_BOOL = + "call_barring_visibility_bool"; + /** * Flag indicating whether the Phone app should ignore EVENT_SIM_NETWORK_LOCKED * events from the Sim. @@ -146,6 +154,15 @@ public class CarrierConfigManager { public static final String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool"; /** + * Determines if the carrier requires that a tone be played to the remote party when an app is + * recording audio during a call (e.g. using a call recording app). + * <p> + * Note: This requires the Telephony config_supports_telephony_audio_device overlay to be true + * in order to work. + * @hide + */ + public static final String KEY_PLAY_CALL_RECORDING_TONE_BOOL = "play_call_recording_tone_bool"; + /** * Determines if the carrier requires converting the destination number before sending out an * SMS. Certain networks and numbering plans require different formats. */ @@ -503,6 +520,20 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL = "carrier_volte_override_wfc_provisioning_bool"; + /** + * Override the device's configuration for the cellular data service to use for this SIM card. + * @hide + */ + public static final String KEY_CARRIER_DATA_SERVICE_WWAN_PACKAGE_OVERRIDE_STRING + = "carrier_data_service_wwan_package_override_string"; + + /** + * Override the device's configuration for the IWLAN data service to use for this SIM card. + * @hide + */ + public static final String KEY_CARRIER_DATA_SERVICE_WLAN_PACKAGE_OVERRIDE_STRING + = "carrier_data_service_wlan_package_override_string"; + /** Flag specifying whether VoLTE TTY is supported. */ public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool"; @@ -1381,6 +1412,14 @@ public class CarrierConfigManager { public static final String KEY_VIDEO_CALLS_CAN_BE_HD_AUDIO = "video_calls_can_be_hd_audio"; /** + * When true, indicates that the HD audio icon in the in-call screen should be shown for + * GSM/CDMA calls. + * @hide + */ + public static final String KEY_GSM_CDMA_CALLS_CAN_BE_HD_AUDIO = + "gsm_cdma_calls_can_be_hd_audio"; + + /** * Whether system apps are allowed to use fallback if carrier video call is not available. * Defaults to {@code true}. * @@ -1783,6 +1822,22 @@ public class CarrierConfigManager { public static final String KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY = "lte_rsrp_thresholds_int_array"; + /** + * Decides when clients try to bind to iwlan network service, which package name will + * the binding intent go to. + * @hide + */ + public static final String KEY_CARRIER_NETWORK_SERVICE_WLAN_PACKAGE_OVERRIDE_STRING + = "carrier_network_service_wlan_package_override_string"; + + /** + * Decides when clients try to bind to wwan (cellular) network service, which package name will + * the binding intent go to. + * @hide + */ + public static final String KEY_CARRIER_NETWORK_SERVICE_WWAN_PACKAGE_OVERRIDE_STRING + = "carrier_network_service_wwan_package_override_string"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -1793,6 +1848,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_ADDITIONAL_CALL_SETTING_BOOL, true); sDefaults.putBoolean(KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL, false); sDefaults.putBoolean(KEY_ALLOW_LOCAL_DTMF_TONES_BOOL, true); + sDefaults.putBoolean(KEY_PLAY_CALL_RECORDING_TONE_BOOL, false); sDefaults.putBoolean(KEY_APN_EXPAND_BOOL, true); sDefaults.putBoolean(KEY_AUTO_RETRY_ENABLED_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_SETTINGS_ENABLE_BOOL, false); @@ -1820,6 +1876,10 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL, true); + sDefaults.putString(KEY_CARRIER_NETWORK_SERVICE_WWAN_PACKAGE_OVERRIDE_STRING, ""); + sDefaults.putString(KEY_CARRIER_NETWORK_SERVICE_WLAN_PACKAGE_OVERRIDE_STRING, ""); + sDefaults.putString(KEY_CARRIER_DATA_SERVICE_WWAN_PACKAGE_OVERRIDE_STRING, ""); + sDefaults.putString(KEY_CARRIER_DATA_SERVICE_WLAN_PACKAGE_OVERRIDE_STRING, ""); sDefaults.putString(KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING, ""); sDefaults.putString(KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING, ""); sDefaults.putString(KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING, ""); @@ -1833,6 +1893,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONED_BOOL, false); + sDefaults.putBoolean(KEY_CALL_BARRING_VISIBILITY_BOOL, false); sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false); sDefaults.putBoolean(KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL, false); sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true); @@ -2033,6 +2094,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL, true); sDefaults.putBoolean(KEY_WIFI_CALLS_CAN_BE_HD_AUDIO, true); sDefaults.putBoolean(KEY_VIDEO_CALLS_CAN_BE_HD_AUDIO, true); + sDefaults.putBoolean(KEY_GSM_CDMA_CALLS_CAN_BE_HD_AUDIO, false); sDefaults.putBoolean(KEY_ALLOW_VIDEO_CALLING_FALLBACK_BOOL, true); sDefaults.putStringArray(KEY_IMS_REASONINFO_MAPPING_STRING_ARRAY, null); diff --git a/telephony/java/android/telephony/CellSignalStrengthCdma.java b/telephony/java/android/telephony/CellSignalStrengthCdma.java index dfaaab918012..ece1ee378170 100644 --- a/telephony/java/android/telephony/CellSignalStrengthCdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthCdma.java @@ -36,48 +36,14 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements private int mEvdoEcio; // This value is the EVDO Ec/Io private int mEvdoSnr; // Valid values are 0-8. 8 is the highest signal to noise ratio - /** - * Empty constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthCdma() { setDefaultValues(); } - /** - * Constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthCdma(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr) { - initialize(cdmaDbm, cdmaEcio, evdoDbm, evdoEcio, evdoSnr); - } - - /** - * Copy constructors - * - * @param s Source SignalStrength - * - * @hide - */ - public CellSignalStrengthCdma(CellSignalStrengthCdma s) { - copyFrom(s); - } - - /** - * Initialize all the values - * - * @param cdmaDbm - * @param cdmaEcio - * @param evdoDbm - * @param evdoEcio - * @param evdoSnr - * - * @hide - */ - public void initialize(int cdmaDbm, int cdmaEcio, int evdoDbm, int evdoEcio, int evdoSnr) { mCdmaDbm = cdmaDbm; mCdmaEcio = cdmaEcio; mEvdoDbm = evdoDbm; @@ -85,9 +51,12 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoSnr = evdoSnr; } - /** - * @hide - */ + /** @hide */ + public CellSignalStrengthCdma(CellSignalStrengthCdma s) { + copyFrom(s); + } + + /** @hide */ protected void copyFrom(CellSignalStrengthCdma s) { mCdmaDbm = s.mCdmaDbm; mCdmaEcio = s.mCdmaEcio; @@ -96,9 +65,7 @@ public final class CellSignalStrengthCdma extends CellSignalStrength implements mEvdoSnr = s.mEvdoSnr; } - /** - * @hide - */ + /** @hide */ @Override public CellSignalStrengthCdma copy() { return new CellSignalStrengthCdma(this); diff --git a/telephony/java/android/telephony/CellSignalStrengthGsm.java b/telephony/java/android/telephony/CellSignalStrengthGsm.java index f68d2cad1226..8687cd1c454b 100644 --- a/telephony/java/android/telephony/CellSignalStrengthGsm.java +++ b/telephony/java/android/telephony/CellSignalStrengthGsm.java @@ -34,80 +34,40 @@ public final class CellSignalStrengthGsm extends CellSignalStrength implements P private static final int GSM_SIGNAL_STRENGTH_GOOD = 8; private static final int GSM_SIGNAL_STRENGTH_MODERATE = 5; - private int mSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 + private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 - private int mTimingAdvance; + private int mTimingAdvance; // range from 0-219 or Integer.MAX_VALUE if unknown - /** - * Empty constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthGsm() { setDefaultValues(); } - /** - * Constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthGsm(int ss, int ber) { - initialize(ss, ber); - } - - /** - * Copy constructors - * - * @param s Source SignalStrength - * - * @hide - */ - public CellSignalStrengthGsm(CellSignalStrengthGsm s) { - copyFrom(s); + this(ss, ber, Integer.MAX_VALUE); } - /** - * Initialize all the values - * - * @param ss SignalStrength as ASU value - * @param ber is Bit Error Rate - * - * @hide - */ - public void initialize(int ss, int ber) { + /** @hide */ + public CellSignalStrengthGsm(int ss, int ber, int ta) { mSignalStrength = ss; mBitErrorRate = ber; - mTimingAdvance = Integer.MAX_VALUE; + mTimingAdvance = ta; } - /** - * Initialize all the values - * - * @param ss SignalStrength as ASU value - * @param ber is Bit Error Rate - * @param ta timing advance - * - * @hide - */ - public void initialize(int ss, int ber, int ta) { - mSignalStrength = ss; - mBitErrorRate = ber; - mTimingAdvance = ta; + /** @hide */ + public CellSignalStrengthGsm(CellSignalStrengthGsm s) { + copyFrom(s); } - /** - * @hide - */ + /** @hide */ protected void copyFrom(CellSignalStrengthGsm s) { mSignalStrength = s.mSignalStrength; mBitErrorRate = s.mBitErrorRate; mTimingAdvance = s.mTimingAdvance; } - /** - * @hide - */ + /** @hide */ @Override public CellSignalStrengthGsm copy() { return new CellSignalStrengthGsm(this); diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java index 6ffc8b6e497c..f009fb145fc2 100644 --- a/telephony/java/android/telephony/CellSignalStrengthLte.java +++ b/telephony/java/android/telephony/CellSignalStrengthLte.java @@ -37,50 +37,15 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P private int mCqi; private int mTimingAdvance; - /** - * Empty constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthLte() { setDefaultValues(); } - /** - * Constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthLte(int signalStrength, int rsrp, int rsrq, int rssnr, int cqi, int timingAdvance) { - initialize(signalStrength, rsrp, rsrq, rssnr, cqi, timingAdvance); - } - - /** - * Copy constructors - * - * @param s Source SignalStrength - * - * @hide - */ - public CellSignalStrengthLte(CellSignalStrengthLte s) { - copyFrom(s); - } - - /** - * Initialize all the values - * - * @param lteSignalStrength - * @param rsrp - * @param rsrq - * @param rssnr - * @param cqi - * - * @hide - */ - public void initialize(int lteSignalStrength, int rsrp, int rsrq, int rssnr, int cqi, - int timingAdvance) { - mSignalStrength = lteSignalStrength; + mSignalStrength = signalStrength; mRsrp = rsrp; mRsrq = rsrq; mRssnr = rssnr; @@ -88,25 +53,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P mTimingAdvance = timingAdvance; } - /** - * Initialize from the SignalStrength structure. - * - * @param ss - * - * @hide - */ - public void initialize(SignalStrength ss, int timingAdvance) { - mSignalStrength = ss.getLteSignalStrength(); - mRsrp = ss.getLteRsrp(); - mRsrq = ss.getLteRsrq(); - mRssnr = ss.getLteRssnr(); - mCqi = ss.getLteCqi(); - mTimingAdvance = timingAdvance; + /** @hide */ + public CellSignalStrengthLte(CellSignalStrengthLte s) { + copyFrom(s); } - /** - * @hide - */ + /** @hide */ protected void copyFrom(CellSignalStrengthLte s) { mSignalStrength = s.mSignalStrength; mRsrp = s.mRsrp; @@ -116,9 +68,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P mTimingAdvance = s.mTimingAdvance; } - /** - * @hide - */ + /** @hide */ @Override public CellSignalStrengthLte copy() { return new CellSignalStrengthLte(this); diff --git a/telephony/java/android/telephony/CellSignalStrengthWcdma.java b/telephony/java/android/telephony/CellSignalStrengthWcdma.java index 2cd56b8500a6..dd32a960db91 100644 --- a/telephony/java/android/telephony/CellSignalStrengthWcdma.java +++ b/telephony/java/android/telephony/CellSignalStrengthWcdma.java @@ -34,62 +34,32 @@ public final class CellSignalStrengthWcdma extends CellSignalStrength implements private static final int WCDMA_SIGNAL_STRENGTH_GOOD = 8; private static final int WCDMA_SIGNAL_STRENGTH_MODERATE = 5; - private int mSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5 - private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 + private int mSignalStrength; // in ASU; Valid values are (0-31, 99) as defined in TS 27.007 8.5 + private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5 - /** - * Empty constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthWcdma() { setDefaultValues(); } - /** - * Constructor - * - * @hide - */ + /** @hide */ public CellSignalStrengthWcdma(int ss, int ber) { - initialize(ss, ber); + mSignalStrength = ss; + mBitErrorRate = ber; } - /** - * Copy constructors - * - * @param s Source SignalStrength - * - * @hide - */ + /** @hide */ public CellSignalStrengthWcdma(CellSignalStrengthWcdma s) { copyFrom(s); } - /** - * Initialize all the values - * - * @param ss SignalStrength as ASU value - * @param ber is Bit Error Rate - * - * @hide - */ - public void initialize(int ss, int ber) { - mSignalStrength = ss; - mBitErrorRate = ber; - } - - /** - * @hide - */ + /** @hide */ protected void copyFrom(CellSignalStrengthWcdma s) { mSignalStrength = s.mSignalStrength; mBitErrorRate = s.mBitErrorRate; } - /** - * @hide - */ + /** @hide */ @Override public CellSignalStrengthWcdma copy() { return new CellSignalStrengthWcdma(this); diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java new file mode 100644 index 000000000000..b362df9ff677 --- /dev/null +++ b/telephony/java/android/telephony/LocationAccessPolicy.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2017 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.telephony; + +import android.Manifest; +import android.annotation.NonNull; +import android.annotation.UserIdInt; +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.location.LocationManager; +import android.os.Binder; +import android.os.Build; +import android.os.Process; +import android.os.Trace; +import android.os.UserHandle; +import android.os.UserManager; +import android.provider.Settings; +import android.util.SparseBooleanArray; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Helper for performing location access checks. + * @hide + */ +public final class LocationAccessPolicy { + /** + * API to determine if the caller has permissions to get cell location. + * + * @param pkgName Package name of the application requesting access + * @param uid The uid of the package + * @param pid The pid of the package + * @return boolean true or false if permissions is granted + */ + public static boolean canAccessCellLocation(@NonNull Context context, @NonNull String pkgName, + int uid, int pid) throws SecurityException { + Trace.beginSection("TelephonyLocationCheck"); + try { + // Always allow the phone process to access location. This avoid breaking legacy code + // that rely on public-facing APIs to access cell location, and it doesn't create a + // info leak risk because the cell location is stored in the phone process anyway. + if (uid == Process.PHONE_UID) { + return true; + } + + // We always require the location permission and also require the + // location mode to be on for non-legacy apps. Legacy apps are + // required to be in the foreground to at least mitigate the case + // where a legacy app the user is not using tracks their location. + // Granting ACCESS_FINE_LOCATION to an app automatically grants it + // ACCESS_COARSE_LOCATION. + + if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, pid, uid) == + PackageManager.PERMISSION_DENIED) { + return false; + } + final int opCode = AppOpsManager.permissionToOpCode( + Manifest.permission.ACCESS_COARSE_LOCATION); + if (opCode != AppOpsManager.OP_NONE && context.getSystemService(AppOpsManager.class) + .noteOpNoThrow(opCode, uid, pkgName) != AppOpsManager.MODE_ALLOWED) { + return false; + } + if (!isLocationModeEnabled(context, UserHandle.getUserId(uid)) + && !isLegacyForeground(context, pkgName, uid)) { + return false; + } + // If the user or profile is current, permission is granted. + // Otherwise, uid must have INTERACT_ACROSS_USERS_FULL permission. + return isCurrentProfile(context, uid) || checkInteractAcrossUsersFull(context); + } finally { + Trace.endSection(); + } + } + + private static boolean isLocationModeEnabled(@NonNull Context context, @UserIdInt int userId) { + int locationMode = Settings.Secure.getIntForUser(context.getContentResolver(), + Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF, userId); + return locationMode != Settings.Secure.LOCATION_MODE_OFF + && locationMode != Settings.Secure.LOCATION_MODE_SENSORS_ONLY; + } + + private static boolean isLegacyForeground(@NonNull Context context, @NonNull String pkgName, + int uid) { + long token = Binder.clearCallingIdentity(); + try { + return isLegacyVersion(context, pkgName) && isForegroundApp(context, uid); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private static boolean isLegacyVersion(@NonNull Context context, @NonNull String pkgName) { + try { + if (context.getPackageManager().getApplicationInfo(pkgName, 0) + .targetSdkVersion <= Build.VERSION_CODES.O) { + return true; + } + } catch (PackageManager.NameNotFoundException e) { + // In case of exception, assume known app (more strict checking) + // Note: This case will never happen since checkPackage is + // called to verify validity before checking app's version. + } + return false; + } + + private static boolean isForegroundApp(@NonNull Context context, int uid) { + final ActivityManager am = context.getSystemService(ActivityManager.class); + return am.getUidImportance(uid) <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE; + } + + private static boolean checkInteractAcrossUsersFull(@NonNull Context context) { + return context.checkCallingOrSelfPermission( + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) + == PackageManager.PERMISSION_GRANTED; + } + + private static boolean isCurrentProfile(@NonNull Context context, int uid) { + long token = Binder.clearCallingIdentity(); + try { + final int currentUser = ActivityManager.getCurrentUser(); + final int callingUserId = UserHandle.getUserId(uid); + if (callingUserId == currentUser) { + return true; + } else { + List<UserInfo> userProfiles = context.getSystemService( + UserManager.class).getProfiles(currentUser); + for (UserInfo user : userProfiles) { + if (user.id == callingUserId) { + return true; + } + } + } + return false; + } finally { + Binder.restoreCallingIdentity(token); + } + } +} diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java index 059a2d070ec3..da3d87bc7211 100644 --- a/telephony/java/android/telephony/MbmsDownloadSession.java +++ b/telephony/java/android/telephony/MbmsDownloadSession.java @@ -437,6 +437,7 @@ public class MbmsDownloadSession implements AutoCloseable { int result = downloadService.setTempFileRootDirectory(mSubscriptionId, filePath); if (result != MbmsErrors.SUCCESS) { sendErrorToApp(result, null); + return; } } catch (RemoteException e) { mService.set(null); @@ -686,30 +687,42 @@ public class MbmsDownloadSession implements AutoCloseable { } /** - * Gets information about the status of a file pending download. + * Requests information about the state of a file pending download. + * + * The state will be delivered as a callback via + * {@link DownloadStateCallback#onStateUpdated(DownloadRequest, FileInfo, int)}. If no such + * callback has been registered via + * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}, this + * method will be a no-op. * - * If there was a problem communicating with the middleware or if it has no records of the + * If the middleware has no record of the * file indicated by {@code fileInfo} being associated with {@code downloadRequest}, - * {@link #STATUS_UNKNOWN} will be returned. + * an {@link IllegalArgumentException} will be thrown. * * @param downloadRequest The download request to query. * @param fileInfo The particular file within the request to get information on. - * @return The status of the download. */ - @DownloadStatus - public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo) { + public void requestDownloadState(DownloadRequest downloadRequest, FileInfo fileInfo) { IMbmsDownloadService downloadService = mService.get(); if (downloadService == null) { throw new IllegalStateException("Middleware not yet bound"); } try { - return downloadService.getDownloadStatus(downloadRequest, fileInfo); + int result = downloadService.requestDownloadState(downloadRequest, fileInfo); + if (result != MbmsErrors.SUCCESS) { + if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_DOWNLOAD_REQUEST) { + throw new IllegalArgumentException("Unknown download request."); + } + if (result == MbmsErrors.DownloadErrors.ERROR_UNKNOWN_FILE_INFO) { + throw new IllegalArgumentException("Unknown file."); + } + sendErrorToApp(result, null); + } } catch (RemoteException e) { mService.set(null); sIsInitialized.set(false); sendErrorToApp(MbmsErrors.ERROR_MIDDLEWARE_LOST, null); - return STATUS_UNKNOWN; } } diff --git a/telephony/java/android/telephony/NetworkRegistrationState.java b/telephony/java/android/telephony/NetworkRegistrationState.java index 4f137bea69f7..bba779d0c175 100644 --- a/telephony/java/android/telephony/NetworkRegistrationState.java +++ b/telephony/java/android/telephony/NetworkRegistrationState.java @@ -298,9 +298,9 @@ public class NetworkRegistrationState implements Parcelable { && mEmergencyOnly == other.mEmergencyOnly && (mAvailableServices == other.mAvailableServices || Arrays.equals(mAvailableServices, other.mAvailableServices)) - && mCellIdentity == other.mCellIdentity - && mVoiceSpecificStates == other.mVoiceSpecificStates - && mDataSpecificStates == other.mDataSpecificStates; + && equals(mCellIdentity, other.mCellIdentity) + && equals(mVoiceSpecificStates, other.mVoiceSpecificStates) + && equals(mDataSpecificStates, other.mDataSpecificStates); } @Override @@ -329,4 +329,14 @@ public class NetworkRegistrationState implements Parcelable { return new NetworkRegistrationState[size]; } }; + + private static boolean equals(Object o1, Object o2) { + if (o1 == o2) { + return true; + } else if (o1 == null) { + return false; + } else { + return o1.equals(o2); + } + } } diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java index 94921de6829b..35682a74744e 100644 --- a/telephony/java/android/telephony/NetworkService.java +++ b/telephony/java/android/telephony/NetworkService.java @@ -28,6 +28,8 @@ import android.os.Message; import android.os.RemoteException; import android.util.SparseArray; +import com.android.internal.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.List; @@ -38,7 +40,7 @@ import java.util.List; * follow the following format: * ... * <service android:name=".xxxNetworkService" - * android:permission="android.permission.BIND_NETWORK_SERVICE" > + * android:permission="android.permission.BIND_TELEPHONY_NETWORK_SERVICE" > * <intent-filter> * <action android:name="android.telephony.NetworkService" /> * </intent-filter> @@ -68,7 +70,11 @@ public abstract class NetworkService extends Service { private final SparseArray<NetworkServiceProvider> mServiceMap = new SparseArray<>(); - private final INetworkServiceWrapper mBinder = new INetworkServiceWrapper(); + /** + * @hide + */ + @VisibleForTesting + public final INetworkServiceWrapper mBinder = new INetworkServiceWrapper(); /** * The abstract class of the actual network service implementation. The network service provider diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index ff6711632252..fadfc91bcdef 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -22,6 +22,7 @@ import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; import com.android.i18n.phonenumbers.ShortNumberInfo; +import android.annotation.IntDef; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -42,6 +43,8 @@ import android.util.SparseIntArray; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_IDP_STRING; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -49,8 +52,31 @@ import java.util.regex.Pattern; /** * Various utilities for dealing with phone number strings. */ -public class PhoneNumberUtils -{ +public class PhoneNumberUtils { + /** {@hide} */ + @IntDef(prefix = "BCD_EXTENDED_TYPE_", value = { + BCD_EXTENDED_TYPE_EF_ADN, + BCD_EXTENDED_TYPE_CALLED_PARTY, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface BcdExtendType {} + + /* + * The BCD extended type used to determine the extended char for the digit which is greater than + * 9. + * + * see TS 51.011 section 10.5.1 EF_ADN(Abbreviated dialling numbers) + */ + public static final int BCD_EXTENDED_TYPE_EF_ADN = 1; + + /* + * The BCD extended type used to determine the extended char for the digit which is greater than + * 9. + * + * see TS 24.008 section 10.5.4.7 Called party BCD number + */ + public static final int BCD_EXTENDED_TYPE_CALLED_PARTY = 2; + /* * Special characters * @@ -77,22 +103,6 @@ public class PhoneNumberUtils public static final int TOA_International = 0x91; public static final int TOA_Unknown = 0x81; - /* - * The BCD extended type used to determine the extended char for the digit which is greater than - * 9. - * - * see TS 51.011 section 10.5.1 EF_ADN(Abbreviated dialling numbers) - */ - public static final int BCD_EXTENDED_TYPE_EF_ADN = 1; - - /* - * The BCD extended type used to determine the extended char for the digit which is greater than - * 9. - * - * see TS 24.008 section 10.5.4.7 Called party BCD number - */ - public static final int BCD_EXTENDED_TYPE_CALLED_PARTY = 2; - static final String LOG_TAG = "PhoneNumberUtils"; private static final boolean DBG = false; @@ -844,7 +854,7 @@ public class PhoneNumberUtils * */ public static String calledPartyBCDToString( - byte[] bytes, int offset, int length, int bcdExtType) { + byte[] bytes, int offset, int length, @BcdExtendType int bcdExtType) { boolean prependPlus = false; StringBuilder ret = new StringBuilder(1 + length * 2); @@ -944,7 +954,8 @@ public class PhoneNumberUtils } private static void internalCalledPartyBCDFragmentToString( - StringBuilder sb, byte [] bytes, int offset, int length, int bcdExtType) { + StringBuilder sb, byte [] bytes, int offset, int length, + @BcdExtendType int bcdExtType) { for (int i = offset ; i < length + offset ; i++) { byte b; char c; @@ -999,7 +1010,7 @@ public class PhoneNumberUtils * TOA byte. For example: SIM ADN extension fields */ public static String calledPartyBCDFragmentToString( - byte[] bytes, int offset, int length, int bcdExtType) { + byte[] bytes, int offset, int length, @BcdExtendType int bcdExtType) { StringBuilder ret = new StringBuilder(length * 2); internalCalledPartyBCDFragmentToString(ret, bytes, offset, length, bcdExtType); return ret.toString(); @@ -1009,7 +1020,7 @@ public class PhoneNumberUtils * Returns the correspond character for given {@code b} based on {@code bcdExtType}, or 0 on * invalid code. */ - private static char bcdToChar(byte b, int bcdExtType) { + private static char bcdToChar(byte b, @BcdExtendType int bcdExtType) { if (b < 0xa) { return (char) ('0' + b); } @@ -1027,7 +1038,7 @@ public class PhoneNumberUtils return extended.charAt(b - 0xa); } - private static int charToBCD(char c, int bcdExtType) { + private static int charToBCD(char c, @BcdExtendType int bcdExtType) { if ('0' <= c && c <= '9') { return c - '0'; } @@ -1134,7 +1145,7 @@ public class PhoneNumberUtils * * @return BCD byte array */ - public static byte[] numberToCalledPartyBCD(String number, int bcdExtType) { + public static byte[] numberToCalledPartyBCD(String number, @BcdExtendType int bcdExtType) { return numberToCalledPartyBCDHelper(number, false, bcdExtType); } @@ -1143,7 +1154,7 @@ public class PhoneNumberUtils * the return array. */ private static byte[] numberToCalledPartyBCDHelper( - String number, boolean includeLength, int bcdExtType) { + String number, boolean includeLength, @BcdExtendType int bcdExtType) { int numberLenReal = number.length(); int numberLenEffective = numberLenReal; boolean hasPlus = number.indexOf('+') != -1; diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 1176491907ce..cb867abb74d4 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -94,47 +94,6 @@ public class ServiceState implements Parcelable { */ public static final int DUPLEX_MODE_TDD = 2; - /** - * RIL level registration state values from ril.h - * ((const char **)response)[0] is registration state 0-6, - * 0 - Not registered, MT is not currently searching - * a new operator to register - * 1 - Registered, home network - * 2 - Not registered, but MT is currently searching - * a new operator to register - * 3 - Registration denied - * 4 - Unknown - * 5 - Registered, roaming - * 10 - Same as 0, but indicates that emergency calls - * are enabled. - * 12 - Same as 2, but indicates that emergency calls - * are enabled. - * 13 - Same as 3, but indicates that emergency calls - * are enabled. - * 14 - Same as 4, but indicates that emergency calls - * are enabled. - * @hide - */ - public static final int RIL_REG_STATE_NOT_REG = 0; - /** @hide */ - public static final int RIL_REG_STATE_HOME = 1; - /** @hide */ - public static final int RIL_REG_STATE_SEARCHING = 2; - /** @hide */ - public static final int RIL_REG_STATE_DENIED = 3; - /** @hide */ - public static final int RIL_REG_STATE_UNKNOWN = 4; - /** @hide */ - public static final int RIL_REG_STATE_ROAMING = 5; - /** @hide */ - public static final int RIL_REG_STATE_NOT_REG_EMERGENCY_CALL_ENABLED = 10; - /** @hide */ - public static final int RIL_REG_STATE_SEARCHING_EMERGENCY_CALL_ENABLED = 12; - /** @hide */ - public static final int RIL_REG_STATE_DENIED_EMERGENCY_CALL_ENABLED = 13; - /** @hide */ - public static final int RIL_REG_STATE_UNKNOWN_EMERGENCY_CALL_ENABLED = 14; - /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "RIL_RADIO_TECHNOLOGY_" }, @@ -233,22 +192,6 @@ public class ServiceState implements Parcelable { | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_B - 1)) | (1 << (RIL_RADIO_TECHNOLOGY_EHRPD - 1)); - /** - * Available registration states for GSM, UMTS and CDMA. - */ - /** @hide */ - public static final int REGISTRATION_STATE_NOT_REGISTERED_AND_NOT_SEARCHING = 0; - /** @hide */ - public static final int REGISTRATION_STATE_HOME_NETWORK = 1; - /** @hide */ - public static final int REGISTRATION_STATE_NOT_REGISTERED_AND_SEARCHING = 2; - /** @hide */ - public static final int REGISTRATION_STATE_REGISTRATION_DENIED = 3; - /** @hide */ - public static final int REGISTRATION_STATE_UNKNOWN = 4; - /** @hide */ - public static final int REGISTRATION_STATE_ROAMING = 5; - private int mVoiceRegState = STATE_OUT_OF_SERVICE; private int mDataRegState = STATE_OUT_OF_SERVICE; @@ -1373,6 +1316,51 @@ public class ServiceState implements Parcelable { } /** @hide */ + public static int networkTypeToRilRadioTechnology(int networkType) { + switch(networkType) { + case TelephonyManager.NETWORK_TYPE_GPRS: + return ServiceState.RIL_RADIO_TECHNOLOGY_GPRS; + case TelephonyManager.NETWORK_TYPE_EDGE: + return ServiceState.RIL_RADIO_TECHNOLOGY_EDGE; + case TelephonyManager.NETWORK_TYPE_UMTS: + return ServiceState.RIL_RADIO_TECHNOLOGY_UMTS; + case TelephonyManager.NETWORK_TYPE_HSDPA: + return ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA; + case TelephonyManager.NETWORK_TYPE_HSUPA: + return ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA; + case TelephonyManager.NETWORK_TYPE_HSPA: + return ServiceState.RIL_RADIO_TECHNOLOGY_HSPA; + case TelephonyManager.NETWORK_TYPE_CDMA: + return ServiceState.RIL_RADIO_TECHNOLOGY_IS95A; + case TelephonyManager.NETWORK_TYPE_1xRTT: + return ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT; + case TelephonyManager.NETWORK_TYPE_EVDO_0: + return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0; + case TelephonyManager.NETWORK_TYPE_EVDO_A: + return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A; + case TelephonyManager.NETWORK_TYPE_EVDO_B: + return ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B; + case TelephonyManager.NETWORK_TYPE_EHRPD: + return ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD; + case TelephonyManager.NETWORK_TYPE_LTE: + return ServiceState.RIL_RADIO_TECHNOLOGY_LTE; + case TelephonyManager.NETWORK_TYPE_HSPAP: + return ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP; + case TelephonyManager.NETWORK_TYPE_GSM: + return ServiceState.RIL_RADIO_TECHNOLOGY_GSM; + case TelephonyManager.NETWORK_TYPE_TD_SCDMA: + return ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA; + case TelephonyManager.NETWORK_TYPE_IWLAN: + return ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN; + case TelephonyManager.NETWORK_TYPE_LTE_CA: + return ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA; + default: + return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; + } + } + + + /** @hide */ public int getDataNetworkType() { return rilRadioTechnologyToNetworkType(mRilDataRadioTechnology); } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index debf43da79b4..34f2dac028c7 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -612,9 +612,9 @@ public class SubscriptionManager { * onSubscriptionsChanged overridden. */ public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) { - String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>"; + String pkgName = mContext != null ? mContext.getOpPackageName() : "<unknown>"; if (DBG) { - logd("register OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug + logd("register OnSubscriptionsChangedListener pkgName=" + pkgName + " listener=" + listener); } try { @@ -623,7 +623,7 @@ public class SubscriptionManager { ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( "telephony.registry")); if (tr != null) { - tr.addOnSubscriptionsChangedListener(pkgForDebug, listener.callback); + tr.addOnSubscriptionsChangedListener(pkgName, listener.callback); } } catch (RemoteException ex) { // Should not happen diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java index 63e8c3b07fcb..e8c1cb11c0dd 100644 --- a/telephony/java/android/telephony/data/DataService.java +++ b/telephony/java/android/telephony/data/DataService.java @@ -34,6 +34,8 @@ import android.telephony.AccessNetworkConstants; import android.telephony.Rlog; import android.util.SparseArray; +import com.android.internal.annotations.VisibleForTesting; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -105,7 +107,9 @@ public abstract class DataService extends Service { private final SparseArray<DataServiceProvider> mServiceMap = new SparseArray<>(); - private final IBinder mBinder = new IDataServiceWrapper(); + /** @hide */ + @VisibleForTesting + public final IDataServiceWrapper mBinder = new IDataServiceWrapper(); /** * The abstract class of the actual data service implementation. The data service provider diff --git a/telephony/java/android/telephony/mbms/MbmsErrors.java b/telephony/java/android/telephony/mbms/MbmsErrors.java index af0af24c3619..75ca35e2342f 100644 --- a/telephony/java/android/telephony/mbms/MbmsErrors.java +++ b/telephony/java/android/telephony/mbms/MbmsErrors.java @@ -128,6 +128,9 @@ public class MbmsErrors { /** Indicates that the middleware has no record of the supplied {@link DownloadRequest}. */ public static final int ERROR_UNKNOWN_DOWNLOAD_REQUEST = 402; + + /** Indicates the the middleware has no record of the supplied {@link FileInfo} */ + public static final int ERROR_UNKNOWN_FILE_INFO = 403; } private MbmsErrors() {} diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl index cb93542ff168..7d9845ff46d2 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl @@ -46,7 +46,7 @@ interface IMbmsDownloadService int cancelDownload(in DownloadRequest downloadRequest); - int getDownloadStatus(in DownloadRequest downloadRequest, in FileInfo fileInfo); + int requestDownloadState(in DownloadRequest downloadRequest, in FileInfo fileInfo); int resetDownloadKnowledge(in DownloadRequest downloadRequest); diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index 4fee3df83c9a..86b1b7aff82c 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -370,18 +370,18 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { } /** - * Gets information about the status of a file pending download. + * Requests information about the state of a file pending download. * - * If the middleware has not yet been properly initialized or if it has no records of the + * If the middleware has no records of the * file indicated by {@code fileInfo} being associated with {@code downloadRequest}, - * {@link MbmsDownloadSession#STATUS_UNKNOWN} must be returned. + * {@link MbmsErrors.DownloadErrors#ERROR_UNKNOWN_FILE_INFO} must be returned. * * @param downloadRequest The download request to query. * @param fileInfo The particular file within the request to get information on. - * @return The status of the download. + * @return {@link MbmsErrors#SUCCESS} if the request was successful, an error code otherwise. */ @Override - public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo) + public int requestDownloadState(DownloadRequest downloadRequest, FileInfo fileInfo) throws RemoteException { return 0; } diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index 91032f342045..d999c13bb37f 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -108,6 +108,7 @@ public class DctConstants { public static final int EVENT_SET_CARRIER_DATA_ENABLED = BASE + 46; public static final int EVENT_DATA_RECONNECT = BASE + 47; public static final int EVENT_ROAMING_SETTING_CHANGE = BASE + 48; + public static final int EVENT_DATA_SERVICE_BINDING_CHANGED = BASE + 49; /***** Constants *****/ diff --git a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml index 71451101ac59..021e3861d882 100644 --- a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml +++ b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml @@ -14,12 +14,16 @@ limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.frameworks.perftests.amteststestapp"> + package="com.android.frameworks.perftests.amteststestapp"> <application android:name=".TestApplication"> <activity android:name=".TestActivity" android:exported="true"/> + <provider + android:authorities="com.android.frameworks.perftests.amteststestapp" + android:name=".TestContentProvider" + android:exported="true" /> <receiver - android:name=".TestBroadcastReceiver" - android:exported="true"> + android:name=".TestBroadcastReceiver" + android:exported="true"> <intent-filter> <action android:name="com.android.frameworks.perftests.ACTION_BROADCAST_MANIFEST_RECEIVE" /> <category android:name="android.intent.category.DEFAULT" /> diff --git a/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestContentProvider.java b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestContentProvider.java new file mode 100644 index 000000000000..0940578e4b28 --- /dev/null +++ b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestContentProvider.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2018 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.frameworks.perftests.amteststestapp; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +public class TestContentProvider extends ContentProvider { + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + return null; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public boolean onCreate() { + return false; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } +} diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java new file mode 100644 index 000000000000..3bf56ce8b085 --- /dev/null +++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ContentProviderPerfTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2018 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.frameworks.perftests.am.tests; + +import android.content.ContentProviderClient; +import android.support.test.filters.LargeTest; +import android.support.test.runner.AndroidJUnit4; + +import com.android.frameworks.perftests.am.util.TargetPackageUtils; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class ContentProviderPerfTest extends BasePerfTest { + /** + * Benchmark time to call ContentResolver.acquireContentProviderClient() when target package is + * running. + */ + @Test + public void contentProviderRunning() { + runPerfFunction(() -> { + startTargetPackage(); + + long startTimeNs = System.nanoTime(); + final ContentProviderClient contentProviderClient = + mContext.getContentResolver() + .acquireContentProviderClient(TargetPackageUtils.PACKAGE_NAME); + final long endTimeNs = System.nanoTime(); + + contentProviderClient.close(); + + return endTimeNs - startTimeNs; + }); + } + + /** + * Benchmark time to call ContentResolver.acquireContentProviderClient() when target package is + * not running. + */ + @Test + public void contentProviderNotRunning() { + runPerfFunction(() -> { + final long startTimeNs = System.nanoTime(); + final ContentProviderClient contentProviderClient = + mContext.getContentResolver().acquireContentProviderClient( + TargetPackageUtils.PACKAGE_NAME); + final long endTimeNs = System.nanoTime(); + + contentProviderClient.close(); + + return endTimeNs - startTimeNs; + }); + } +} diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java index 1443fc1ae3ee..063060f166dc 100644 --- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java +++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java @@ -83,7 +83,7 @@ public class AppLaunch extends InstrumentationTestCase { private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval"; private static final String WEARABLE_ACTION_GOOGLE = "com.google.android.wearable.action.GOOGLE"; - private static final int INITIAL_LAUNCH_IDLE_TIMEOUT = 60000; //60s to allow app to idle + private static final int INITIAL_LAUNCH_IDLE_TIMEOUT = 5000; //5s to allow app to idle private static final int POST_LAUNCH_IDLE_TIMEOUT = 750; //750ms idle for non initial launches private static final int BETWEEN_LAUNCH_SLEEP_TIMEOUT = 5000; //5s between launching apps private static final String LAUNCH_SUB_DIRECTORY = "launch_logs"; diff --git a/tests/net/OWNERS b/tests/net/OWNERS index 6f77e04da3c0..ce50558bf4f6 100644 --- a/tests/net/OWNERS +++ b/tests/net/OWNERS @@ -1,7 +1,6 @@ set noparent ek@google.com -hugobenichi@google.com jchalard@google.com lorenzo@google.com satk@google.com diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 8d1a00b09d94..7da2656761c1 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -16,6 +16,7 @@ package android.net.wifi; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.content.pm.PackageManager; import android.net.IpConfiguration; @@ -439,6 +440,7 @@ public class WifiConfiguration implements Parcelable { /** * @hide */ + @NonNull private IpConfiguration mIpConfiguration; /** @@ -2023,6 +2025,7 @@ public class WifiConfiguration implements Parcelable { /** @hide */ public void setIpConfiguration(IpConfiguration ipConfiguration) { + if (ipConfiguration == null) ipConfiguration = new IpConfiguration(); mIpConfiguration = ipConfiguration; } @@ -2306,7 +2309,7 @@ public class WifiConfiguration implements Parcelable { config.allowedGroupCiphers = readBitSet(in); config.enterpriseConfig = in.readParcelable(null); - config.mIpConfiguration = in.readParcelable(null); + config.setIpConfiguration(in.readParcelable(null)); config.dhcpServer = in.readString(); config.defaultGwMacAddress = in.readString(); config.selfAdded = in.readInt() != 0; |